windows编程学习笔记(1)创建窗口与消息循环
2014-10-20 19:08
579 查看
一.windows窗口创建
建立一个windows窗口四部曲1.设置窗口
2.注册窗口
3.创建窗口
4.显示窗口
/* time: 2014.10.20 topic: windows窗口(1) point:窗口设计,注册,创建,显示,更新。 */ #include<windows.h> //窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); //winmain函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //1.设计窗口 WNDCLASSEX wndClass = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, WndProc, 0L, 0L, hInstance, NULL, LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(GRAY_BRUSH), NULL, L"hello windows", NULL }; //2.注册窗口 RegisterClassEx(&wndClass); //3.创建窗口 HWND hWnd = CreateWindow(L"hello windows", L"hello windows", WS_EX_OVERLAPPEDWINDOW, 0, 0, 400, 400, NULL, NULL, hInstance, NULL); //调整设定位置大小函数 MoveWindow(hWnd, 100, 100, 800, 600, true); //4.显示窗口 ShowWindow(hWnd, nCmdShow); //更新窗口 UpdateWindow(hWnd); return 0; }其实都是一些固定的格式,只需要按照自己的需要更改一下参数,就可以创建一个自己想要的窗口。详细的参数信息还是查阅MSDN这个神器吧!
二.消息循环
windows是事件驱动的,作为一个实时的操作系统,当然是有任何事件都要做出相应,当有消息来时,那就得把这消息放到消息队列中,队列是一个循环缓冲区,当一个程序装入内存后,Windows操作系统为每个线程分配一个消息队列。每个程序必须通过向消息队列发送消息,系统决定是否马上响应这些请求的消息,并通过回调窗口函数来完成窗口中的某些功能。关于消息,有这样的一个结构体
typedef struct tagMsg
{
HWND hwnd; 接受该消息的窗口句柄
UINT message; 消息常量标识符
WPARAM wParam; 32位消息的特定附加信息
LPARAM lParam; 32位消息的特定附加信息
DWORD time; 消息创建时的时间
POINT pt; 鼠标/光标在屏幕坐标系中的位置
}MSG;
主要的两种消息循环机制
1.GetMessage机制
BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1
MSG msg = {0}; while(GetMessage(&msg, NULL, 0, 0))//从消息队列中取消息 { //只有WM_QUIT消息才会让Getmessage函数返回0,其他时间非0,消息循环判断条件一直为真,直至有WM_QUIT消息 TranslateMessage(&msg);//将虚拟键消息翻译为字符消息 DispatchMessage(&msg);//分发一个消息给窗口程序 }
2.PeekMessage机制
BOOLPeekMessage(LPMSGIpMsg,HWNDhWnd,UINTwMSGfilterMin,UINTwMsgFilterMax,UINTwRemoveMsg);
参数
lpMsg
接收消息信息的MSG结构指针。
hWnd
其消息被检查的窗口句柄。
wMsgFilterMin
指定被检查的消息范围里的第一个消息。
wMsgFilterMax
指定被检查的消息范围里的最后一个消息。
wRemoveMsg
确定消息如何被处理。此参数可取下列值之一:
PM_NOREMOVE PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE PeekMessage处理后,消息从队列里除掉。
PM_NOYIELD 此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。
//PeekMessage消息循环 MSG msg = {0}; while(msg.message != WM_QUIT) { if (PeekMessage(&msg, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { //do something } }
比较两种机制:
GetMessage函数检查消息队列中有消息,如果有,那么分发出去,如果没有,那么便一直等待,直到有消息为止
PeekMessage函数则是看消息队列中有没有消息,如果有,那么分发出去,如果没有,那就去执行else中的部分
注:对于执行效率要求很高的程序,比如游戏,建议还是用PeekMessage函数。
今天的就到这里啦,本人学习windows刚刚半年多,最近想整理一下关于windows的各方面知识,于是就有了这篇博文。仅供参考,毕竟才疏学浅,如有错误欢迎各位指正与交流。
相关文章推荐
- Windows编程学习笔记 lesson2 窗口创建
- Windows编程学习笔记 lesson3 窗口创建
- Windows学习笔记6——窗口与消息<四>
- MFC学习笔记之四————菜单编程与windows消息分类
- windows 编程随笔——窗口和信息补充之消息循环
- MFC学习笔记3 Windows编程基础--DialogBox、回调、消息、控件
- 初学Windows编程笔记1——窗口和消息
- windows学习笔记3——窗口和消息<一>
- MFC学习笔记之四————菜单编程与windows消息分类
- 初学Windows编程笔记1——窗口和消息
- 【Windows编程】笔记-添加音效与窗口创建
- 雅阁学习笔记之windows编程——保存文件和打开浏览文件夹窗口
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 (windows的消息机制)
- Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用
- Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
- Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现
- Windows学习笔记5——窗口与消息<三>
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 1 (消息的使用和入口代码)