自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(3110)
  • 收藏
  • 关注

原创 Windows API一日一练(27)SetBkMode函数

上面已经介绍输出红色的字符串时,发现背景的黑色也变成白色了,这样的输出是破坏背景的。那需要使用什么方法来保持背景不变,而又能输出红色的字符串呢?比如按钮的文字颜色是黑色的,而背景是灰色的。这就需要使用SetBkMode函数来设置DrawText函数的输出方式,显示设备共有两种输出方式:OPAQUE和TRANSPARENT。OPAQUE的方式是用当前背景的画刷的颜色输出显示文字的背景,而TRAN

2008-06-11 13:35:00 579

原创 LCC编译器的源程序分析(69)全局变量的初始化

前面已经介绍了全局函数和全局变量的声明处理,但全局变量的初始化,还没有详细地分析,现在就来干这件事情。比如编写C的程序,有如下的代码:#001 #002 int g_nTest = 100;#003 #004 int main(void)#005 {#006  int nTest1 = 1;#007  int nTest2 = 2;像第2行代码就是全局变量的声明和初始化在一起的,那么在LCC里

2008-06-11 13:35:00 526 1

原创 Windows API一日一练(25)CreateSolidBrush函数

当你看到Windows显示的按钮时,背景颜色是灰色的。当你看到缺省的窗口背景时,它是白色的。当你的老板需要你创建一个黑色背景的按钮时,你会怎么样做呢?其实在Windows里先用API函数CreateSolidBrush创建画刷,然后调用FillRect函数来填充背景。这样来,不管你需要什么样的背景,都随心所欲了吧。现在先来搞懂CreateSolidBrush函数,下次再来练习FillRect。

2008-06-11 13:35:00 524 1

原创 Windows API一日一练(24)DrawText函数

DrawText函数与前面介绍的TextOut函数都是文本输出函数,但它们是有区别的。DrawText函数是格式化输出函数,而TextOut函数不具备这样的功能。因而DrawText函数比TextOut函数功能强大,可以让文本输出时左对齐,或者右对齐,或者中间对齐,还可以让文本适应输出矩形内,如果超出时可以截断,或者显示为省略号的方式。DrawText函数在表格方式显示时肯定要使用到的函数。 

2008-06-11 13:35:00 585

原创 Windows API一日一练(23)SetTextColor函数

世界是多姿多彩的,色彩是不可以缺少的。在软件开发里,不同的字符颜色往往用来区分不同的数据类型,比如严重的警告,就是使用红色,当然这也是跟交通里红绿灯是一样的道理。最根本的原因,还是人类对自然的选择。毕竟人眼对不同的颜色作出了不同的选择。由于红色光波穿透性比较好,所以就形成以红色来警告的信号。说来也怪,人类的身体不管是什么颜色,流着的血一定是红色的。在软件开发里,要把输出字符的颜色符合现在人位的

2008-06-11 13:35:00 865

原创 LCC编译器的源程序分析(68)内存分配链表

LCC采用大块内存的方法,那它分配内存也是比较特殊的,它的源程序如下:#001 //大块内存结构。#002 struct block#003 {#004     struct block *next; //后继块指针。#005     char *limit; //尾位置#006     char *avail; //可用的开始位置.#007 };#008 #009 //共用最大的类型.#01

2008-06-11 13:35:00 628

原创 Windows API一日一练(38)SetWindowPos函数

有一天,用户突然对我说,你这个窗口能不能放到最顶端,这样操作和打开文件就很不方便了。这个功能就需要改变窗口的属性了。比如大家使用QQ时,就有一个功能,设置QQ的窗口在最顶端,不管你选择了什么窗口,QQ的界面永远都在最前面。又像FlashGet的状态查看窗口,一直保持在窗口的最前端,让你看到当前下载的流量程况。现在股票那么火爆,很多人一边工作,一边查看股票,如果错失了机会,又少了很多钱的啊!面对

2008-06-11 13:34:00 414

原创 Windows API一日一练(37)MoveWindow函数

