
《Windows API每日一练》
文章平均质量分 91
bcdaren
这个作者很懒,什么都没留下…
展开
-
《Windows API每日一练》24.1 WinSock简介
本节将逐一介绍WinSock的主要特性和组件,套接字、WinSock动态库的使用。本节必须掌握的知识点: Windows Socket接口简介 Windows Socket接口的使用 第178练:网络时间校验■以下是WinSock的主要特性和组件:●套接字(Socket): 套接字是网络通信的基本概念,它代表了一个网络连接的端点。WinSock提供了函数来创建、绑定、连接和关闭套接字,以及发送和接收数据。●协议支持: WinSock支持多种网络协议,包括TCP/IP原创 2024-08-01 07:33:00 · 479 阅读 · 0 评论 -
《Windows API每日一练》23.1 Windows多媒体
你可以使用预定义的命令字符串,也可以自定义命令字符串来实现特定的功能。但对于更复杂的多媒体处理,如音频编码、视频渲染等,可能需要使用更高级别的多媒体框架和API,如Media Foundation或DirectShow,这些内容本书并不涉及,有兴趣的读者可以查阅MSDN等相关资料。在这种情况下 mciSendString函数会立即返回,但是,当MCI命令中指定的操作结束后, mciSendString的最后一个参数所指定的句柄代表的窗口将收到一条MM_MCINOTIFY消 息。这就是所谓的“CD音频“。原创 2024-07-31 07:23:29 · 624 阅读 · 0 评论 -
《Windows API每日一练》22.3 SHE异常
lpSEH参数指向注册回调函数时使用的EXCEPTION_REGISTRATION结构的地址,在例子程序中,它的值就是我们在堆栈中构造的这个结构的地址,这个参数 看上去似乎没有什么用处,例子程序中也确实没有用到它,但是如果希望异常处理程序能 够被封装在子程序里面的话,这个参数就是不可缺少的,因为使用它可以避免使用全局变量在模块和回调函数之间传递数据,在接下来的内容中读者会了解到如何做到这一点。发生异常时,由异常回调函数接管异常,处理异常后继续执行异常发生后的下一条指令。原创 2024-07-30 07:36:21 · 703 阅读 · 0 评论 -
《Windows API每日一练》21.2 执行可执行程序
因此,应该谨慎使用,避免对正在运行的进程造成不可预料的结果。TerminateProcess函数不是一个推荐使用的函数,一般仅在很极端的情况下使用(如任务管理器用来结束停止响应的进程),因为它将目标进程无条件结束,被结束的进程根本 没有机会进行扫尾工作,同时,目标进程使用的dll文件也不会收到结束通知,所以极有 可能造成数据丢失。当某个进程创建了一个新的进程的时候,被创建的进程称为“子进程”,创建它的进程称为“父进程”,子进程可以从父进程那里继承环境变量以及其他一些对象,在子进程中可以继续创建“孙进程”。原创 2024-07-29 06:50:51 · 812 阅读 · 0 评论 -
《Windows API每日一练》20.1 动态链接库
在应用程序中,可以使用动态链接库的函数和资源,通过加载 DLL 文件并调用其中的导出函数来实现。链接器将根据.def文件中的导出列表来生成DLL,并确保这些函数和符号在DLL中是可见和可调用的。但使用.def文件可以提供更精确的控制,例如指定导出函数的名称和序号(C\C++引用动态链接库时,将.def文件包含在了头文件中)。是用以确保函数名称被添加到EDRLIB.LIB中的关键字而已(使得链接器在链接使用这些函数的应用程序时可以正确解析该函数名),并且用于确保这些函数在EDRLIB.DLL中可见。原创 2024-07-28 09:41:21 · 1146 阅读 · 0 评论 -
《Windows API每日一练》19.2 Windows多线程
这个窗口过程很简单.。在处理WM_CREATE消息时,它设定该结构的hwnd和cyChar字段,调用_beginthread函数创立一个使用Threadl函数的新线程并且传递给新线程一个指向该PARAMS结构的指针。这个实现看起来很好:如果一个程序在花很长时间处理一条消息,那么当鼠标在该程序的窗口上时,鼠标指针会显示为沙漏,而当它在另一个程序的窗口上时,就变成正常的箭头了。在主线程中,我们创建一个新的线程,等待线程结束后,使用GetExitCodeThread函数获取线程的退出代码,并将其打印出来。原创 2024-07-27 05:30:04 · 908 阅读 · 0 评论 -
《Windows API每日一练》第十八章 多文档界面
在WM_MDIACTIVATE消息中,wParam和lParam的值分别是将变成非活动窗口和活动窗口的窗口句柄。框架窗口可以向客户窗口发送这个消息来激活某个子窗口,而客户窗口既会把这个消息发送给被激活的子窗口,也会发送给从活动状态进入后台的那个子窗口,来通知它们这个变化。在子文档窗口的WM_CREATE消息中,lParam是指向CREATESTRUCT结构的指计,而这个结构的 lpCreateParams字段是一个指向用来创建窗口的MDICREATESTRUCT结构的指针。”的文档窗口相联系的。原创 2024-07-26 06:25:37 · 1400 阅读 · 0 评论 -
《Windows API每日一练》16.1 简单的文本输出
3.第3个Tab开始的位置应为10+(8的倍数),即18、26、34、42或50等,但因8、18、26、34、42处要么被字符占用,要么被以前的两个Tab占用,所以第3个Tab从50开始,然后输出h字符。3.第3个Tab开始的位置应为8的倍数,即8、16、24、32或40等,但因8、16、24、32处要么被字符占用,要么被以前的两个Tab占用,所以第3个Tab从40开始,然后输出h字符。2.第2个Tab为16(2*字符宽度的8倍)的位置(即刻度16)处开始,由于字符数不够,得再补充6个空格字符。原创 2024-07-25 07:11:43 · 684 阅读 · 0 评论 -
《Windows API每日一练》第十五章 调色板
●Windows规定,活动窗口(标题栏高亮显示的程序)的逻辑调色板(如果有的话)具有最高的实现优先权,这是因为活动窗口是当前与用户交互的窗口,应该保证其有最佳的颜色显示。)更新客户区的颜色。如前面的“调色板原理图”中,逻辑调色板的索引1中的颜色与系统调色板中的第23号索引与其完全匹配,但逻辑调色板中的索引15和系统调色板中的索引46是不完全匹配的。1.首先将逻辑调色板中的项与系统调色板中的项作完全匹配,对于逻辑调色板中不能完全匹配的项将其加入到系统调色板的空白项中,系统调色板总共有236个空白项可供使用。原创 2024-07-24 06:45:29 · 1003 阅读 · 0 评论 -
《Windows API每日一练》14.1 位图基础
问题在于,这些位图不能被保存和用在另一个有着不同颜色组织的图形输出设备上,比如,不能用在一个每像素8位,能显示256种颜色的显示器上。人们常常会忘记最早的VGA的色彩限制,因为其他的硬件生产商很快就开发了“超级VGA”(或SVGA)适配器,它有更多的显示内存,而且能在640*480的模式下显示256种颜色或更多颜色。位图除了有空间尺寸外,还有颜色维度,也就是每个像素所需的位的数目,有时候又叫位图的颜色深度(Color Depth),或位数,或每像素位数(bbp)。位图的每个像素都有同样 的颜色位数。原创 2024-07-23 06:33:19 · 620 阅读 · 0 评论 -
《Windwos API每日一练》12.1 剪贴板的简单用法
在32位Windows中,GMEM_FIXED可以正常使用,因为它返回一个虚拟地址,操作系统可以通过改变页表移动物理内存里的内存块。例如,在Windows NT下,如果某程序用CF_TEXT剪贴板数据类型来使用SetClipboardData,那么你也可以用 CF_OEMTEXT来调用GetClipboardData。但是,在之后打开剪貼板以取得文本时,应该再次进行检査(用同样的函数或者其他某种方法),以确定CF_TEXT数据是否仍保存在剪贴板中。如果这是个潜在的问题,就需要用可移动内存,具体用法如下。原创 2024-07-21 06:37:44 · 1079 阅读 · 0 评论 -
《Windows API每日一练》11.4 Richedit控件
在使用 RichEdit 控件时,可以通过代码创建控件实例并进行初始化,也可以在资源编辑器中添加 RichEdit 控件并在程序中获取该控件的句柄进行操作。在上述示例中,通过捕获 WM_COMMAND 和 WM_NOTIFY 消息,并根据消息的参数进行判断,可以处理 RichEdit 控件的命令消息和通知消息。根据具体的消息类型和参数,可以执行相应的处理逻辑。●超链接:RichEdit 控件支持文本中的超链接,可以将文本或图片转换为可点击的链接,点击链接时可以执行相应的操作,如打开网址、跳转到其他部分等。原创 2024-07-20 09:07:26 · 1050 阅读 · 0 评论 -
《Winodws API每日一练》11.3 工具栏控件
因为不同控件的通知消息都使用 WM_NOTIFY消息,有些通知消息可能需要附带其他数据,这时仅使用一个NMHDR结 构来表达是不够的,Windows的处理办法是为需要附带其他数据的WM_NOTIFY消息定义不同的数据结构,但这些结构头部都是一个NMHDR结构,NMHDR结构以后才是其他字段,这样在得知通知码之前,把lParam参数指针当做一个NMHDR结构来处理总是正确的。NMTOOLBAR 消息的参数是一个 NMHDR 结构体,其中包含了关于通知消息的详细信息,包括发送消息的控件句柄、标识符和消息代码。原创 2024-07-19 08:10:09 · 1323 阅读 · 0 评论 -
《Windows API每日一练》10.3 公用对话框
为防止该结构被释放,要声明为静态变量。以上代码首先初始化了 OPENFILENAME 结构体,并设置了相关的成员,如文件过滤器、文件路径缓冲区、默认文件扩展名等。如果用户点击了保存按钮并选择了文件路径,您可以通过 ofn.lpstrFile 获取选择的文件路径,并进行相应的处理。如果用户点击了确定按钮并选择了颜色,您可以通过 cc.rgbResult 获取选择的颜色,并进行相应的处理。要使用公共文件对话框来进行查找和替换操作,您可以使用 FindText 和 ReplaceText 函数以及相应的结构体。原创 2024-07-18 07:39:58 · 1082 阅读 · 0 评论 -
《Windows API每日一练》10.2 非模态对话框
如果查找对话框是一个模态对话框,用户将不得不从菜单中选择査找,输入想找的字符串,结束对话框以返回到文档,然后重复整个过程査找同一字符串的另一实例。如果消息是针对非模态对话框的,IsDialogMessage就会将其发送到对话框窗口过程并返回 TRUE(非零),否则返回FALSE(0)。■第三个差异:与模态对话框和消息框的消息不同的是,非模态对话框的消息要进入你 程序的消息队列。如上图所示,模态对话框的消息循环使用Windows系统内置的消息循环,包含一个自定义对话框窗口过程和系统内建的默认对话框窗口过程。原创 2024-07-17 08:16:53 · 714 阅读 · 0 评论 -
《Windows API 每日一练》10.1 模态对话框
【注意】添加标题的前提是对话框属性中必须包含标题栏,可以在VS中设置对话框属性,也可以直接在rc资源文件文件中添加WS_CAPTION样式。也可以在VS中打开对话框资源,选中对话框后点击鼠标右键,单机属性菜单,在属性栏修改对话框属性。对话框的窗口过程属于Windows。这个函数的参数包括实例句柄、对话框的名称(在资源脚本中定义)、父窗口(此程序的主窗口)和对话框过程的地址。当对话框过程处理一条消息时,它会返回TRUE(非零——消息处理成功),而当它不处理一条消息时,返回FALSE(零——消息处理失败)。原创 2024-07-16 07:29:53 · 828 阅读 · 0 评论 -
《Windows API每日一练》9.3.1 快捷键
对有多个窗口和窗口过程的应用程序,快捷键变得十分重要。通常,这会是你的主窗口,亦即拥有菜单的那个窗口,这意味着响应快捷键的逻辑不需要被复制到每一个窗口过程。如果是菜单发送的WM-command消息,则通过调用SendMessage函数向edit控件发送WM_UNDO、WM_COPY、WM_CUT 、WM_PASTE、WM_CLEAR、EM_SETSEL消息,分别对应UNDO 、CUT 、COPY、PASTE、CLEAR、SETSEL_ALL菜单,HELP和ABOUT菜单弹出MessageBox框提示信息。原创 2024-07-15 07:20:25 · 945 阅读 · 0 评论 -
《Windows API每日一练》9.25 系统菜单
实例在窗口过程处理WM_CREATE消息时,调用LoadMenu函数,分别加载"MenuMain"、"MenuEdit"和"MenuFile"三个菜单资源,并返回三个菜单资源的句柄。实例的窗口过程拦截系统菜单消息WM_SYSCOMMAND,分别根据菜单ID处理"ABOUT..."、"HELP..."和"REMOVE..."菜单。点击ID_MAIN菜单时,调用SetMenu函数将"MenuMain"菜单分配给窗口。点击ID_EDIT菜单时,调用SetMenu函数将"MenuEdit"菜单分配给窗口。原创 2024-07-14 07:14:42 · 613 阅读 · 0 评论 -
《Windows API每日一练》9.2.2 菜单消息
结果值将是下列之一:SC_SIZE、SC_MOVE、SC_MINIMIZE、SC_MAXIMIZE、SC_NEXTWINDOW、 SC_PREVWINDOW 、 SC_CLOSE、SC_VSCROLL、SC_HSCROLL、SC_ARRANGE、 SC_RESTORE 和 SC_TASKLIST。即使用户选择了系统菜单中的一项,wParam的值也仍然是你主菜单的句柄。WM_CREATE消息:调用LoadMenu加载菜单资源,获取菜单句柄,接着调用GetSubMenu函数获取下拉菜单或子菜单的句柄。原创 2024-07-13 07:43:42 · 713 阅读 · 0 评论 -
《Windows API每日一练》9.2.1 菜单
第二个特征是一个ID号或一个指向弹出菜单的句柄,Windows会在 WM_COMMAND消息中把ID号发送给你的程序,而弹出菜单则在用户选择该菜单项时由 Windows显示出来。也就是说,用户可以在禁用的菜单项上单击鼠标,或者将反色显示(reverse-video)的光标条移动到一个禁 用的菜单项,或者使用菜单项的快捷键字母来触发禁用的菜单项。ID值在一个菜单中应该 是唯一的。顶级菜单有一个菜单句柄,在顶级菜单中的每个弹出菜单也都有自己的菜单句柄,系统菜单(也是一个弹出菜单)也有一个菜单句柄。原创 2024-07-12 06:28:55 · 1175 阅读 · 0 评论 -
《Windows API每日一练》9.1.5 自定义资源
在上述示例中,IDR_MY_RESOURCE 是自定义资源的标识符,在资源文件中定义了对应的资源文件路径。使用 FindResource 函数查找自定义资源,然后使用 LoadResource 函数加载自定义资源,最后使用 LockResource 函数锁定自定义资源以获取指向资源数据的指针。3.根据自定义资源的类型,可以使用不同的 API 函数(如图像资源可以使用 GDI 函数、音频资源可以使用 DirectSound 函数)来处理自定义资源。// 加载自定义资源。其可执行文件包含资源的模块的句柄。原创 2024-07-11 06:47:12 · 1127 阅读 · 0 评论 -
《Windows API每日一练》9.13资源-鼠标位图和字符串
此外,还可以使用系统提供的内置鼠标指针位图,如 IDC_ARROW(箭头指针)、IDC_HAND(手指指针)等,通过使用系统定义的预定义鼠标指针常量来加载和设置。随后,可以使用缓冲区中的字符串进行后续的操作,例如在消息框中显示。需要注意的是,字符串资源表可以包含多个语言的本地化字符串,在加载字符串资源时,可以根据需要指定语言来获取对应的字符串。【说明】鼠标指针的资源ID,同样可以使用文件名字符串(带引号的字符串)或者IDC_CURSOR1标识符或者数字来表示,对应的程序中鼠标指针位图加载的定义。原创 2024-07-10 05:45:46 · 844 阅读 · 0 评论 -
《Windows API每日一练》9.1 资源-图标
因为Windows可以从单个图标文件中提取了正确尺寸的图标图像。因此,在WNDCLASSEX结构中你需要设定与两个图标文件相关联的两个图标句柄—— 一个是标准图标而另一个是小图标。添加图标资源的方法在上一小节中已经讲述,在解决方案的“资源文件”目录下点击鼠标右键,选择添加>资源>ICON,导入icon1.ico位图文件。在上述示例中,hInstance 是应用程序的实例句柄,IDI_ICON1 是图标资源的 ID。可以使用资源编辑器将图标资源添加到应用程序的资源文件中,并分配一个唯一的 ID 给它。原创 2024-07-09 05:51:14 · 1145 阅读 · 0 评论 -
《Windows API每日一练》8.5 listbox控件
在上述示例中,我们首先获取列表框控件的句柄 hListBox,然后使用 LB_ADDSTRING 消息或 ListBox_AddString 函数将字符串项添加到列表框中。要选择列表框中的项目并提取选中的项目,你可以使用 LB_GETCURSEL 消息或 ListBox_GetCurSel 函数来获取当前选中项目的索引。●WM_COMMAND:列表框的选择变化会触发 WM_COMMAND 消息,其中的 wParam 参数指示了列表框的控件标识符,而 lParam 参数指示了列表框控件的句柄。原创 2024-07-08 07:38:26 · 2123 阅读 · 0 评论 -
《Windows API 每日一练》8.4 edit控件
窗口过程处理WM_CREATE消息时,创建一个”edit”控件,窗口样式为WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL。在上述示例中,我们首先获取编辑类窗口的当前样式,然后通过按位或运算符将 ES_READONLY 样式添加到样式中,最后使用 SetWindowLongPtr 函数设置新的样式。原创 2024-07-07 08:07:00 · 1287 阅读 · 0 评论 -
《Windows API每日一练》8.3 scrollbar控件
滚动条两端的按钮及滑块的颜色将基于COLOR_BTNFACE,COLOR_BTNHILIGHT ,COLOR_BTNSHADOW,COLOR_BTNTEXT (给小箭头用),COLOR_DKSHADOW 以及 COLOR_BTNLIGHT。在处理滚动条消息时,可以用IParam参数区分窗口滚动条和滚动条控件。如果C0L0R_BTNHIGHL1GHT 颜色在程序运行过程中被改变了,静态矩形的颜色会改变,文本背景颜色会改变,但整个文本窗口控件的背景仍将保持原有的COLOR_BTNHIGHLIGHT颜色。原创 2024-07-06 06:34:52 · 877 阅读 · 0 评论 -
《Winodws API每日一练》8.2 static控件
窗口类名使用Windows预定义的静态类”static”,静态类子窗口控件的样式为“WS_CHILD| WS_VISIBLE| WS_BORDER| SS_CENTER| SS_CENTERIMAGE”,WS_CHILD表示子窗口样式,WS_VISIBLE表示可见的,WS_BORDER表示带边框的,SS_CENTER表示文本在窗口客户区内水平方向居中对齐,SS_CENTERIMAGE表示IMAGE图像在窗口客户区内水平垂直居中。Static 控件是一种静态的、只读的显示元素,不接受用户的输入或操作。原创 2024-07-05 06:36:51 · 1272 阅读 · 0 评论 -
《Windows API每日一练》8.1 button控件二
在BTNLOOK中显示的前两个按钮是“按键”按钮(push button)。此类按钮是一种带有 文本的矩形,这些文本是在CreateWindow调用的窗口文本参数中提供的。而CreateWindow 或MoveWindow调用中指定的宽度和高度则确定了矩形的大小。文本显示在矩形的中心。按键按钮控件主要用于立即启动某些行动而不必保留任何类型的开/关指示。有两种类 型的按键按钮控件,它们的窗口样式分别是BS_PUSHBUTTON和BS_DEFPUSHBUTTON。 BS_DEFPUSHBUTTON的“DEF”表原创 2024-07-04 07:32:19 · 1092 阅读 · 0 评论 -
《Windows API每日一练》8.1 button控件一
当任意一个窗口接受到WM_PAINT消息产生重绘,更新区绘制完成以后,就搜索它的前面的一个窗口,如果此窗口的范围和更新区有交集,就向这个发送WM_PAINT消息,周而复始,直到执行到顶层窗口才算完成。以下将客户区刷白,因子窗口范围与无效区可能有交集,会导致子窗口重绘,因此本例中WM_DRAWITEM会被触发,而WM_DRAWITEM过程中的SrollWindow会引起WM_PAINT,可在WM_DRAWITEM里,将无效区有效化,阻止ScrollWindow引发的WM_PAINT,从而防止死循环。原创 2024-07-03 06:39:24 · 1045 阅读 · 0 评论 -
《Windows API每日一练》7.4 状态报告上使用计时器
处理WM_TIMER消息,调用GetCursorPos函数获取当前鼠标位置坐标,然后调用GetPixel函数获取当前鼠标位置坐标处的像素值,并调用SetPixel函数绘制一个黑色像素点标识鼠标位置。这一节我们使用计时器,每隔一秒获取当前鼠标坐标位置的像素值,并显示在窗口,这就相当于是一个简单的取色器了。指向以空字符结尾的字符串的指针,该字符串指定正在使用的特定输出设备的名称,如打印管理器。指向以空字符结尾的字符串的指针,该字符串指定设备驱动程序的名称(例如,Epson)。原创 2024-07-02 07:03:06 · 536 阅读 · 0 评论 -
《Windows API每日一练》7.3 计时器时钟
接着绘制冒号,然后再绘制两位数字时间“分”和冒号,最后绘制两位数字时间“秒”。3.处理WM_TIMER消息,先调用SetIsotropic设置窗口参数,然后选入白色画笔,擦除原有的时针、分针和秒针,接着再选入黑色画笔,重新绘制新的时针、分针和秒针。时针每小时走30度,每分钟,分针走6度,每秒,秒针走6度。1.处理WM_CREATE消息,调用SetTimer函数创建一个计时器,并调用GetLocalTime函数获取本地时间。然后分别设置窗口和视口的原点坐标和范围,将数字显示在客户区的中心位置。原创 2024-07-01 06:14:58 · 860 阅读 · 0 评论 -
《Windows API每日一练》7.2 计时器的三种使用方法
这是使用计时器方法一的典型特征,通过处理WM_TIMER消息响应计时器,而不是使用计时器回调函数。实例BEEPER2.C的窗口过程在处理WM_CREATE消息时,调用SetTimer函数创建计时器的前三个参数与实例BEEPER1.C完全相同,只是最后一个参数计时器的回调函数不再是NULL,而是TimerProc。第三种设置计时器的方法与第二种方法相似,只不过SetTimer的hwnd参数被设置为 NULL,而且第二个参数(正常情况下是计时器的ID)也被忽略了。创建计时器,间隔1秒发送一次WM_TIMER。原创 2024-06-30 08:11:00 · 731 阅读 · 0 评论 -
《Windows API每日一练》7.1 计时器基础知识
本章提供的程序便是证明。这样,应用程序不会同时收到大量的WM_TIMER消息,尽管它可能会收到靠得很近的两个WM_TIMER消息。当计数值减到0,Windows会把一个WM_TIMER消息放到适当的应用程序的消息队列中,同时把计数值重新设置回它的原始值。由于Windows应用程序是通过正常的消息队列来接收WM_TIMER消息,所以你绝对不用担心程序在处理其他任务时会被突然而来的WM_TIMER消息所“中断”。因此,在实际应用中,如果需要更高精度的计时器,可以使用高精度计时器,并进行适当的性能测试和调优。原创 2024-06-29 07:04:05 · 908 阅读 · 0 评论 -
《Windows API每日一练》6.4 程序测试
前面我们讨论了鼠标的一些基础知识,本节我们将通过一些实例来讲解鼠标消息的不同处理方式。本节必须掌握的知识点: 第36练:鼠标击中测试1 第37练:鼠标击中测试2—增加键盘接口 第38练:鼠标击中测试3—子窗口 第39练:鼠标击中测试4—子窗口增加键盘接口 第40练:捕获鼠标消息1 第41练:捕获鼠标消息2 第42练:获取系统配置信息No.2—增加鼠标滚轮/*---------------------------原创 2024-06-28 07:02:53 · 886 阅读 · 0 评论 -
《Windows API每日一练》6.3 非客户区鼠标消息
对非客户区消息来说, DefWindowProc处理WM_NCHITTEST消息后返回一个可用于鼠标消息参数wParam的值。这些消息提供了与非客户区鼠标交互相关的信息,应用程序可以根据这些消息来处理非客户区的鼠标事件。非客户区鼠标消息是指在 Windows 操作系统中,当鼠标位于窗口的非客户区域时发送的鼠标相关的消息。如果 DefWindowProc 在处理 WM_NCHITTEST 消息之后返回 HTCLIENT,则 Windows 会将屏幕坐标转换成客户区坐标,并产生一个客户区鼠标消息。原创 2024-06-27 05:57:08 · 903 阅读 · 0 评论 -
《Windows API每日一练》6.2 客户区鼠标消息
●若在非活动窗口的客户区内按下鼠标左键,Windows会将该窗口变为活动窗口,并向窗口过程发送WM_LBUTTONDOWN消息。类似地,当移动鼠标到另一个窗口再释放时,前一个窗口过程在接收 WM_LBUTTONDOWN消息后,就接收不到相应的WM_LBUTTONUP消息。鼠标消息则不同:当鼠标经过窗口或在窗口内被单击,则即使该窗口是非活动窗口或不带输入焦点, 窗口过程还是会收到鼠标消息。如果想在客户区外释放鼠标,并继续设计图形,就可以在客户区外按下鼠标的左键,再将鼠标移入客户区。然后再恢复原鼠标位图。原创 2024-06-26 06:52:51 · 1182 阅读 · 0 评论 -
《Windows API每日一练》6.1 鼠标基础知识
但是,在一个计算机培训程序中,如果想在屏幕上画出一个鼠标, 在这种情况下可能需要知道鼠标的按钮是否己被切换。箭头的顶点即为热点。这些消息是在 Windows 消息循环中使用的常见鼠标消息,你可以在应用程序的消息处理过程中捕获并响应这些消息。早期的鼠标是单键鼠标,只有一个键,后来逐步改进为双键鼠标和带滚轮的双键鼠标。当用户与鼠标进行交互时,系统会生成相应的鼠标消息,以通知应用程序有关鼠标操作的信息。在 Windows 消息循环中,可以通过检查消息的消息类型来确定是否为鼠标消息,并进一步处理相应的操作。原创 2024-06-25 06:33:18 · 925 阅读 · 0 评论 -
《Windows API每日一练》5.5 插入符号
正如名称所暗示的,当窗口过程接收输入焦点时,它接收到一个WM_SETFOCUS 消息:当它失去输入焦点时,收到一个WM_KILLFOCUS消息。【注意】移动字符时,先隐藏插入符,再选入新创建的逻辑字体绘制字符,绘制完成后重新显示插入符。●在WM_SIZE消息中,当窗口客户区大小发生变化时,使用空格字符清空窗口客户区,然后将插入符置于窗口客户区的左上角,然后重绘窗口。正常可见字符的处理:与Delete键的处理过程类似,先隐藏插入符,然后绘制字符后再重新显示插入符,再将插入符置于下一个位置。原创 2024-06-24 06:07:49 · 972 阅读 · 0 评论 -
《Windows API每日一练》5.4 键盘消息和字符集
/当前字体字符集。不需要返回,接着窗口过程处理WM_CREATE消息和WM_DISPLAYCHANGE消息,调用GetSystemMetrics函数获取当前窗口客户区的最大宽和高,然后调用CreateFont函数创建一个新的逻辑字体,并调用SelectObject函数将新创建的逻辑字体选入当前设备环境。Windows 利用TrueType字体达到了真正的所见即所得(what you see is what you get, WYSIWYG),使 得在显示器上显示的字体和打印机输出的字体是准确匹配的。原创 2024-06-23 07:20:27 · 1297 阅读 · 0 评论 -
《Windows API每日一练》5.3 字符消息
第一个消息的wParam参数等于音调本身的ASCII码(与传递给WM_DEADCHAR消息的 wParam参数相同),第二个消息的wParam参数等于字母’s’的ASCII码。我们按照以下的基本规则来处理击键和字符消息:如果你需要读取输入到窗口中的键 盘字符,就处理WM_CHAR消息:如果你需要读取光标键、功能键、Delete键、Insert键、 Shift键、Ctrl键和Alt键,则处理WM_KEYDOWN消息。这意味着窗口过程会接收到用ANSI字符编码的消息和用Unicode字 符编码的消息。原创 2024-06-22 07:19:22 · 1119 阅读 · 0 评论