Presentation is loading. Please wait.

Presentation is loading. Please wait.

第六章 擷取輸入裝置的訊息和事件 鍵盤、滑鼠,是我們最常使用的輸入工具。我們是不是常常希望可以再按下某個按鈕後就可以有哪些功能出現呢?沒錯,這就是這一章節的重點,在第四章,我們提到了有關鍵盤、滑鼠、以及RS-232介面的事件及訊息偵測,讓我們更能掌控電腦週邊的硬體。

Similar presentations


Presentation on theme: "第六章 擷取輸入裝置的訊息和事件 鍵盤、滑鼠,是我們最常使用的輸入工具。我們是不是常常希望可以再按下某個按鈕後就可以有哪些功能出現呢?沒錯,這就是這一章節的重點,在第四章,我們提到了有關鍵盤、滑鼠、以及RS-232介面的事件及訊息偵測,讓我們更能掌控電腦週邊的硬體。"— Presentation transcript:

1 第六章 擷取輸入裝置的訊息和事件 鍵盤、滑鼠,是我們最常使用的輸入工具。我們是不是常常希望可以再按下某個按鈕後就可以有哪些功能出現呢?沒錯,這就是這一章節的重點,在第四章,我們提到了有關鍵盤、滑鼠、以及RS-232介面的事件及訊息偵測,讓我們更能掌控電腦週邊的硬體。

2 大綱 6-1. 偵測鍵盤訊息 6-2. 偵測滑鼠訊息 6-3. 使用滑鼠拖放視窗 6-4. RS-232的I/O通訊 本章習題

3 6-1. 偵測鍵盤訊息 在很多情況下,我們會需要讓程式知道我們按下了哪些按鈕,有一些BCB的事件就是用在按鍵偵測上。
6-1. 偵測鍵盤訊息 在很多情況下,我們會需要讓程式知道我們按下了哪些按鈕,有一些BCB的事件就是用在按鍵偵測上。 例如OnKeyDown、OnKeyUp、OnKeyPress等,當你按下了按鈕時,OnKeyDown和OnKeyPress這兩個事件會被執行,當放開按鈕時,OnKeyUp將被執行。所以我們在BCB上想要偵測到鍵盤的訊息相當的容易,不需要像在DOS時代一樣的麻煩。 在這一小節,我們利用打磚塊這樣的小程式為背景來解釋偵測鍵盤訊息的做法。 範例6-1 ~ 6-3

4 6-1. 偵測鍵盤訊息 範例6-1:偵測鍵盤訊息 void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Key == 37) if (Shape1->Left > 0) Shape1->Left--; if (Key == 38) if (Shape1->Top > 0) Shape1->Top--; if (Key == 39) if ((Shape1->Left + Shape1->Width) < Form1->ClientWidth) Shape1->Left++; if (Key == 40) if ((Shape1->Top + Shape1->Height) < Form1->ClientHeight) Shape1->Top++; }

5 6-1. 偵測鍵盤訊息 範例6-2:偵測鍵盤Key值 void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { Label4->Caption = (int)Key; } void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key) { Label3->Caption = (int)Key; }

6 6-2. 偵測滑鼠訊息 偵測滑鼠的訊息跟偵測鍵盤的訊息其實原理上大同小異,也是利用BCB所提供的事件去偵測。
6-2. 偵測滑鼠訊息 偵測滑鼠的訊息跟偵測鍵盤的訊息其實原理上大同小異,也是利用BCB所提供的事件去偵測。 在這邊我們可以使用OnMouseMove這個事件來偵測目前的滑鼠動作,若是要偵測有沒有按下滑鼠的按鈕或是有沒有滾動滾輪,則可以使用以下這些事件: 事件 說明 OnClick 按一下滑鼠左鍵馬上放開所啟動的事件 OnDblClick 按兩下滑鼠左鍵馬上放開所啟動的事件 OnMouseDown 按下滑鼠的按鍵所啟動的事件 OnMouseMove 滑鼠移動所啟動的事件 OnMouseUp 放開滑鼠按鍵所啟動的事件 OnMouseWheel 轉動滑鼠滾輪所啟動的事件 OnMouseWheelDown 向下轉動滑鼠滾輪所啟動的事件 OnMouseWheelUp 向上轉動滑鼠滾輪所啟動的事件