当你设计一个对话框的窗口时,就需要布局好所有按钮、文本显示框等等,由于每个按钮都是一个窗口,那么就需要移动这些窗口到合适的位置,这时就需要使用到MoveWindow函数。或者当你的界面需要动态地修改按钮位置,比如窗口放大了,按钮就需要跟着移动,否则按钮还在原来的位置,放大也不会移动按钮的位置,这时也需要使用MoveWindow函数重新设置按钮的位置。只要你想移动窗口,就可以考虑使用这个函数来实

2008-06-11 13:34:00 464

原创 Windows API一日一练(35)OutputDebugString函数

在软件的开发过程里,大部份时间是在做什么呢?其实是在调试代码,毕竟人类的思维方式是从简单到复杂的过程,自然的认知过程也是从简单到复杂。因此,开发软件时,第一个版本总是先写简单的,然后慢慢地添加出错处理上去,也把一些没有想到的情况添加进去,那些没有想到的错误,就叫做BUG。要根除一个软件里的BUG,是一件不容易的事情,不但要对这个软件流程比较熟悉,还要对这个软件的目标比较了解,还需要对这个开发平

2008-06-11 13:34:00 408

原创 Windows API一日一练(34)GetSysColor函数

当你需要自己显示一个与众不同的按钮时,就需要使用下面的方法来创建。当然这里也是综合地使用前面学习过的知识进行一次综合的练习。演示怎么样使用众多的API函数,这里还可以学会使用GetSysColor函数来获取系统的颜色。WINUSERAPIDWORDWINAPIGetSysColor(    __in int nIndex);nIndex是系统定义的颜色索引值。 调用这个函数的例子如下:#001

2008-06-11 13:34:00 366

原创 Windows API一日一练(33)ExtCreatePen函数

使用前面介绍的CreatePen函数来画大于1的直线时,会发现直线两端全是圆角的,有时候需要画得有角,那么这样的函数就不满足需求了,这时就需要使用另一个API函数ExtCreatePen来创建合适的画笔。ExtCreatePen函数可以创建几何画笔,还可以创建装饰用的画笔,装饰的画笔是用来画一些图案使用的,这样就需要快速的算法来实现,显示比几何的画笔在速度上快很多。比如你在画GPS地图时,当需

2008-06-11 13:34:00 434

原创 Windows API一日一练(32)CreatePen函数

画画是讲究色彩与线条,不同的地方是采用不同的画笔。上面显示直线,都是采用设备缺省的画笔来画直线。现在就来介绍怎么样创建自己的画笔,比如设置画笔的颜色,画笔的大小。像Windows按钮显示为3D的形状,其实就是用两种颜色画笔分别画相应的线,就生成按钮。而创建画笔就需要使用到CreatePen函数。 函数CreatePen声明如下:WINGDIAPI HPEN    WINAPI CreatePe

2008-06-11 13:34:00 428

原创 Windows API一日一练(31)MoveToEx和LineTo函数

现在的世界流行图形界面,而不是文字,因此在软件开发里,肯定需要画图的,比如简单地画线,画一些比较特别的图形。比如让你画一个走动的时钟,就需要不断地画秒针、分针等等。MoveToEx是用来移动当前画笔的位置,LineTo是用来画直线的函数,其实在计算机图形里的直线显示是使用光栅图形学里的原理。 函数MoveToEx和LineTo声明如下:WINGDIAPI BOOL WINAPI MoveToE

2008-06-11 13:34:00 509

原创 Windows API一日一练(30)GetTextMetrics函数

在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。 函数GetTextMetrics声明如下: #ifndef NOTEXTMETRIC WINGDIAPI BOOL WI

2008-06-11 13:34:00 483

原创 Windows API一日一练(29)SelectObject和DeleteObject函数

Windows显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用SelectObject函数,比如上面介绍的字体设置,就会用到这个函数。当你创建一个位图时,这时Windows就会在内存里分配一块内存空间,用来保存位图的数据。当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除,就会造成内存使用越来越多,最后导到Windows

2008-06-11 13:34:00 418

原创 Windows API一日一练(28)CreateFont函数

