Windows API学习 《Windows API一日一练》
文章平均质量分 77
满衣兄
夜深人静思往事,旧梦如歌转萧条。
昨日悲欢苦未消,回首前尘却已遥。
旧地重游人不同,落花未必怨东风。
不如怜取眼前人,多少往事一笑中!
展开
-
(2)使用应用程序句柄
从上面这段程序就可以看到,_tWinMain是应用程序的入口函数,这里是使用它的宏,定义在tchar.h头文件里,为什么要这样作宏定义的呢?由于Windows的应用程序要适应UNICODE和以前单字符的应用程序,由于Windows这两个API的定义是不一样的,如下:UNICODE的定义: #define _tWinMain wWinMain单字符的定义: #define转载 2008-11-12 15:05:00 · 849 阅读 · 0 评论 -
(17)DialogBox和DialogBoxParam函数
对话框是比较常用的窗口,比如当你想让用户输入一些参数时就可以使用对话框。或者提示一些警告的信息,都是可以使用对话框的。比如当你拷贝文件时,Windows就会提示一个拷贝文件的进度对话框。对话框的使用范围比较广,并且它在设计时就可以看到运行的结果模样,这样方便设计。但对话框又分为两类,一种对话框运行后,一定要用户关闭那个对话框后才能返回到父窗口;一种对话框是不需要关闭后就可以直接返回父窗口。因此,软原创 2008-11-27 08:39:00 · 7236 阅读 · 0 评论 -
(19)DestroyWindow函数
以前已经介绍过直接点击关闭按钮来关闭应用程序,但想删除一个窗口对象,需要用到什么函数的呢?比如创建了30个窗口,想把第12个窗口关闭删除掉,那就需要使用函数DestroyWindow。当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除转载 2008-11-28 14:34:00 · 1387 阅读 · 0 评论 -
(20)LoadString、LoadIcon和LoadCursor函数
在编写国际化的应用程序里,经常要使用不同语言的字符串。比如中文菜单里叫做“文件”,而在英语里叫做“File”。开发这种软件的功能是一样的,只是界面上显示的文字不一样而已。为了方便这种软件的开发,在Windows里经常使用的方法就是替换掉显示的字符串,比如指定在中文里就显示“文件”,在英语里就显示“File”,是通过函数LoadString从不同的资源里加载不同的字符串显示来实现的。其实所有可变的字转载 2008-11-28 17:09:00 · 1211 阅读 · 0 评论 -
(23)SetTextColor函数
世界是多姿多彩的,色彩是不可以缺少的。在软件开发里,不同的字符颜色往往用来区分不同的数据类型,比如严重的警告,就是使用红色,当然这也是跟交通里红绿灯是一样的道理。最根本的原因,还是人类对自然的选择。毕竟人眼对不同的颜色作出了不同的选择。由于红色光波穿透性比较好,所以就形成以红色来警告的信号。说来也怪,人类的身体不管是什么颜色,流着的血一定是红色的。在软件开发里,要把输出字符的颜色符合现在人位的习惯转载 2008-12-01 11:35:00 · 1371 阅读 · 0 评论 -
(21)SetWindowLongPtr和GetWindowLongPtr函数
在软件开发里,大家一直对着这个问题是执着的,那是“复用”。总想自己写出来的代码,可以适应性很强,到那里都可以落地生根。因此,面向对象的语言就层出不穷,每个都坚称可以最大地复用代码。在面向对象里,C++是非常强大的。下面就来用C++把上面介绍的程序封装起来,这样可以复用,或者说条理更加清晰。#001 #002 int APIENTRY _tWinMain(HINSTANCE hInsta转载 2008-12-01 11:15:00 · 1730 阅读 · 0 评论 -
(24)DrawText函数
DrawText函数与前面介绍的TextOut函数都是文本输出函数,但它们是有区别的。DrawText函数是格式化输出函数,而TextOut函数不具备这样的功能。因而DrawText函数比TextOut函数功能强大,可以让文本输出时左对齐,或者右对齐,或者中间对齐,还可以让文本适应输出矩形内,如果超出时可以截断,或者显示为省略号的方式。DrawText函数在表格方式显示时肯定要使用到的函数。转载 2008-12-04 09:34:00 · 1024 阅读 · 0 评论 -
(25)CreateSolidBrush函数
当你看到Windows显示的按钮时,背景颜色是灰色的。当你看到缺省的窗口背景时,它是白色的。当你的老板需要你创建一个黑色背景的按钮时,你会怎么样做呢?其实在Windows里先用API函数CreateSolidBrush创建画刷,然后调用FillRect函数来填充背景。这样来,不管你需要什么样的背景,都随心所欲了吧。现在先来搞懂CreateSolidBrush函数,下次再来练习FillRect。转载 2008-12-04 21:18:00 · 1214 阅读 · 0 评论 -
(28)CreateFont函数
文字的出现历史可以追溯到甲骨文的使用,直到今天使用的宋体文字。在软件开发里,经常遇到是跨国语言的使用,由于世界在变平,全球在变小,交通运输非常发达,由我所在的深圳,向东坐飞机12个小时就可以到达伦敦,向西坐飞机12小时就可以到达美国,可算得上朝发夕至。比如像炒外汇的人,一天可以不用睡觉都在工作着,比如早上炒东京的汇市,下午就可以炒伦敦的,晚上就可以炒纽约的了。软件的开发,也在全球化,比如昨晚在美国转载 2008-12-09 08:53:00 · 1227 阅读 · 0 评论 -
(29)SelectObject和DeleteObject函数
Windows显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用SelectObject函数,比如上面介绍的字体设置,就会用到这个函数。当你创建一个位图时,这时Windows就会在内存里分配一块内存空间,用来保存位图的数据。当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除,就会造成内存使用越来越多,最后导到Windows这转载 2008-12-09 08:55:00 · 920 阅读 · 0 评论 -
(27)SetBkMode函数
Windows API一日一练(28)CreateFont函数 | 旧一篇: LCC编译器的源程序分析(69)全局变量的初始化 function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSe转载 2008-12-08 17:18:00 · 1404 阅读 · 0 评论 -
(30)GetTextMetrics函数
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。 函数GetTextMetrics声明如下: #ifndef NOTEXTMETRIC WINGDI转载 2008-12-12 13:29:00 · 1792 阅读 · 0 评论 -
(31)MoveToEx和LineTo函数
现在的世界流行图形界面,而不是文字,因此在软件开发里,肯定需要画图的,比如简单地画线,画一些比较特别的图形。比如让你画一个走动的时钟,就需要不断地画秒针、分针等等。MoveToEx是用来移动当前画笔的位置,LineTo是用来画直线的函数,其实在计算机图形里的直线显示是使用光栅图形学里的原理。 函数MoveToEx和LineTo声明如下:WINGDIAPI BOOL WINAPI Mo转载 2008-12-12 13:35:00 · 7693 阅读 · 0 评论 -
(32)CreatePen函数
画画是讲究色彩与线条,不同的地方是采用不同的画笔。上面显示直线,都是采用设备缺省的画笔来画直线。现在就来介绍怎么样创建自己的画笔,比如设置画笔的颜色,画笔的大小。像Windows按钮显示为3D的形状,其实就是用两种颜色画笔分别画相应的线,就生成按钮。而创建画笔就需要使用到CreatePen函数。 函数CreatePen声明如下:WINGDIAPI HPEN WINAPI Crea转载 2008-12-12 13:43:00 · 2438 阅读 · 0 评论 -
(15)PostQuitMessage函数
自然界面里,各种生物都是有其生命周期的。程序也是有其生命周期的,创建时就是它出生了,当它运行工作中就是成年期,最后少不了要死亡的,那么程序的死亡是怎么样出现的呢?像以前介绍函数GetMessage里是使用一个循环不断地检测消息,周止复始的,是不可能出现死亡的,但它会检测到消息WM_QUIT就退出来。那现在问题是谁发送WM_QUIT消息出来呢?这就是PostQuitMessage函数所做的工作。当你转载 2008-11-26 21:59:00 · 629 阅读 · 0 评论 -
(18)EndDialog函数
上一次介绍了怎么样显示对话框的函数,那么怎么样关闭对话框呢?这就需要使用到函数EndDialog。这个函数只能在对话框的消息处理函数里使用,并且这个函数调用之后,没有立即就删除对话框的,而是设置了操作系统里的结束标志。当操作系统查检到有这个标志时,就去删除对话框的消息循环,同时也去释放对话框占用的资源。其实对话框的生命周期是这样的,先由函数DialogBox创建对话框,这样函数DialogBox完转载 2008-11-27 08:47:00 · 1420 阅读 · 0 评论 -
(16)BeginPaint和EndPaint函数
当人们使用软件时,大多数是想看到自己所需要的结果,比如玩RPG游戏,就是想看到自己所操作的主角做各种各样的事情。在2D的RPG游戏里,其实做的事情,就是不断地更新画面,也就是不断地显示BMP的图片。在普通的程序里,大多也是显示各种文本和图片的,但是有一种类型的应用程序是不怎么显示结果的,那就是服务程序。不管怎么样,只要我们想看到程序所执行后的结果,就需要在程序里显示出来。也就是需要调用BeginP转载 2008-11-26 22:08:00 · 902 阅读 · 0 评论 -
(1)第一个应用程序
要跟计算机进行交互,就需要计算机显示信息给人看到,或者发出声音给人听到,然后人看到或听到相应的信息后,再输入其它信息给计算机,这样就可以让计算机进行数据处理,把结果显示给我们。现在就来编写一个最简单的Windows应用程序,让它提示一行文字给我们看到,这就是简单的目标。它实现的源程序和界面如下:上面这个图,是从VC++ 2005里截出来的。这样可以看到源程序和显示的界面,很清楚地知道那些内容在转载 2008-11-12 15:01:00 · 1030 阅读 · 3 评论 -
(4)MessageBox函数
为了显示提示信息给用户,Windows是提供了一个非常方便的API函数MessageBox给用户使用,使用这个API函数可以显示简单的文字信息出来,提醒或提示用户进行下一步操作。函数声明如下:WINUSERAPIintWINAPIMessageBoxA( __in_opt HWND hWnd, __in_opt LPCSTR lpText, __i转载 2008-11-13 08:55:00 · 1391 阅读 · 1 评论 -
(3)使用命令行参数
下面再接着练习使用命令行参数,先在VC2005调试设置里设置输入参数,如下图:可以看到在Command Arguments里输入给程序传送的命令行参数(cmd1 cmd2 命令行参数)。接着修改原来的程序如下:#001 int APIENTRY _tWinMain(HINSTANCE hInstance,#002 HINSTANCE转载 2008-11-13 08:39:00 · 884 阅读 · 0 评论 -
(5)RegisterClass和RegisterClassEx函数
为了可以创建自己的窗口,就需要向Windows操作系统注册窗口类型,以便后面创建窗口时调用。当然,如果使用Windows预先注册的窗口是不需要注册的。 函数声明如下:#if(WINVER >= 0x0400)WINUSERAPIATOMWINAPIRegisterClassExA( __in CONST WNDCLASSEXA *);WINUSER转载 2008-11-14 08:32:00 · 1949 阅读 · 0 评论 -
(6)CreateWindow函数
函数声明如下:WINUSERAPIHWNDWINAPICreateWindowExA( __in DWORD dwExStyle, __in_opt LPCSTR lpClassName, __in_opt LPCSTR lpWindowName, __in DWORD dwStyle, __in int X,转载 2008-11-14 08:53:00 · 1192 阅读 · 0 评论 -
(7)ShowWindow函数
ShowWindow的API函数是显示窗口,但它在第一次调用和以后的调用是有区别的。第一次调用时,它的输入参数nCmdShow是需要输入WinMain函数里传入来的nCmdShow参数,而不能是其它参数。 函数声明如下:WINUSERAPIBOOLWINAPIShowWindow( __in HWND hWnd, __in int nCmdSho转载 2008-11-14 09:00:00 · 1043 阅读 · 0 评论 -
(8)UpdateWindow函数
UpdateWindow函数是更新窗口的客户区,主要通过发送WM_PAINT消息来实现的。 函数声明如下:WINUSERAPIBOOLWINAPIUpdateWindow( __in HWND hWnd);hWnd是要更新窗口客户区的窗口句柄。 调用这个函数的实例如下:#001 BOOL InitInstance(HINSTANCE hIn转载 2008-11-14 09:03:00 · 2067 阅读 · 0 评论 -
(11)GetMessage函数
应用程序为了获取源源不断的消息,就需要调用函数GetMessage来实现,因为所有在窗口上的输入消息,都会放到应用程序的消息队列里,然后再发送给窗口回调函数处理。函数GetMessage声明如下:WINUSERAPIBOOLWINAPIGetMessageA( __out LPMSG lpMsg, __in_opt HWND hWnd, __转载 2008-11-18 10:00:00 · 1126 阅读 · 0 评论 -
(9)WindowProc和DefWindowProc函数
在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或转载 2008-11-14 20:57:00 · 1319 阅读 · 1 评论 -
(10)LoadAccelerators函数
当用户使用软件时,往往有些功能是最常用的功能。作为开发人员,就需要让用户感觉到这个软件好用,这样就需要把他们最常用的功能用起来最方便,最快捷,能提高生产效率。在这方面,微软是做到家了,比如在键盘上有一个Windows键,Windows很多功能都可以通过这个键与其它键来组合成快捷键,提高使用的方便性。现在就来介绍一下怎么样让你的程序也方便使用,就是使用快捷键。函数LoadAccelerators转载 2008-11-18 09:34:00 · 3274 阅读 · 0 评论 -
(12)TranslateAccelerator函数
当应用程序运行时,用户按下快捷键,这样就产生了一个按键消息,那么Windows是怎么样把它转化为快捷键响应的消息呢?这就需要使用TranslateAccelerator函数。TranslateAccelerator函数主要的作用就是把消息跟快捷键表里定义的按键进行比较,如果发现有快捷键,就会把这个按键消息转换为WM_COMMAND或者WM_SYSCOMMAND消息给窗口的消息处理函数发送过去。转载 2008-11-20 19:41:00 · 2334 阅读 · 0 评论 -
(13)TranslateMessage函数
TranslateMessage是用来把虚拟键消息转换为字符消息。由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。TranslateMessage函数用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,系统将产生WM_KEY转载 2008-11-20 20:03:00 · 856 阅读 · 0 评论 -
(14)DispatchMessage函数
前面已经介绍从系统队列里获取一条消息,然后经过快捷键的函数检查,又通过字符消息函数的转换,最后要做的事情就是调用DispatchMessage函数,它的意思就是说要把这条消息发送到窗口里的消息处理函数WindowProc。 函数DispatchMessage声明如下:WINUSERAPILRESULTWINAPIDispatchMessageA( __in转载 2008-11-20 20:05:00 · 1081 阅读 · 1 评论 -
线程同步之Slim读/写锁
本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。 Slim读/写锁SRWLock的目的和关键段相同,对一个资源进行保护,构造了一段“原子访问”的代码,不让其他线程访问它。但与关键段不同的是SRWLock允许区分想要读取资源值的线程和想要写入资源值的线程,因为仅仅读取资源是不会破坏数据的,下面是Slim读/写锁的简单用法:转载 2013-03-25 16:14:25 · 751 阅读 · 0 评论