Win-API-03 串口读写

Win-API-03 串口读写

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

Win-API -02 获取窗口句柄

Win-API -02 获取窗口句柄

在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口最小化等等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等

Win-API -1 文件相关

Win-API -1 文件相关

在Windows系统中,创建和打开文件都是使用API函数CreateFile,CreateFile通过指定不同的参数来表示是新建一个文件,打开已经存在的文件,还是重新建立文件等。读写文件最为直接的方式是使用ReadFile和WriteFile函数,也可以使用文件镜像,获取文件大小一般使用GetFileSize函数,也可以使用GetFileAttributesEx等函数(在上节介绍)。读写文件、获取文件大小之前都需要使用CreateFile创建或打开的文件,获得文件句柄。 在文件操作中,文件句柄是一个关键的概念。文件句柄惟一标识了一个文件,ReadFile、WriteFile、GetFileSize等函数是使用文件句柄作为参数来表示,用户需要读、写、获取大小的文件是哪一个文件。在对文件进行操作前,都必须要使用CreateFile获得文件句柄。

Windows API学习-单选按钮、复选框、分组框控件(1)

Windows API学习-单选按钮、复选框、分组框控件(1)

单选按钮(Radio Button)和复选框(Check Box)是常见的Windows控件,用于从给出的选项中选择一项或多项 单选按钮是互斥的,只能选择其中一项;而复选框没有限制,可以选择一项或多项。 单选按钮和复选框都是一种特殊的按钮,窗口类名称都是button,只不过增加了一些特殊的窗口样式罢了。单选按钮的样式为BS_AUTORADIOBUTTON,复选框的样式为BS_AUTOCHECKBOX。要想为单选按钮分组,可以增加WS_GROUP样式。设置了 WS_GROUP 样式的单选框为一组中的首元素,随后的所有单选按钮都和它在同一组,直到下一个设置了 WS_GROUP 样式的单选按钮。 下面的代码,将实现上图中所示的单选按钮和复选框: //窗口过程 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; static HFONT hFont; //逻辑字体 //一组单选按钮 static HWND labSex; //静态文本框--性别 static HWND radioMale; //单选按钮--男 static HWND radioFemale; //单选按钮--女 //一组单选按钮 static HWND labMarriage; //静态文本框--婚姻状况 static HWND radioMarried; //单选按钮--已婚 static HWND radioSingle; //单选按钮--未婚 static HWND radioSecrecy; //单选按钮--保密 //一组复选框 static HWND labPet; //静态文本框--你的宠物 static HWND checkboxDog; //复选框--狗 static HWND checkboxCat; //复选框--猫 static HWND checkboxFish; //复选框--鱼 static HWND checkboxOther; //复选框--其他 switch (message){ case WM_CREATE: hFont = CreateFont( -14, -7, 0, 0, 400, FALSE, FALSE, FALSE,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微软雅黑")···

Windows API学习-修改控件背景文字颜色(3)

Windows API学习-修改控件背景文字颜色(3)