7 6-2. 偵測滑鼠訊息 範例6-4:偵測滑鼠訊息 void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { LabeledEdit1->Text = X; //將滑鼠的 X 座標顯示出來 LabeledEdit2->Text = Y; //將滑鼠的 Y 座標顯示出來 } void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled) { Label3->Caption = "剛剛滑鼠滾輪向下轉"; } // void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, Label3->Caption = "剛剛滑鼠滾輪向上轉";

8 6-2. 偵測滑鼠訊息 範例6-4:偵測滑鼠訊息 void __fastcall TForm1::FormClick(TObject *Sender) { Label2->Visible = false; Label3->Caption = "剛剛您按了滑鼠一下"; } // void __fastcall TForm1::FormDblClick(TObject *Sender) { Label3->Caption = "剛剛您你按了滑鼠兩下"; void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (Button == mbRight) Label3->Caption = "剛剛您你按了滑鼠右鍵"; else if (Button == mbLeft) Label3->Caption = "剛剛您你按了滑鼠左鍵"; else Label3->Caption = "剛剛您你按了滑鼠中鍵"; void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Label2->Visible = true;

9 6-2. 偵測滑鼠訊息 範例6-4 執行結果

10 6-2. 偵測滑鼠訊息 範例6-5:改用滑鼠控制的範例6-1
6-2. 偵測滑鼠訊息 範例6-5:改用滑鼠控制的範例6-1 既然我們現在已經學會了該如何偵測滑鼠的動作,相信各位一定會讓範例6-1中的棒子用滑鼠來控制! 所以,我們將在範例程式6-5中加入滑鼠控制的部分,讓範例6-5除了可以利用方向鍵來控制那根棍子外,還可以使用滑鼠來控制。 程式設計成滾動滑鼠的滾輪可以控制棍子的上下移動,左鍵和右鍵可以控制棍子的左右移動。

11 6-2. 偵測滑鼠訊息 範例6-5:主要程式碼 void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (Button == mbRight) { if ((Shape1->Left + Shape1->Width) < Form1->ClientWidth) Shape1->Left++; } else if (Button == mbLeft) if (Shape1->Left > 0) Shape1->Left--; // void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled) { if ((Shape1->Top + Shape1->Height) < Form1->ClientHeight) Shape1->Top++; void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled) { if (Shape1->Top > 0) Shape1->Top--;

12 6-3. 使用滑鼠拖放視窗 在視窗環境中使用滑鼠,也常常見到一種功能,那就是『拉』。 什麼叫做用『拉』的呢?一般我們分成兩種動作:
6-3. 使用滑鼠拖放視窗 在視窗環境中使用滑鼠,也常常見到一種功能,那就是『拉』。 什麼叫做用『拉』的呢?一般我們分成兩種動作: 第一種是Drag-and-Dock方式呈現的視窗模式 第二種是Drag-and-Drop的應用。

13 6-3. 使用滑鼠拖放視窗 Drag-and-Dock
6-3. 使用滑鼠拖放視窗 Drag-and-Dock Drag-and-Dock就是像Word上方的快速按鈕或是主選單等,可以將一整個相同功能的『群組物件』一起獨立出來變成一個視窗,也可以依附在上一層的視窗中,這樣的功能就叫做Dock。如果各位還記得,我們在第四章的時候也曾經實作過Dock的功能。 在一般的Windows中有關Drag-and-Dock的屬性有底下這三種 屬性 功能 DockSite 要能提供讓其他元件Dock的元件(基座) DragKind 選擇是要提供Drag或是Dock的功能 DragMode 選擇手動模式或是自動模式

14 6-3. 使用滑鼠拖放視窗 Drag-and-Drop
6-3. 使用滑鼠拖放視窗 Drag-and-Drop Drag & Drop就是我們在複製檔案的時候,可以將檔案用『拉』的拉到另一個目錄去﹔或是在桌面上我們想要移動Icon的位置,我們也可以直接用『拉』的﹔或是我們在用CuteFTP或是WS-FTP時,也可以將遠端的檔案用『拉』的拉到我們的電腦上等等。以上這些動作就是我們這邊所謂的『拉』,就是Drag & Drop。 在一般的Windows中有關Drag-and-Drop的事件有以下這四種 事件 功能 OnDragDrop 如果DragKind是Drag時,當有一個正在Dragging的元件Drop在這個元件上會啟動的事件 OnDragOver 如果DragKind是Drag時,當有一個元件被Drag到一個元件上的時候會發生的事件 OnEndDrag 如果DragKind是Drag時,結束Draging時會啟動的事件。 OnStartDrag 如果DragKind是Drag時,開始Draging時會啟動的事件。

15 6-3. 使用滑鼠拖放視窗 範例6-8: Drag-and-Drop實作範例
6-3. 使用滑鼠拖放視窗 範例6-8: Drag-and-Drop實作範例 在範例6-8的實做過程中,首先我們先在畫面上放上三個Image元件,並且將這三個Image元件的AutoSize設定成True。做好圖片的放置之後,我們必須實做Form上面『OnDragDrop』和『OnDragOver』這兩個事件才能做到Drag & Drop的效果(因為我們要Drag的東西是在Form上面被Drop)。 最後還有一個最重要的設定,那就是想要被『Drag』的物件上有些屬性必須要被設定。 DragKind:『dkDrag』 DragMode: 『dmAutomatic』

16 6-3. 使用滑鼠拖放視窗 範例6-8: Drag-and-Drop實作範例(程式碼)
6-3. 使用滑鼠拖放視窗 範例6-8: Drag-and-Drop實作範例(程式碼) void __fastcall TForm1::FormDragDrop(TObject *Sender, TObject *Source, int X, int Y) { TImage *buf = (TImage *)Source; //將被拉的元件強制轉換成TImage buf->Left = X; //設定該元件新的位置 buf->Top = Y; //設定該元件新的位置 } // void __fastcall TForm1::FormDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) Accept = true;

17 6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例 執行結果

18 6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) 在程式碼部分,我們主要分成了三大部分
6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) 在程式碼部分,我們主要分成了三大部分 第一部分是關於新增一個字串的部分 第二部分則是關於採用箭頭來決定什麼是已選取什麼是未選取 最後一個部分就是使用Drag & Drop來操作所有的動作

