博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
visual c++基础(windows窗口程序解析)
阅读量:4363 次
发布时间:2019-06-07

本文共 2859 字,大约阅读时间需要 9 分钟。

windows和应用的交互都是用消息机制的。win系统和应用之间的关系如下:

 

在消息队列中存储要和用户应用直接的交互信息,消息队列是一个队列,是先进先出的机制。

其中消息的内容为:

typedef struct tagMSG {     // msg     HWND   hwnd;     //这是句柄,就是资源的标识,比如说这是标识哪个窗口    UINT   message; //这是一个无符号整型,标识是用户的哪种动作,比如按下鼠标左键,就是WM_LBUTTONDOWN    WPARAM wParam; //附加信息,比如按下键盘A,附加就是A的ascii码    LPARAM lParam; //也是附加消息    DWORD  time; //消息的时间    POINT  pt; //光标的位置,就是鼠标的位置} MSG;

  

Windows程序的入口:(WinMain)int WINAPI WinMain(  HINSTANCE hInstance,  // handle to current instance 实例资源的标识  HINSTANCE hPrevInstance,  // handle to previous instance 上一个实例资源的标识  LPSTR lpCmdLine,      // pointer to command line 命令  int nCmdShow          // show state of window 显示的状态,有显示、隐藏、最大化等。);

  

WNDCLASS是窗口类

typedef struct _WNDCLASS {     UINT    style; //窗口类型    WNDPROC lpfnWndProc; //窗口过程,是一个回调函数    int     cbClsExtra; //附加值 默认0    int     cbWndExtra; //附加内存 默认0    HANDLE  hInstance; //实例标识    HICON   hIcon; //窗口图标,左上角的图标    HCURSOR hCursor; //光标,鼠标的类型    HBRUSH  hbrBackground; //画笔颜色    LPCTSTR lpszMenuName; //菜单的名称    LPCTSTR lpszClassName; //类的名字} WNDCLASS;

  

窗口类型:(UINT    style;)
在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。我们使用goto definition就能发现CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他们的共同点就是只有一位为1,其余位都为0。如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反(~)之后再进行与(&)运算,就能够实现,如在刚才的style的基础上去掉CS_NOCLOSE特征,可以用style & ~CS_NOCLOSE实现。
窗口调用函数:(
WNDPROC lpfnWndProc
第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理是这样的,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。
 
创建窗口过程:
1.要先注册一个窗口
ATOM RegisterClassEx(  CONST WNDCLASSEX *lpwcx  // address of structure with class data);2.然后调用CreateWindow创建一个窗口。
HWND CreateWindow(  LPCTSTR lpClassName,  // pointer to registered class name  LPCTSTR lpWindowName, // pointer to window name  DWORD dwStyle,        // window style  int x,                // horizontal position of window  int y,                // vertical position of window  int nWidth,           // window width  int nHeight,          // window height  HWND hWndParent,      // handle to parent or owner window  HMENU hMenu,          // handle to menu or child-window identifier  HANDLE hInstance,     // handle to application instance  LPVOID lpParam        // pointer to window-creation data);

  

3:显示窗口:ShowWindow
BOOL ShowWindow(  HWND hWnd,     // handle to window  int nCmdShow   // show state of window);

  

4:刷新窗口:
UpdateWindow 最后刷新窗口。
 
 

转载于:https://www.cnblogs.com/a-bird/p/3647343.html

你可能感兴趣的文章
3.3-3.9 周记
查看>>
博客换肤
查看>>
HDU 5025Saving Tang Monk BFS + 二进制枚举状态
查看>>
Web Magic 总体架构
查看>>
Scikit-Learn机器学习入门
查看>>
完美解决IE8有两个进程的问题
查看>>
jq的链式调用.end();
查看>>
不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph...
查看>>
单击浏览器右上角的X弹出提示窗口
查看>>
BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛
查看>>
开始python之旅
查看>>
Python进阶06 循环对象
查看>>
Python补充06 Python之道
查看>>
.net压缩文件夹
查看>>
MS SQL 分页存储过程
查看>>
2016年,我的和自己谈谈
查看>>
创建一个自己的GitHub,创建自己的开源项目
查看>>
Topcoder SRM 648 (div.2)
查看>>
Constructor总结
查看>>
HttpClient使用之下载远程服务器中的文件(注意目录遍历漏洞)
查看>>