ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
###指针   我们知道,程序的运行是存在内存中的,因此,我们在代码中声明的所有变量都是存放在内存中的某块区域中,所以,在C语言中,指针用来告诉我们,某个变量在内存中的首地址在哪。注意,是首地址,因为变量的长度不一定就是一个字节,有可能N多个字节,它在内存中是排列在一段连续的区域块中。      **通过指针中存放的首地址,应用程序顺利地找到某个变量**。就好像我最近认识了一位朋友,他叫我有空去他家坐坐,然后,他留下了地址。某个周末我正闲着,忽然想起这位朋友,于是,我就根据他留的地址去找他,结果,当我来到傻B街230号出租房时,里面走出一个我不认识的人,于是,我问他我这位朋友去哪了,陌生人说,我刚租了这房子,你找的可能是前一位租户吧。   所以,指针所指向的地址,有可能是变量B,也有可能是变量F,或者变量S,指针是房东,可以把房子租给B,C,或F,它可以动态为变量分配内存,也可以把变量销毁(delete),交不起房租就滚蛋(析构函数)。   从上面的故事中,我们看到指针的两个用途:**索引内存和分配内存**。此外指针还有一个功能功能:**创建数组**。      我们怎么知道哪些参数是指针类型呢,技巧还是在命名上,以后,只要我们看到lp开头的,都是指针类型。比如lpszClassName、lpszObjTitle等等。 ~~~ .版本 2 .DLL命令 Ex_ObjCreate, 整数型, "libexdui.dll", "Ex_ObjCreate", 公开, 创建组件. .参数 lpszClassName, 整数型, , 组件类名 .参数 lpszObjTitle, 整数型, , 组件标题 .参数 dwStyle, 整数型, , 组件风格 .参数 x, 整数型, , 左边 .参数 y, 整数型, , 顶边 .参数 width, 整数型, , 宽度 .参数 height, 整数型, , 高度 .参数 hParent, 整数型, , 父组件句柄 .参数 lParam, 整数型, , 参数 ~~~ ###创建窗口   窗口类注册完成后,就应该创建窗口,然后显示窗口,调用Ex_WndCreate创建窗口,如果成功,会返回一个窗口的句柄,我们对这个窗口的操作都要用到这个句柄。   什么是句柄呢?其实它就是一串数字,只是一个标识而已,内存中会存在各种资源,如图标、文本等,为了可以有效标识这些资源,每一个资源都有其唯一的标识符,这样,通过查找标识符,就可以知道某个资源存在于内存中哪一块地址中,就好比你出身的时候,长辈都要为你取个名字,你说名字用来干吗?名字就是用来标识你的,不然,你见到A叫小明,遇到B又叫小明,那谁知道哪个才是小明啊?就好像你上大学去报到号,会为你分配一个可以在本校学生中唯一标识你的学号,所有学生的学号都是不同的,这样,只要通过索引学号,就可以找到你的资料。 ~~~ .版本 2 .DLL命令 Ex_WndCreate, 整数型, "libexdui.dll", "Ex_WndCreate", 公开, .参数 hWndParent, 整数型, , .参数 lpwzClassName, 整数型, , .参数 lpwzWindowName, 整数型, , .参数 x, 整数型, , .参数 y, 整数型, , .参数 Width, 整数型, , .参数 Height, 整数型, , .参数 dwStyle, 整数型, , .参数 dwStyleEx, 整数型, , ~~~ ###消息循环   Windows操作系统是基于消息控制机制的,用户与系统之间的交互,程序与系统之间的交互,都是通过发送和接收消息来完成的。就好像军队一样,命令一旦传达,就要执行,当然,我们的应用程序和军队不一样,我们收到指令不一定要执行,我们是可以选择性地执行。   这样消息循环就出现了,只要有与用户交互,系统人不断地向应用程序发送消息通知,因为这些消息是不定时不断发送的,必须有一个绶冲区来存放,就好像你去银行办理手续要排队一样,我们从最前端取出一条一条消息处理,后面新发送的消息会一直在排队,直到把所有消息处理完,这就是**消息队列**。    ~~~ .版本 2 .DLL命令 Ex_WndMsgLoop, 整数型, "libexdui.dll", "Ex_WndMsgLoop", 公开, ~~~ ###程序退出   通常情况下,当我们的主窗口关闭后,应用程序应该退出(木马程序除外),但是,我们刚才运行后发现,为什么我的窗口关了,但程序不退出呢?   要退出程序,就要先跳出消息循环,和关闭哪个窗口无关。因此,我们要解决两个问题:   1、如何跳出消息循环;   2、什么时候退出程序。   其实两个问题是可以合并到一起解决。   首先要知道,当窗口被关闭,为窗口所分配的内存会被销毁,同时,我们会收到一条WM_DESTROY消息,因而,我们只要在收到这条消息时调用PostQuitMessage函数,这个函数提交一条WM_QUIT消息,而在消息循环中,WM_QUIT消息使GetMessage函数返回0,这样一来,GetMessage返回FALSE,就可以跳出消息循环了,这样应用程序就可以退出了。   所以,我们要做的就是捕捉WM_DESTROY消息,然后PostQuitMessage。   ![](https://box.kancloud.cn/2016-08-18_57b5723f7bcb8.png) ###绘图   要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相关的交互操作,我们这里说的是图形的绘制,自然指的是显卡。      在许多情况下,我们绘图都是遵循先GetDC-----〉绘图------〉ReleaseDC,DC是一种资源,用完了要释放,我们到图书馆借书,看完了要还书。不过,在处理WM_PAINT消息时,声明一个ExsPaintStruct结构体的变量,然后传给_canvas_beginpaint函数,之后就可以画东西了。调用DLL命令名 _canvas_beginpaint 函数后,开始绘图,画完了调用_canvas_endpaint。其中 _canvas_beginpaint 函数会自动调用GetDC,_canvas_endpaint自动调用ReleaseDC。 ~~~   .版本 2 .DLL命令 _canvas_beginpaint, 整数型, "libexdui.dll", "_canvas_beginpaint", 公开, .参数 hcanvas, 整数型, , ~~~ [资料来源>](http://www.kancloud.cn/digest/win32-dev/165890)