19 6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) 新增字串之程式碼
6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) 新增字串之程式碼 void __fastcall TForm1::BitBtn1Click(TObject *Sender) { ListBox1->Items->Add(Edit1->Text); Edit1->Text = ""; } // void __fastcall TForm1::Edit1Change(TObject *Sender) if (Edit1->Text != "") BitBtn1->Enabled = true; else BitBtn1->Enabled = false;

20 6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) 移動字串之程式碼
6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) 移動字串之程式碼 void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { if (ListBox1->ItemIndex >= 0) { ListBox2->Items->Add(ListBox1->Items->Strings[ListBox1->ItemIndex]); ListBox1->Items->Delete(ListBox1->ItemIndex); } // void __fastcall TForm1::SpeedButton2Click(TObject *Sender) { if (ListBox2->ItemIndex >= 0) { ListBox1->Items->Add(ListBox2->Items->Strings[ListBox2->ItemIndex]); ListBox2->Items->Delete(ListBox2->ItemIndex);

21 6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) OnDragOver相關的程式碼
6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) OnDragOver相關的程式碼 void __fastcall TForm1::ListBox1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { if (Source == ListBox2) Accept = true; else Accept = false; } // void __fastcall TForm1::ListBox2DragOver(TObject *Sender, TObject *Source, if (Source == ListBox1) void __fastcall TForm1::Image1DragOver(TObject *Sender, TObject *Source,

22 6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) OnDragDrop相關的程式碼
6-3. 使用滑鼠拖放視窗 範例6-9:Drag & Drop進階範例(程式碼) OnDragDrop相關的程式碼 void __fastcall TForm1::ListBox1DragDrop(TObject *Sender, TObject *Source, int X, int Y) { TListBox *buf = (TListBox *)Source; ListBox1->Items->Add(buf->Items->Strings[buf->ItemIndex]); ListBox2->Items->Delete(buf->ItemIndex); } // void __fastcall TForm1::ListBox2DragDrop(TObject *Sender, TObject *Source, int X, int Y) { ListBox2->Items->Add(buf->Items->Strings[buf->ItemIndex]); ListBox1->Items->Delete(buf->ItemIndex); void __fastcall TForm1::Image1DragDrop(TObject *Sender, TObject *Source, int X, int Y) { if (Source == ListBox1) { buf->Items->Delete(buf->ItemIndex);

23 6-4. RS-232的I/O通訊 在電腦與RS-232的連線通訊上,一般來說並不多人會使用到,但是在這邊我們也將針對這個問題來說明。現在我們先節錄一段Help中提到的敘述: Direct hardware access in 32-bit Windows is generally not allowed. While it can be done in the Win9x OS by using inline assembly, this is generally discouraged as this technique is not supported under WinNT. When doing Serial and Com port communications, there are several options available. You can use a third party VCL component, or use the Win32 API CreateFile and the Win32 communications functions. For more information on this technique, refer to the Using the communications functions help topic in the Microsoft WinSDK help files. The hardware port communication family of functions, such as inportb, inpw, outportb and outpw are now deprecated and are no longer supported.

24 6-4. RS-232的I/O通訊 上面這段話說明了目前我們在連結RS-232(Serial Port)的方法。目前因為作業系統設計的關係,我們無法在32-bits的Windows系統上直接對Serial Port做通訊,在Win95/98我們還可以使用『inline assembly』來連結Serial Port,但是在Win NT/2000的環境下就行不通了。 那我們該怎麼在BCB的環境中和Serial Port通訊呢?在這邊提供了兩種方法: 使用別人已經開發好的VCL元件。 另一種則是使用Win32 API。在BCB的說明文件上也有提供Win SDK的使用說明。

25 本章習題 請寫出打磚塊的程式,除了可以用鍵盤移動外,也可以使用滑鼠移動。 試著利用Win32 API嘗試與RS-232連線。
請解釋什麼是Drag,什麼是Drop。 將範例程式6-9改成可以一次『拉』多個、『移動』多個。


Download ppt "第六章 擷取輸入裝置的訊息和事件 鍵盤、滑鼠,是我們最常使用的輸入工具。我們是不是常常希望可以再按下某個按鈕後就可以有哪些功能出現呢?沒錯,這就是這一章節的重點,在第四章,我們提到了有關鍵盤、滑鼠、以及RS-232介面的事件及訊息偵測,讓我們更能掌控電腦週邊的硬體。"

Similar presentations


Ads by Google