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

Slides:



Advertisements
Similar presentations
人機介面 Arduino 簡介 授課教師 開課單位. Arduino 簡介 Arduino 是一塊 Open source 的 Simple i/o 介面板,並 且具有使用類似 java, C 語言的開發環境。 可以快速使用 Arduino 語言 ( 基於 wiring) 與 Flash 或 Processing…
Advertisements

第七章 常用控件 7.1 控件概述 7.2 常用内部控件 本章要求 返回目录 第七章 常用控件 (Common Control)
第二章 VB的编程机制 【授课时间】第3周,第2次课 【授课题目】 2.1 面向对象程序设计概述 2.2 VB中的对象
計算機程式及實習 期末報告 題目:商店結帳系統
病毒及防范.
第三章 以Borland C++ Builder開發 視窗介面為基之I/O控制技術
第 9 章 表单控件的使用 本章提要:VFP表单控件工具栏上的21个基类控件及表单集,它们的常用属性、方法、事件及主要功能等。为叙述的方便,将VFP的基类控件及表单集按主要功能分为五类: 1.输出类:标签、图像、线条、形状。 2.输入类:文本框、编辑框、微调控件、列表框、组合框。 3.控制类:命令按钮、命令按钮组、复选框、选项按钮组、计时器。
Word2010典型应用_003 长文档Word技巧.
正修科技大學典範人物專訪 寫作徵文比賽實施要點
AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤.
1.了解VB6.0的功能特点 、集成环境。 2.理解面向对象程序设计的几个概念。 3.掌握VB应用程序设计的步骤。
乙檢直通車 推廣小組:台科大圖書 報告人:孫婉倩.
计算机高级程序设计 第五章.
《网页设计与制作》 教学课件 主讲人:湖南铁道职业技术学院 陈承欢
第5章 窗体和控件 5.1 窗体概述 5.2 使用向导创建窗体 5.3 向窗体添加控件 5.4 窗体的再设计 5.5 利用窗体操作数据
VB教学中游戏化教学案例设计.
网 络 课 程 马 鞍 学 网 络 山 课 程 大 络 网 Visual Basic程序设计 第 一 讲 最容易接受的编程语言
《计算机网络技术》 asp.net 程序设计 文本类控件 笪静.
网页制作 第五讲 Dreamweaver基础.
第二十三章 InterNet網路程式設計 有沒有想過自己寫個Service呢?想不想自己也寫一套發信程式呢?在這一章節裡,我們將介紹socket的觀念以及BCB在Internet上開發應用程式的方法。
程式簡介、VB、物件導向 國立北門高中 林明璋.
第十章 進階輸出入元件(一) StringGrid 10-1 核對框(CheckBox)
第二十八章 開發新的VCL元件 雖然BCB內提供了很多VCL元件,但是一定還有一些我們常常需要用的介面並沒有製作成VCL元件,或是一些個人化的介面,我們也有需要做成VCL元件。在第十三章,我們將介紹如何自行開發新的VCL元件。
進階輸出入元件(一) 本書第三章已介紹Form 、Label 、Edit 及Button 等最基本的輸出入元件, 本章將繼續介紹一些可以提昇輸出入視覺效果的元件, 例如CheckBox 、RadioButton 及RadioGroup 等17 個進階元件, 學習本章將可提昇使用介面的親和性。 核對框(CheckBox)
Ch02 視窗Swing套件 物件導向系統實務.
課程名稱:程式設計 授課老師:________
Chapter 1 複習.
第15章 行为 Dreamweaver CS4提供了丰富的行为,这些行为的使 用可以为网页对象添加一些动态效果和简单的交互功 能,使那些不熟悉JavaScript语言的网页设计师也可 以方便的设计出通过编写JavaScript语言才能实现的 功能。本章将首先介绍一些基本概念,以及“行为” 面板的基本操作;接着结合实例具体讲解常用的.
第16章 行為指令的應用 16-1 認識行為面板 16-2 常用的行為指令.
第7章 层与行为.
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
第二十九章 DLL / LIB函式庫開發 當我們開發程式到一個階段之後,我們一定會希望各個Component的程式碼可以分開的越清楚越好。而這一章最主要就是要告訴各位讀者,我們常在Windows系統中看到的dll或是lib的檔案該怎麼實作?做出這樣的library我們又該如何運用?為什麼使用dll或是lib有利於我們開發程式?以上這些疑問都將會在這一章中得到解答。
第13章 WinForms基础知识.
基础综合 C++ Builder 显示与输入接口
Java and LEGO Robots 齐琨(Kun Qi) GC Senior Sales Consultant
页眉 基础综合 C++ Builder 按钮组件
第二十三章 元件的製作 23-1 類別轉為元件 23-2 繼承可視元件 23-3 複合式元件.
第18章 B4J的跨平台應用程式開發 18-1 B4J的GUI設計工具與介面控制項 18-2 使用B4J的介面控制項
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第十一讲 VB常用标准控件(2).
Visual Basic程序设计基础 计算机科学学院.
C 語言簡介 - 2.
2018/12/6 中文Word2000的使用方法.
第五章 Windows窗体界面设计 5.1 鼠标事件与键盘事件 5.2 Windows窗体基本控件 5.3 菜单与工具栏
第十二章 事件 12-1 KeyPress 12-2 KeyDown及KeyUp
移动电子商务 第十二章 Windows Mobile应用案例 倚动软件工厂实验室.
MFC WinSock类的编程 为简化套接字网络编程,更方便地利用Windows的消息驱动机制,微软的基础类库(Microsoft Foundation Class Libary,简称MFC),提供了两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows.
form1 卡拉OK pictureBox1 fish1.bmp pictureBox2 fish2.bmp label1 卡拉OK字幕機
程式設計 Visual Basic簡介 週次:1 建國技術學院 資管系 饒瑞佶 2003年9月17日.
第十二章 Win32環境程式設計 這一章節可以說是本書精華之一,Win32程式設計算是比較複雜的部分,但是我們以最簡單的敘述帶領著大家進入Win32程式設計的殿堂,讓你寫出來的程式具有一定的水準以上。若能將本章與下一章的技巧靈活運用,更能讓大家寫出高階的視窗程式。
多媒體概論報告-BMP 組員名稱: 盧彥良-資料蒐集 周誠哲-資料蒐集
第二章 创建用户界面 本章重点和难点 2.1 基本属性 2.2 创建窗体 2.3 Visual Basic的常用控件 2.4 制作菜单.
应用篇 Word 2000 应用技术 作业 Office 2000 基础 字处理基础知识 文档编辑 表格的制作与编排 绘图和图形处理技术
簡易 Visual Studio 2005 C++ 使用手冊
講師:戴志華 國立台灣大學電機工程研究所 Visual Basic 程式設計 講師:戴志華 國立台灣大學電機工程研究所.
P2P聊天工具.
Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API)
教 材 介 紹 靈活組合 愉快學習.
Visual Basic 程序设计及应用教程 (6.0版)
计算机应用基础 潍坊学院 计算机工程学院 主讲人:丁素英.
订单汇总单功能详解 -芜花.
铂安智防务科技有限公司 辅助驾驶设备 2017.
#include <iostream.h>
实验三 键盘软加锁实验 2019/5/9.
程式設計 Visual Basic簡介 週次:4 建國技術學院 資管系 饒瑞佶 2003年11月1日.
MDI介面建置 建國科技大學 資管系 饒瑞佶.
第三章 軟體資源管理 授課老師:褚麗絹.
判斷(選擇性敘述) if if else else if 條件運算子.
Presentation transcript:

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

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

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

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++; }

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

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 = "剛剛滑鼠滾輪向上轉";

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;

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

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

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--;

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

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 選擇手動模式或是自動模式

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時會啟動的事件。

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』

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;

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

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

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;

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);

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,

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);

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.

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的使用說明。

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