透明背景 实现透明背景需要设置文本背景颜色透明,同时返回没有颜色的画刷。 1) SetBkMode 函数可以用来设置文本的背景模式,它的原型为: int SetBkMode( HDC hdc, //设备环境句柄 int iBkMode //背景模式 ); iBkMode 有下面两种取值: 取值 说明 OPAQUE 使用当前背景颜色来填充背景。 TRANSPARENT 背景透明。 2) GetStockObject (NULL_BRUSH); 语句可以返回没有颜色的画刷。 示例代码: case WM_CTLCOLORSTATIC: hdcStatic = (HDC)wParam; SetTextColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠绿色 SetBkMode(hdcStatic, TRANSPARENT); //透明背景 return (INT_PTR)GetStockObject(NULL_BRUSH); //无颜色画刷 运行效果:

Windows API学习-修改控件背景文字颜色(2)

Windows API学习-修改控件背景文字颜色(2)

修改文字背景颜色 上节中,我们的代码只是改变了控件的背景颜色(整个子窗口的背景颜色),却忽略了文字的背景颜色。 修改文字背景颜色使用 SetBkColor 函数,它的原型为: COLORREF SetBkColor( HDC hdc, //设备环境句柄 COLORREF crColor //背景颜色 ); 修改文字前景色(文字颜色)使用 SetTextColor 函数,它的原型为: COLORREF SetTextColor( HDC hdc, //设备环境句柄 COLORREF crColor //背景颜色 ); 这里我们修改的是 static 控件中的文本颜色,所以需要获取 static 控件的设备环境句柄。非常巧妙的是,发送 WM_CTLCOLORSTATIC 消息时,wParam 参数表示的就是 static 控件的设备环境句柄(lParam 表示控件句柄)。 下面的代码会修改文本的背景色和前景色: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdcWnd; HDC hdcStatic; static HFONT hFont; //逻辑字体 static HWND hStatic; //静态文本框控件 static HBRUSH hBrush; //画刷 switch (message) { case WM_CREATE: //创建画刷 hBrush = CreateSolidBrush(RGB(0x41, 0x96, 0x4F)); //创建逻辑字体 hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 700 /*700表示粗体*/, FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微软雅黑") ); //创建静态文本框控件 hStatic =···

Windows API学习-修改控件背景文字颜色(1)

Windows API学习-修改控件背景文字颜色(1)

当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。 也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。 改变 static 控件的背景颜色: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdcWnd; static HFONT hFont; //逻辑字体 static HWND hStatic; //静态文本框控件 static HBRUSH hBrush; //画刷 switch (message){ case WM_CREATE: //创建画刷 hBrush = CreateSolidBrush( RGB(0x41, 0x96, 0x4F) ); //翠绿色 //创建逻辑字体 hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 400 /*400表示正常字体*/, FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微软雅黑") ); //创建静态文本框控件 hStatic = CreateWindow(TEXT("static"), TEXT("欢迎来到泛容!"), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER, 20 /*x坐标*/, 20 /*y坐标*/, 240 /*宽度*/, 60 /*高度*/, hWnd /*父窗口句柄*/, (HMENU)1 /*控件ID*/,···

Windows API学习-编辑框控件(2)

Windows API学习-编辑框控件(2)

获取编辑框控件文本 之前我们介绍了 getWindowText 函数,它可以用来获取控件的文本。 下面的例子演示用户点击登录按钮时,如何获取用户的输入内容: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static HFONT hFont; //逻辑字体 static HWND hLabUsername; //静态文本框--用户名 static HWND hLabPassword; //静态文本框--密码 static HWND hEditUsername; //单行文本输入框 static HWND hEditPassword; //密码输入框 static HWND hBtnLogin; //登录按钮 //定义缓冲区 TCHAR szUsername[100]; TCHAR szPassword[100]; TCHAR szUserInfo[200]; switch (message){ case WM_CREATE: //创建逻辑字体 hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 400 /*一般这个值设为400*/, FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微软雅黑") ); //创建静态文本框控件--用户名 hLabUsername = CreateWindow(TEXT("static"), TEXT("用户名:"), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE /*垂直居中*/ | SS_RIGHT /*水平居右*/, 0 /*x坐标*/, 20 /*y坐标*/, 70 /*宽度*/, 26 /*高度*/, hWnd /*父窗口句柄*/, (HMENU)1···

Windows API学习-编辑框控件(1)

Windows API学习-编辑框控件(1)

创建编辑框控件 在C语言控制台程序(Console Application)中,可以使用 scanf 函数获取用户的输入,而在Windows程序中使用编辑框控件 编辑框控件的窗口类名是edit。除了子窗口常用的风格 WS_CHILD、WS_VISIBLE、WS_BORDER 外,edit 控件也有自己的风格,都是以ES开头。 风格 说明 ES_AUTOHSCROLL 当输入文字超出横向显示范围时自动滚动(一般必选)。 ES_AUTOVSCROLL 当输入文字超出纵向显示范围时自动滚动。 ES_CENTER 文本居中对齐。 ES_LEFT 文本左对齐(默认)。 ES_RIGHT 文本右对齐。 ES_MULTILINE 是否允许多行输入。 ES_PASSWORD 是否为密码输入框,如果指明该风格则输入的文字显示为“***”。 ES_READONLY 是否为只读。禁止用户输入或修改编辑控件中的文本。 ES_UPPERCASE 显示大写字符。 ES_LOWERCASE 显示小写字符。 ES_LOWERCASE 将用户输入到编辑控件的字符全部转换为小写。 ES_UPPERCASE 将用户输入到编辑控件的字符全部转换为大写。 ES_MULTILINE 指明了一个多行编辑控件(缺省的是单行的)。 1) 如果指定了ES_AUTOVSCROLL风格,编辑控件将显示尽可能多的文本,并且当用户按下ENTER键时会自动地垂直滚动文本。 2) 如果没有指定ES_AUTOVSCROLL风格,则编辑控件将显示尽可能多的行,如果在按下ENTER键却没有更多的行要显示的话,就发出蜂鸣声。 3) 如果指定了ES_AUTOHSCROLL风格,当光标到达控件的右边时,多行编辑控件会自动地水平滚动文本。如果要开始一个新行,用户必须按下ENTER键。 4) 如果没有指定ES_AUTOHSCROLL风格,控件会在有必要时自动将单词折合到下一行的开始。如果按下ENTER键,则另起一行。折回单词的位置是由窗口的大小决定的。如果窗口的大小发生改变,折回单词的位置也会反生改变,将会重新显示文本。 【示例】C语言中文本登录框演示: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; static HFONT hFont; //逻辑字体 static HWND hLabUsername; //静态文本框--用户名 static HWND hLabPassword; //静态文本框--密码 static HWND hEditUsername; //单行文本输入框 static HWND hEditPassword; //密码输入框 static HWND hBtnLogin; //登录按钮 switch (message){ case WM_CREATE: //创建逻辑字体 hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 400 /*一般这个值设为400*/, FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET,···