文字的出现历史可以追溯到甲骨文的使用,直到今天使用的宋体文字。在软件开发里,经常遇到是跨国语言的使用,由于世界在变平,全球在变小,交通运输非常发达,由我所在的深圳,向东坐飞机12个小时就可以到达伦敦,向西坐飞机12小时就可以到达美国,可算得上朝发夕至。比如像炒外汇的人,一天可以不用睡觉都在工作着,比如早上炒东京的汇市,下午就可以炒伦敦的,晚上就可以炒纽约的了。软件的开发,也在全球化,比如昨晚在

2008-06-11 13:34:00 448

原创 Windows API一日一练(45)CreateEvent和SetEvent函数

当你创建一个线程时,其实那个线程是一个循环,不像上面那样只运行一次的。这样就带来了一个问题,在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用事件的方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那个死循环里不断地使用WaitForSingleObject函数来检查事件是否满足,如果满足

2008-06-11 13:33:00 418

原创 Windows API一日一练(44)wsprintf函数

接着上面,再继续实现更加强大的线程类。从上面的C++类里可以看到,要在静态函数里使用类的成员就需要获取this指针,也就是通过CreateThread函数里把类的this指针传送进来的,这样在函数ThreadProc里的参数lpParameter就是this指针了。因此把参数lpParameter转换为CThread类指针,这样就可以使用类的成员。在这个例子里使用wsprintf函数来格式化线

2008-06-11 13:33:00 391

原创 Windows API一日一练(43)WaitForSingleObject函数

上面已经介绍怎么样创建一个简单的线程,在那里就需要使用函数WaitForSingleObject,它是用来做什么的呢?其实它是用来实现等待线程结束的,它的机理是这样的,通知Windows操作系统,现在我进入睡眼状态,当我关注的对象条件是否满足,如果满足了就吵醒我。在那里关注的对象是线程是否退出,这是一个条件测试。如果不等待线程关闭,就去删除线程的资源,就会出错的。使用前面的线程是简单一些,但它

2008-06-11 13:33:00 370

原创 Windows API一日一练(41)FindWindowEx函数

当你想控制一个现有的窗口程序时,就需要获取那个程序的窗口句柄。比如有一些黑客软件需要查找到窗口,然后修改窗口的标题。在外挂流行的今天,惊奇地发现它们也可以修改输入窗口的文字。这其中,就需要使用到FindWindowEx函数来定位窗口。下面就来使用这个函数来实现控制Windows里带的计算器程序。打开计算器程序,最小化在状态下面,运行本例子,点击创建按钮后,就可以点按钮,就会把计算器显示在最前面

2008-06-11 13:33:00 359

原创 Windows API一日一练(40)CreateRectRgn和CombineRgn函数

创新是永恒的追求。当大家习惯Windows的界面时,又想自己开发的软件耳目一新的感觉,那么就得要改变窗口的形状,比如心形的窗口,总之是不规则的窗口。这时就需要使用到叫做区域的技术。区域就是把不同的形状的图形进行组合,然后可以填充它,或者在它那里显示。比如MSN左边的TAB按钮,应就是区域的运用就可以实现它了。 函数CreateRectRgn声明如下:WINGDIAPI HRGN    WINA

2008-06-11 13:33:00 271

原创 Windows API一日一练(39)AnimateWindow函数

当你开发一款年轻人使用的软件时,肯定想用一点动感的特性来吸引他们。比如QQ软件就有这个特性,当你把它放到桌面边上时,就会自动隐藏起来,当你的鼠标放到那里时,就会自动慢慢移动出来,副有动感的特性,肯定让年轻人喜欢上它的。还有当你开发软件时,想先动态地显示公司的商标,或者公司的宣传材料时,就会使用到闪屏的效果。其实这两个特性都可以使用API函数AnimateWindow来实现的,下面就来介绍怎么使

2008-06-11 13:33:00 268

原创 Windows API一日一练(52)GetCurrentDirectory和SetCurrentDirectory函数

在开发软件里,常常碰到要读取当前目录下的配置参数文件,或者打开当前目录下别的程序来运行,那么就需要获取当前进程的目录位置,这就需要使用函数GetCurrentDirectory获取当前进程所有在的目录。同时也可以使用SetCurrentDirectory函数来改变进程的当前目录。 函数GetCurrentDirectory和SetCurrentDirectory声明如下: WINBASEAPI

