
Windows API一日一练
li_guotao
姓名:英文的还是中文的?
学历:小本(小学本科)
体重:68公斤左右,吃完饭可能会更重一些,随时改变,饭前饭后都不同。
身高:不到2米
价值观:视粪土如金钱
上班时间:越短越好。
外貌:长的有点意外
性格:我是一个很低调的人,不喜欢抛投露面
婚娶:男大当婚,女大当嫁,不婚不嫁,实属败家。梦里寻她千百
展开
-
Windows API一日一练(76)GlobalAlloc函数
Windows API一日一练(76)GlobalAlloc函数在Windows系统里,有一项功能非常实用,就是剪贴板功能,它能够从一个程序里与另一个程序进行数据交换的功能,也就是说两个进程上是可以共享数据。要实现这样的功能,Windows系统在底层上有相应的支持,就是高端地址的内存是系统内存,这样就可以不同的进程进行共享数据了。因此,调用函数GlobalAlloc来分配系统内存,让原创 2009-01-09 15:51:00 · 459 阅读 · 0 评论 -
Windows API一日一练(92)GetOpenFileName函数
Windows API一日一练(92)GetOpenFileName函数当用户想选择打开以前保存的文件时,就需要使用到选择文件对话框。其实在Windows的API里已经有这样完美的对话,只需要简单的调用,就可以使用了,而不需要写一大堆其它的代码。下面就来演示一下怎么使用文件选择对话框。函数GetOpenFileName声明如下:WINCOMMDLGAPI BOOL APIENTRY原创 2009-01-09 16:00:00 · 709 阅读 · 0 评论 -
Windows API一日一练(93)GetSaveFileName函数
Windows API一日一练(93)GetSaveFileName函数前面介绍了怎么样打开选择文件读取的对话框,当你设计的软件需要让用户选择保存时,就需要让用户去选择自己合适的文件名称来保存。那么就需要使用到保存文件对话框,也就是API函数GetSaveFileName。下面就来演示怎么样使用这个API函数。函数GetSaveFileName声明如下:WINCOMMDLGAPI B原创 2009-01-09 16:00:00 · 603 阅读 · 0 评论 -
Windows API一日一练(1)第一个应用程序
要跟计算机进行交互,就需要计算机显示信息给人看到,或者发出声音给人听到,然后人看到或听到相应的信息后,再输入其它信息给计算机,这样就可以让计算机进行数据处理,把结果显示给我们。现在就来编写一个最简单的Windows应用程序,让它提示一行文字给我们看到,这就是简单的目标。它实现的源程序和界面如下: 下载 (49.12 KB)2008-10-8 09:17上面这个图,是从VC++ 2005里原创 2009-01-09 14:14:00 · 1345 阅读 · 4 评论 -
Windows API一日一练(5)RegisterClass和RegisterClassEx函数
为了可以创建自己的窗口,就需要向Windows操作系统注册窗口类型,以便后面创建窗口时调用。当然,如果使用Windows预先注册的窗口是不需要注册的。 函数声明如下:#if(WINVER >= 0x0400)WINUSERAPIATOMWINAPIRegisterClassExA( __in CONST WNDCLASSEXA *);WINUSERAPIATOMWINAPIRegister原创 2009-01-09 14:28:00 · 739 阅读 · 0 评论 -
Windows API一日一练(7)ShowWindow函数
ShowWindow的API函数是显示窗口,但它在第一次调用和以后的调用是有区别的。第一次调用时,它的输入参数nCmdShow是需要输入WinMain函数里传入来的nCmdShow参数,而不能是其它参数。 函数声明如下:WINUSERAPIBOOLWINAPIShowWindow( __in HWND hWnd, __in int nCmdShow);hWnd是窗口的句柄。nCmdS原创 2009-01-09 14:31:00 · 657 阅读 · 0 评论 -
Windows API一日一练(9)WindowProc和DefWindowProc函数
在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,原创 2009-01-09 14:32:00 · 389 阅读 · 0 评论 -
Windows API一日一练(10)LoadAccelerators函数
当用户使用软件时,往往有些功能是最常用的功能。作为开发人员,就需要让用户感觉到这个软件好用,这样就需要把他们最常用的功能用起来最方便,最快捷,能提高生产效率。在这方面,微软是做到家了,比如在键盘上有一个Windows键,Windows很多功能都可以通过这个键与其它键来组合成快捷键,提高使用的方便性。现在就来介绍一下怎么样让你的程序也方便使用,就是使用快捷键。函数LoadAccelerators声原创 2009-01-09 14:32:00 · 446 阅读 · 0 评论 -
Windows API一日一练(16)BeginPaint和EndPaint函数
当人们使用软件时,大多数是想看到自己所需要的结果,比如玩RPG游戏,就是想看到自己所操作的主角做各种各样的事情。在2D的RPG游戏里,其实做的事情,就是不断地更新画面,也就是不断地显示BMP的图片。在普通的程序里,大多也是显示各种文本和图片的,但是有一种类型的应用程序是不怎么显示结果的,那就是服务程序。不管怎么样,只要我们想看到程序所执行后的结果,就需要在程序里显示出来。也就是需要调用Begin原创 2009-01-09 14:38:00 · 281 阅读 · 0 评论 -
Windows API一日一练(18)EndDialog函数
上一次介绍了怎么样显示对话框的函数,那么怎么样关闭对话框呢?这就需要使用到函数EndDialog。这个函数只能在对话框的消息处理函数里使用,并且这个函数调用之后,没有立即就删除对话框的,而是设置了操作系统里的结束标志。当操作系统查检到有这个标志时,就去删除对话框的消息循环,同时也去释放对话框占用的资源。其实对话框的生命周期是这样的,先由函数DialogBox创建对话框,这样函数D原创 2009-01-09 14:39:00 · 379 阅读 · 0 评论 -
Windows API一日一练(90)GetGlyphOutline函数
Windows API一日一练(90)GetGlyphOutline函数中西文化的差异,导致在电子信息里处理也大不相同,在英文里只需要26个字母就可以显示所有文章了,而在中文里需要最基本的字符就有2000多个。对于一些在嵌入式软件里要显示的字符,那么就得手动去构造所有图形,这是一个比较大的工作量,如果让每个厂家都去完成这个任务,显然是不可能的。面对着大量嵌入式用户的需求,那么就需要解原创 2009-01-09 15:59:00 · 735 阅读 · 0 评论 -
Windows API一日一练(89)OpenProcess函数
Windows API一日一练(89)OpenProcess函数这一年来流氓软件特别多,面对这种非常恶心的软件,让大家非常痛苦。正是在这种环境之下,众多客户需要强大查杀这种流氓软件的工具。如果让你来开发一个查杀这种病毒的软件,你会怎么做呢?当然是先把电脑里所有进程遍历出来,然后把每个进程的详细信息显示给用户,让用户决定自己那些进程可以运行,那些不可以运行。或者根据当前进程的信息,再跟原创 2009-01-09 15:58:00 · 613 阅读 · 0 评论 -
Windows API一日一练(78)HeapAlloc函数
Windows API一日一练(78)HeapAlloc函数前面已经介绍两个分配内存的函数,一个全局的内存分配,一个是私有的内存分配。在进程私有的内存里分配里,又有两种分配情况,一种上基于栈式的内存分配,另一种是基于堆内存的分配。在c++里使用堆内存分配是使用HeapAlloc函数来实现的,也就是实现new操作符分配内存时会调这个函数。函数HeapAlloc声明如下:WINBA原创 2009-01-09 15:52:00 · 340 阅读 · 0 评论 -
Windows API一日一练(80)MultiByteToWideChar函数
Windows API一日一练(80)MultiByteToWideChar函数 在软件的使用过程中,经常碰到乱码的情况,那么乱码的原因是什么呢?其实很多情况下,就是字符集的不同,也就是说同一个数字代表不同意思。在Windows里,目前主要有ANSI和UNICODE的方式。如果在UNICODE的方式里直接显示ANSI的字符串是出现乱码的,同样在ANSI函数里也不能显示UNICODE的字符原创 2009-01-09 15:54:00 · 354 阅读 · 0 评论 -
Windows API一日一练(81)FormatMessage函数
Windows API一日一练(81)FormatMessage函数在开发软件的过程里,经常要做的工作就是调试程序,许多问题的出现,不但是逻辑的问题,还有可能是对API的不熟悉,或者某种条件下调用API会出错的。那么这些出错的原因是什么呢?通常只获取到错误码,也就是通过函数GetLastError得到。当然可以根据这个错误码去查找MSDN就可以知道出错的原因,但有时在客户那里并没有M原创 2009-01-09 15:54:00 · 483 阅读 · 0 评论 -
Windows API一日一练(82)LoadLibrary函数
Windows API一日一练(82)LoadLibrary函数随着软件规模的扩大,要求的功能也是越来越多,开发人员的参与也是越来越多。因此软件的功能划分,就成为了现代软件工程的重大任务,还有软件开发的并行性也越来越重要。为了解决这些问题,大家都会看到IT硬件发展非常迅速,功能也越来越复杂,但硬件中发展明显提高在于采用IC的方式来实现复杂的功能,也就是把大部份功能集成到一起,只要给出原创 2009-01-09 15:55:00 · 2144 阅读 · 1 评论 -
Windows API一日一练(83)GetModuleFileName函数
Windows API一日一练(83)GetModuleFileName函数在开发软件的过程里,经常需要把数据保存到当前执行文件路径下面,或者读取当前执行文件路径下的一些配置信息。这时就需要从当前模块里获取所在的目录路径,以便进行固定的位置操作文件。要解决这个需求,就需要调用API函数GetModuleFileName来获取模块所在的路径。函数GetModuleFileName声明如原创 2009-01-09 15:55:00 · 545 阅读 · 0 评论 -
Windows API一日一练(84)FlushInstructionCache函数
Windows API一日一练(84)FlushInstructionCache函数一般的程序都是在运行前已经编译好的,因此修改指令的机会比较少,但在软件的防确解里,倒是使用很多。当修改指令之后,怎么样才能让CPU去执行新的指令呢?这样就需要使用函数FlushInstructionCache来把缓存里的数据重写回主内存里去,让CPU重新加载新的指令,才能执行新的指令。下面就来学习一下原创 2009-01-09 15:56:00 · 518 阅读 · 1 评论 -
Windows API一日一练(86)GetClipboardData函数
Windows API一日一练(86)GetClipboardData函数前面介绍怎么样把数据放到剪贴板里面,那么又是怎么样从剪贴板里面获取数据出来呢?当然还是需要使用其它的API函数来获取剪贴板里的数据。获取剪贴板里的数据时,是不知道当前剪贴板里是否有数据的,也不知道剪贴板里的数据格式是什么。那么下面就来解决这两个问题,先使用函数IsClipboardFormatAvailable原创 2009-01-09 15:57:00 · 629 阅读 · 0 评论 -
Windows API一日一练(87)CreateProcess函数
Windows API一日一练(87)CreateProcess函数人们需要处理的信息越来越复杂,往往在一个应用程序里是处理不完的,因此,就出现多个应用程序协同处理同一件事情。当然多个应用程序分开处理,也是比较容易开发,并且让应用程序复杂难度迅速降低。比如在开发一个银行的交易系统,有一个报表生成的主程序,然后还有很多小的,不同的报表生成程序。这样就需要从主程序里创建小报表程序进行运行原创 2009-01-09 15:57:00 · 574 阅读 · 0 评论 -
Windows API一日一练(19)DestroyWindow函数
以前已经介绍过直接点击关闭按钮来关闭应用程序,但想删除一个窗口对象,需要用到什么函数的呢?比如创建了30个窗口,想把第12个窗口关闭删除掉,那就需要使用函数DestroyWindow。当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给原创 2009-01-09 14:39:00 · 380 阅读 · 0 评论 -
Windows API一日一练(20)LoadString、LoadIcon和LoadCursor函数
在编写国际化的应用程序里,经常要使用不同语言的字符串。比如中文菜单里叫做“文件”,而在英语里叫做“File”。开发这种软件的功能是一样的,只是界面上显示的文字不一样而已。为了方便这种软件的开发,在Windows里经常使用的方法就是替换掉显示的字符串,比如指定在中文里就显示“文件”,在英语里就显示“File”,是通过函数LoadString从不同的资源里加载不同的字符串显示来实现的。其实所有可变的原创 2009-01-09 14:39:00 · 497 阅读 · 0 评论 -
Windows API一日一练(32)CreatePen函数
画画是讲究色彩与线条,不同的地方是采用不同的画笔。上面显示直线,都是采用设备缺省的画笔来画直线。现在就来介绍怎么样创建自己的画笔,比如设置画笔的颜色,画笔的大小。像Windows按钮显示为3D的形状,其实就是用两种颜色画笔分别画相应的线,就生成按钮。而创建画笔就需要使用到CreatePen函数。函数CreatePen声明如下:WINGDIAPI HPEN WINAPI CreatePen(原创 2009-01-09 15:09:00 · 434 阅读 · 0 评论 -
Windows API一日一练(63)RegOpenKeyEx和RegCreateKeyEx函数
Windows API一日一练(63)RegOpenKeyEx和RegCreateKeyEx函数由于电脑经常会关闭,或者应用程序也会经常关闭,但有一些参数是经常需要保存。比如当你打开程序,并设置了窗口的大小,想每次打开时都设置窗口为上次打开的大小。这样就需要保存窗口的大小,那么窗口大小的参数保存到那里呢?其实在Windows里最方便的做法,就是保存到注册表里。又比如游戏登录时,总是想原创 2009-01-09 15:42:00 · 342 阅读 · 0 评论 -
Windows API一日一练(66)CreateWaitableTimer和SetWaitableTimer函数
Windows API一日一练(66)CreateWaitableTimer和SetWaitableTimer函数用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的API函数CreateWaitableTimer和SetWaitableTimer来实现了,这对API原创 2009-01-09 15:43:00 · 581 阅读 · 1 评论 -
Windows API一日一练(65)RegQueryValueEx函数
上一次介绍怎么样保存数据到注册表里,这次就需要从注册表里读取数据出来了。在这个例子里是读取字符串数据出来,主要调用函数RegQueryValueEx来实现。下面的例子里就是先查询键值的长度,然后再读取内容出来。 函数RegQueryValueEx声明如下: WINADVAPILONGAPIENTRYRegQueryValueExA ( __in HKEY hKey, __in_opt原创 2009-01-09 15:44:00 · 370 阅读 · 0 评论 -
Windows API一日一练(71)GetComputerName函数
Windows API一日一练(71)GetComputerName函数当你在一个大公司里面,当一个网络管理员时,发现成千上万个电脑需要你去管理时,怎么去区分这些电脑呢?那肯定是通过计算机的名称。而这个网络管理员又需要你开发一套软件,它可以把所有电脑的名称自动地上报给他。面对这样的需求,就可以使用下面的函数GetComputerName来获取计算机的名称,并通过网络传送给管理员。函数原创 2009-01-09 15:48:00 · 371 阅读 · 0 评论 -
Windows API一日一练(73)GetVersionEx函数
Windows API一日一练(73)GetVersionEx函数Windows发展还是非常快速的,从Win95,到Win98,再到Win2000和XP系统。每个系统的功能也有所不同,要想在程序里区别不同的系统,就需要获取系统的版本信息。比如XP里有防火墙,而其它以前的系统里没有带有的。但有时编写了一个服务器程序,或者编写BT程序,又需要设置一个端口对外面接收连接,因此在XP系统里就原创 2009-01-09 15:49:00 · 383 阅读 · 0 评论 -
Windows API一日一练(74)GetSystemInfo函数
Windows API一日一练(74)GetSystemInfo函数有一次,我正在开发一个视频压缩程序,而压缩算法是需要非常高效的,也就是需要使用到CPU的多媒体指令。在X86的领域里,目前主要有两家CPU,就是INTEL和AMD。它们的多媒体指令是不一样的。为了区分这种不同的指令,就需要调用函数GetSystemInfo来获取CPU的信息,然后再调用不同的动态连接库来进行多媒体数据原创 2009-01-09 15:50:00 · 389 阅读 · 0 评论 -
Windows API一日一练(77)VirtualAlloc函数
Windows API一日一练(77)VirtualAlloc函数上一次学习了全局内存的分配,在Windows里内存管理是分为两部份,全局内存是系统管理的内存,因而所有进程都可以访问的内存,而每一个进程又有自己的内存空间,这就是虚拟内存空间了,而虚拟内存的空间比较大,当物理内存不足时,系统会把虚拟内存的数据保存到硬盘里,这样只要硬盘的空间足够大,每个进程就可以使用3G的内存。虚拟内存原创 2009-01-09 15:51:00 · 316 阅读 · 0 评论 -
Windows API一日一练(79)GlobalMemoryStatusEx函数
Windows API一日一练(79)GlobalMemoryStatusEx函数在开发软件的过程中,经常会碰到不同用户的PC系统配置不一样。比如有些用户的系统内存配置比较差,这样处理大量数据时,就不能把大量的数据读取到内存里处理了。而又有一些用户的内存比较多,或者是机器比较新,那么就可以加载大量的数据到内存里处理,这样可以随着系统的更新,软件的处理能力能大幅地提高性能。这样就需要了原创 2009-01-09 15:52:00 · 311 阅读 · 0 评论 -
Windows API一日一练(85)OpenClipboard函数
Windows API一日一练(85)OpenClipboard函数多个软件之间进行数据共享是非常重要的,难以想像编辑软件没有CTRL+C,CTRL+V的功能,是多么的不方便。很多的操作,就是拷贝的动作,就是为了数据共享。剪贴板共享是Windows里比较重要的功能,比如很多采集数据的软件为了方便导数据到Excel里面,就可以使用剪贴板的功能。还有即见即所得的界面导到Word里面原创 2009-01-09 15:56:00 · 851 阅读 · 0 评论 -
Windows API一日一练(62)GetDiskFreeSpaceEx函数
Windows API一日一练(62)GetDiskFreeSpaceEx函数有一次客户给我打来了投诉电话,说我的软件太不好用了,导致他们丢失了很多数据。后来我仔细地查看LOG,分析出来的原因,其实是很简单的,就是磁盘的空间不够了。我给客户说他们的电脑磁盘空间不够了导致出错的问题,但客户反问我为什么不提示磁盘空间不足。是啊,为什么不提示磁盘的空间不足呢?为了解决这个需求,就需要使用到原创 2009-01-09 15:42:00 · 457 阅读 · 0 评论 -
Windows API一日一练(59)CreateFileMapping和MapViewOfFile函数
在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快软件的开发速度。下面就来使用文件映射的方式进行共享数据。先要使用函数CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后原创 2009-01-09 15:38:00 · 878 阅读 · 1 评论 -
Windows API一日一练(33)ExtCreatePen函数
使用前面介绍的CreatePen函数来画大于1的直线时,会发现直线两端全是圆角的,有时候需要画得有角,那么这样的函数就不满足需求了,这时就需要使用另一个API函数ExtCreatePen来创建合适的画笔。ExtCreatePen函数可以创建几何画笔,还可以创建装饰用的画笔,装饰的画笔是用来画一些图案使用的,这样就需要快速的算法来实现,显示比几何的画笔在速度上快很多。比如你在画GPS地图时,当需要原创 2009-01-09 15:10:00 · 296 阅读 · 0 评论 -
Windows API一日一练(35)OutputDebugString函数
在软件的开发过程里,大部份时间是在做什么呢?其实是在调试代码,毕竟人类的思维方式是从简单到复杂的过程,自然的认知过程也是从简单到复杂。因此,开发软件时,第一个版本总是先写简单的,然后慢慢地添加出错处理上去,也把一些没有想到的情况添加进去,那些没有想到的错误,就叫做BUG。要根除一个软件里的BUG,是一件不容易的事情,不但要对这个软件流程比较熟悉,还要对这个软件的目标比较了解,还需要对这个开发平台原创 2009-01-09 15:11:00 · 323 阅读 · 0 评论 -
Windows API一日一练(39)AnimateWindow函数
Windows API一日一练(39)AnimateWindow函数 当你开发一款年轻人使用的软件时,肯定想用一点动感的特性来吸引他们。比如QQ软件就有这个特性,当你把它放到桌面边上时,就会自动隐藏起来,当你的鼠标放到那里时,就会自动慢慢移动出来,副有动感的特性,肯定让年轻人喜欢上它的。还有当你开发软件时,想先动态地显示公司的商标,或者公司的宣传材料时,就会使用到闪屏的效果。其实这两个特原创 2009-01-09 15:19:00 · 430 阅读 · 0 评论 -
Windows API一日一练(40)CreateRectRgn和CombineRgn函数
Windows API一日一练(40)CreateRectRgn和CombineRgn函数创新是永恒的追求。当大家习惯Windows的界面时,又想自己开发的软件耳目一新的感觉,那么就得要改变窗口的形状,比如心形的窗口,总之是不规则的窗口。这时就需要使用到叫做区域的技术。区域就是把不同的形状的图形进行组合,然后可以填充它,或者在它那里显示。比如MSN左边的TAB按钮,应就是区域的运用就可以实现原创 2009-01-09 15:21:00 · 305 阅读 · 0 评论 -
Windows API一日一练(45)CreateEvent和SetEvent函数
Windows API一日一练(45)CreateEvent和SetEvent函数 当你创建一个线程时,其实那个线程是一个循环,不像上面那样只运行一次的。这样就带来了一个问题,在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用事件的方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那原创 2009-01-09 15:26:00 · 654 阅读 · 0 评论 -
Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数
Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函原创 2009-01-09 15:28:00 · 739 阅读 · 0 评论