Windows API学习-MSG结构体和窗口过程详解(2)

Windows API学习-MSG结构体和窗口过程详解(2)

窗口过程一般定义为如下的形式: LRESULT CALLBACK WndProc( HWND hwnd, //窗口句柄 UINT message, //消息类型 WPARAM wParam, //附加消息1 LPARAM lParam //附加消息2 ){ // TODO } WndProc 的各个参数和 MSG 结构体的前四个字段是一一对应的。需要铭记的是:每产生一条消息,都会调用一次 WndProc 函数。 当用户点击按钮、编辑框、下拉列表框等控件的时候,会产生WM_COMMAND消息。对于不同来源的 WM_COMMAND 消息,wParam、lParam 参数也不同,见下表: 消息来源 wParam (高16位) wParam (低16位) lParam 菜单 0 菜单ID 0 快捷键 1 快捷键ID 0 控件 控件通知码 控件ID 控件句柄 注意: 上面说的菜单是指窗口标题下方、客户区上方的下拉菜单,而不是客户区的下拉列表框控件。 控件通知码用来识别控件的操作。例如 Button 控件一般有两种通知码,BN_CLICKED 和 BN_DOUBLECLICKED,前者表示 Button 被单击,后者表示 Button 被双击。 对于 Button 控件,我们可以通过LOWORD(wParam)来获取它的 ID,这就是上节最后一个例子的原理,请参考上节的代码体会。

Windows API学习-MSG结构体和窗口过程详解(1)

Windows API学习-MSG结构体和窗口过程详解(1)

MSG结构体和WndProc窗口过程对于Windows编程非常重要,如果不了解它们,可以说就没有学会Windows编程。 MSG结构体 MSG 结构体用来表示一条消息,各个字段的含义如下: typedef struct tagMSG{ HWND hwnd; //窗口句柄 UINT message; //消息类型 WPARAM wParam; //附加消息1 LPARAM lParam; //附加消息2 DWORD time; //消息被传递时候的时间 POINT pt; //消息被传递时光标在屏幕上的位置 } MSG; 对各个字段的说明: 1) 最后两个字段 time 和 pt 一般由系统使用,我们很少用到。 2) message 为消息类型,也就是以 WM 开头的消息(WM 是 Window Message 的缩写 ),例如 WM_CREATE、WM_PAINT、WM_DESTROY、WM_COMMAND 等。 2) wParam 和 lParam 是要重点说明的,它们都表示附加消息。例如,当收到一个字符消息的时,message 的值为 WM_CHAR,但用户到底输入的是什么字符,那么就由 wParam 和 lParam 来说明。wParam、lParam 表示的信息随消息类型的不同而不同,具体细节可以到MSDN中查看。 WPARAM 和 LPARAM 这两种数据类型的定义分别为: typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; 在现代操作系统中(32位和64位操作系统),它们一般都表示 32 位的整数。 但在16位操作系统中,WPARAM 表示16位整数,而 LPARAM 表示32位整数,根据匈牙利命名法,16 位的变量通常以W开头,32 位变量通常以L开头。升级到32位操作系统后,WPARAM也被扩展到32位,此时 WPARAM 和 LPARAM 的大小完全相同。 在 Win32 API 的早期,由于还有很多 Win16 API 的软件,为了保证和 Win16 API 的代码可移植性,微软依然保留了 WPARAM 和 LPARAM 两个宏。 不过16位系统早已成为历史,现在你可以认为这两个参数的长度相同。读者可以在 VC / VS 中通过···

Windows API学习-按钮控件(2)

Windows API学习-按钮控件(2)

捕获按钮点击事件 当用户点击按钮、菜单、下拉列表框等控件的时候,会产生WM_COMMAND消息。WM_COMMAND 消息会附带控件 ID。 我们来回顾一下 CreateWindow 的第9个参数HEMU hMenu,对于每一个控件它的值都是唯一的,在按钮控件中,我们需要根据它来识别到底是哪个按钮被点击了。 按钮控件示例: LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){ int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static HFONT hFont; static HWND hBtn; static HWND hStatic; switch (message){ case WM_CREATE: //创建逻辑字体 hFont = CreateFont( -15/*高度*/, -7.5/*宽度*/, 0, 0, 400 /*一般这个值设为400*/, FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/, DEFAULT_CHARSET, //使用默认字符集 OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管 DEFAULT_QUALITY, //默认输出质量 FF_DONTCARE, //不指定字体族*/ TEXT("微软雅黑") //字体名 ); //创建静态文本控件 hStatic = CreateWindow( TEXT("static"), //静态文本框的类名 TEXT("欢迎来到泛容"), //控件的文本 WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/, 30 /*X坐标*/, 20/*Y坐标*/, 150/*宽度*/, 80/*高度*/, hWnd/*父窗口句柄*/, (HMENU)1, //为控件指定一个唯一标识符 hInst, //当前实例句柄 NULL ); //创建按钮控件 hBtn = CreateWindow( TEXT("button"), //按钮控件的类名···

Windows API学习-按钮控件

Windows API学习-按钮控件

样式 说明 BS_LEFT 文本居左。 BS_RIGHT 文本居右。 BS_CENTER 文本水平居中(默认为 BS_CENTER)。 BS_BOTTOM 文本位于按钮底部。 BS_TOP 文本位于按钮顶部。 BS_VCENTER 文本垂直居中(默认为 BS_VCENTER)。 BS_FLAT 扁平样式。默认情况下按钮具有3D阴影效果。 BS_MULTILINE 允许显示多行文本。也就是说当文本过长时会自动换行。 按钮控件示例: //窗口过程 LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){ int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static HFONT hFont; static HWND hBtn; switch (message){ case WM_CREATE: //创建逻辑字体 hFont = CreateFont( -15/*高度*/, -7.5/*宽度*/, 0, 0, 400 /*一般这个值设为400*/, FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/, DEFAULT_CHARSET, //使用默认字符集 OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管 DEFAULT_QUALITY, //默认输出质量 FF_DONTCARE, //不指定字体族*/ TEXT("微软雅黑") //字体名 ); //创建按钮控件 hBtn = CreateWindow( TEXT("button"), //按钮控件的类名 TEXT("这是按钮"), WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/, 30 /*X坐标*/, 20 /*Y坐标*/, 150 /*宽度*/, 50/*高度*/, hWnd, (HMENU)2 /*控件唯一标识符*/,···

Windows API学习-创建自己的字体

Windows API学习-创建自己的字体

前面无论是使用文本输出函数还是 static 控件,字体都是默认的,比较丑陋,我们完全可以自己创建更加炫酷的字体。 创建字体使用 CreateFont 函数,它的原型是: HFONT CreateFont( int cHeight, //字体的逻辑高度 int cWidth, //字体的逻辑宽度 int cEscapement, //指定移位向量相对X轴的偏转角度 int cOrientation, //指定字符基线相对X轴的偏转角度 int cWeight, //设置字体粗细程度 DWORD bItalic, //是否启用斜体 DWORD bUnderline, //是否启用下划线 DWORD bStrikeOut, //是否启用删除线 DWORD iCharSet, //指定字符集 DWORD iOutPrecision, //输出精度 DWORD iClipPrecision, //剪裁精度 DWORD iQuality, //输出质量 DWORD iPitchAndFamily, //字体族 LPCSTR pszFaceName //字体名 ); 上面的14个参数完全记住几乎不可能,下面是简单的说明,其他的“照猫画虎”即可。 1) 参数 cWidth 和 cHeight 通常取负值,且高度为宽度的2倍,如 -18 和 -9,即可指定 13.5 |(H+W)/2| 磅的字体。 2) 对于字体粗细程度 cWeight,可以使用 FW_ 开头的宏定义;一般取 FW_NORMAL (400),此参数需要值的值域为 [0,1000]。 3) 对于参数 bItalic、bUnderline、bStrikeOut,直接使用 TRUE 或 FALSE 传值即可。 4) 对于字符集 iCharSet,一般可以直接使用 DEFAULT_CHARSET 让系统自动处理。 注意:字体也是一种 GDI 对象,使用完后也要在 WM_DESTROY 消息中删除。 创建完字体后并不能立即使用,还需要手动触发 WM_SETFONT 消息,让Windows 将当前字体设置为我们创建的字体。 发送消息使用 SendMessage 函数,它可以让我们在必要时主动向窗口发送各种消息,原型为: LRESULT SendMessage( HWND hWnd,···

Windows API学习-static静态文本框控件(4)

Windows API学习-static静态文本框控件(4)

1) WM_LBUTTONDOWN 为鼠标左键单击消息。 2) wsprintf 与C语言中的 printf 类似,都是格式化输出函数,不过 wsprintf 一般将字符串输出到缓冲区,而 printf 输出到控制台。它的原型为: int wsprintf( LPTSTR lpBuffer, //接收字符串的缓冲区的指针 LPCTSTR lpFormat, //格式控制字符串 [paramList] //参数列表 ); 3) 声明 static 变量的目的是使局部变量持久化。第一次执行窗口函数会产生 WM_CREATE 消息,初始化 hStatic 变量。如果不声明为 static,那么当函数执行结束后 hStatic 变量就会被销毁,接下来单击鼠标执行窗口函数时,再也不会产生 WM_CREATE 消息,也就意味着 hStatic 变量不会被赋值,将无法使用。 对于窗口函数中的变量,如果是在 WM_CREATE 消息中赋值,但在其他消息中使用,那么一般声明为静态变量,这样下次执行窗口函数时依然有效。 上节完整代码: #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInst; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ){ static TCHAR szClassName[] = TEXT("Win32Demo"); //窗口类名 HWND hwnd; //窗口句柄 MSG msg; //消息 WNDCLASS wndclass; //窗口类 hInst = hInstance; /**********第①步:注册窗口类**********/ //为窗口类的各个字段赋值 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口风格 wndclass.lpfnWndProc = WndProc; //窗口过程 wndclass.cbClsExtra = 0; //暂时不需要理解 wndclass.cbWndExtra =···