2008-06-11 13:32:00 287

原创 Windows API一日一练(51)CreateDirectory和RemoveDirectory函数

在信息爆炸的年代里,把各种信息分类已经是一种非常必要的功能,比如把股票行情数据保存到硬盘里,就需要分开几个目录保存。比如你写LOG到硬盘时,也需要分成几个目录来保存,这样让维护人员很好地找到出错的信息,或者有用的信息。像我在开发银行的信用卡系统时,就需要把所有通过网络传送的数据全部生成文本文件保存到当日的目录里,也就是说每天都需要创建一个目录,把所有交易的数据生成LOG保存进去。那么面对这样的

2008-06-11 13:32:00 270

原创 Windows API一日一练(50)SuspendThread和ResumeThread函数

操作系统对线程有几种状态的变化:执行,挂起和恢复执行。当线程做完任务或者现在想暂停线程运行,就需要使用SuspendThread来暂停线程的执行,当然恢复线程的执行就是使用ResumeThread函数了。这两个函数使用很简单的,下面就来看看例子是怎么样使用的。 函数SuspendThread和ResumeThread声明如下:WINBASEAPIDWORDWINAPISuspendThread

2008-06-11 13:32:00 254

原创 Windows API一日一练(49)SetThreadPriority和GetThreadPriority函数

Windows是抢先式执行任务的操作系统,无论进程还是线程都具有优先级的选择执行方式,这样就可以让用户更加方便处理多任务。比如当你一边听着音乐,一边上网时,这时就可以把音乐的任务执行级别高一点,这样不让音乐听起来断断续续。当你编写网络程序时,一个线程从网络接收数据,一个线程写数据到硬盘,这时也可以把网络接收线程的优先级设置高一点,因为可以把接收到的数据写到内存里去,然后缓存起来再写到硬盘里。还

2008-06-11 13:32:00 266

原创 Windows API一日一练(48)PostThreadMessage函数

在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的CPU越来越普及,使用多个线程池是明显提高服务器程序的性能。在以消息为基础的Windows系统里,使用消息来处理是最简单的线程池办法,不但使用起来简单,而且理解起来也很简单的方法。创建多个线程后,就可以根据线程的ID来向不同的线程发送消息,每个线程都处理自己的消息。而发送消息给线程的函数是PostThreadMessage函数。下

2008-06-11 13:32:00 407

原创 Windows API一日一练(47)CreateSemaphore和ReleaseSemaphore函数

在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情。在这其中,就需要使用到信号量来进行同步。CreateSemaphore是创建信号量,ReleaseSemaphore是增加信号量。 函数CreateSemaphore和ReleaseSemaphore声明如下:WINBASEAPI__outHANDLEWI

2008-06-11 13:32:00 376

原创 Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数

多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函数。 函数EnterCriticalSection和LeaveCriticalSection声明如下: WINBASEAPIVOIDW

2008-06-11 13:32:00 287

原创 Windows API一日一练(58)FindFirstFile和FindNextFile函数

在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的LOG非常多,那么一个很大的硬盘,在6个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过6个月的LOG数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过6个月时间的文件删除掉。因此,就需使用到下面的API函数FindFirstFile和FindNextFile来实现

2008-06-11 13:31:00 538

原创 Windows API一日一练(57)CopyFile和MoveFile函数

在信息的社会里,共享信息是非常重要的。比如你有一个很好的相片,要拷给朋友去分享。又或者你在写一些比较重要的数据,要进行不定时备份时,也就需要拷贝文件到不同的目录里。这样就需要使用到函数CopyFile来拷贝文件,它能够把一份文件拷贝多一份出来。我在开发一个数据采集的软件里,由于这个软件是可以不同的用户共同使用,用户跟我说有这样的需求,就是不同的用户的数据移动到不同的目录里,这样方便他们管理数据

2008-06-11 13:31:00 314

原创 Windows API一日一练(56)SetEndOfFile和GetFileSizeEx函数

