一丶简介
通过上一讲.我们了解了窗口其实是绘制出来的.而且是不断绘制的过程. 所以窗口的本质是绘制. 但是我们现在看到的窗口程序.都可以点击关闭按钮. 使用鼠标点击会有反应.
而我们要怎么实现那.
其实鼠标点击是产生了一个消息. window把这个消息封装成了消息结构体. 发送给了我们的窗口程序. 那么windows怎么知道你点击的那个窗口那?
是这样的. 当我们点击的时候. 会记录点击坐标.消息.等等. windows系统会接受到. 然后遍历内核中的WINOBJ结构. 而这个结构中存储着窗口对象. 窗口对象对应着消息线程.
所以windows一层一层的遍历.则找到了对应的窗口以及窗口对应的线程.然后发送给我们的应用程序.
上面说的我们需要了解. 要知道消息怎么产生的. 怎么传递的.那么下面编程就明白了.
例如下图:
每个应用程序都有一个线程对象. 而这个线程对象如果创建窗口.那么内核中就有这个窗口对象.
如果我们有鼠标点击的消息.键盘消息等等.操作系统都会遍历窗口对象. 而窗口对象也会保存着创建这个窗口对象对应的线程对象. 而这个线程对象中则有消息队列.
这样的话操作系统则会封装消息发送给我们窗口对象.
二丶Wind窗口类结构.创建窗口程序.
1.进行窗口编程需要注意的问题
在Windows中进行窗口编程.入口点已经改成WinMain了. 有四个参数.
如以下代码所示
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, //窗口的实例句柄 hinstance代表模块意思 HWND代表窗口意思. HANDLE代表内核对象. HDC 设备上下文. _In_opt_ HINSTANCE hPrevInstance, //父窗口句柄.不需要. _In_ LPWSTR lpCmdLine, //命令行参数 _In_ int nCmdShow) //命令. 最大化命令.还是最小化命令. { return 0; }
wWinMain 因为有UNICODE跟ASCII区别. 所以我是UNICODE使用wWinMain. A版本就是用WinMain
2.进行Windows编程的调试手法
在Windows中我们调试程序不能简单的使用printf进行调试.或者打印输出了. 我们可以使用两个API进行操作.
1.Sprintf() 格式化字符串.
2.OutPutDebugString() 输出调试字符串.
具体两个API. 不再累赘.百度搜索即可.
因为OutPutDebugString() 只能打印固定字符串.所以使用sprintf进行格式化字符串.如下面代码.
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int