有一天,我正在开发BT软件,它有这样的一个功能,就是先把文件的大小分配好,然后再慢慢地往里面对应的位置写入相应的数据。这样的好处,就是可以先把磁盘空间占用起来,以便后面的下载顺利进行。要实现这个功能,就需要创建一个空的文件,然后把文件指针设置到相应大小的位置,然后再调用函数SetEndOfFile来设置文件的结束位置,这样文件就有相应的大小了。在BT软件的开发里,也发现目录的处理时需要详细地记

2008-06-11 13:31:00 332

原创 Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数

在PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘。由于这样的体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法。比如操作系统接收到写文件的数据时,就会先把数据保存到RAM里,然后在合适的时间或者合适的数据量时再写到硬盘里。但有时候我们希望数据一定要保存到硬盘里,而不是保存在RAM里,这时就需要使用函数FlushFileB

2008-06-11 13:31:00 245

原创 Windows API一日一练(54)WriteFile和ReadFile函数

读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载

2008-06-11 13:31:00 415

原创 Windows API一日一练(53)CreateFile函数

在软件的需求里,把有用的数据保存起来是非常重要的功能。比如每天的股票行情数据需要保存起来,以便生成K线图。比如游戏客户端的LOG需要保存起,以便客户端出错时可以把LOG发送回来分析它出错的原因。比如银行每天进行交易时,也需要把所有交易的数据保存到文件备份起来,以便进行结算。还有在数据采集领域更是需要保存更多的数据,比如从DV里读取视频和语音数据出来,就会生成12G的巨型文件。比如读DVD光盘里

2008-06-11 13:31:00 293

原创 Windows API一日一练(66)CreateWaitableTimer和SetWaitableTimer函数

用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的API函数CreateWaitableTimer和SetWaitableTimer来实现了,这对API函数创建的时钟是比较精确的,可以达到100倍的10亿分之一秒。 函数CreateWaitableTimer和SetWaita

2008-06-11 13:30:00 240

原创 Windows API一日一练(65)RegQueryValueEx函数

上一次介绍怎么样保存数据到注册表里,这次就需要从注册表里读取数据出来了。在这个例子里是读取字符串数据出来,主要调用函数RegQueryValueEx来实现。下面的例子里就是先查询键值的长度,然后再读取内容出来。 函数RegQueryValueEx声明如下: WINADVAPILONGAPIENTRYRegQueryValueExA (    __in HKEY hKey,    __in_op

2008-06-11 13:30:00 535

原创 Windows API一日一练(64) RegSetValueEx和RegDeleteValue函数

上一次说到怎么创建注册表的键,但接着下来的问题就是怎么样保存数据到注册表里。注册表使用树形的方式管理数据,所以它的扩展和访问都是比较灵活的。不过注册表是系统重要信息库,每当Windows系统加载时,都首先从硬盘里读取它出来,才知道每台电脑所有硬件配置信息,然后再加载不同的驱动程序。因此,注册表作为系统重要的文件,不要往里面写超过2K的数据大小,这样可以提高系统的速度。下面就来介绍一下怎么样保存

2008-06-11 13:30:00 292

原创 Windows API一日一练(63)RegOpenKeyEx和RegCreateKeyEx函数

由于电脑经常会关闭,或者应用程序也会经常关闭,但有一些参数是经常需要保存。比如当你打开程序,并设置了窗口的大小,想每次打开时都设置窗口为上次打开的大小。这样就需要保存窗口的大小,那么窗口大小的参数保存到那里呢?其实在Windows里最方便的做法,就是保存到注册表里。又比如游戏登录时,总是想保存最后一个登录的用户,那么也需要保存这个用户到注册表里。其实注册表是Windows保存系统配置的数据库,

2008-06-11 13:30:00 326

原创 Windows API一日一练(61)GetDriveType函数

经常碰到这样的需求,比如你需要保存一个文件到一个目录里去,这个目录或许是用户指定的目录,那么你就需要确保这个目录是否有效的,这样就需要去测试这个目录是否允许写文件?这个目录是否存在?这个目录是否可写的?或者这个目录是否网络上的目录?要完成这个任务,就得使用函数GetDriveType来完成。GetDriveType函数可以获取目录和盘号的属性。 函数GetDriveType声明如下: WINB

2008-06-11 13:30:00 263

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除