一.windows窗口创建
/*
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这个神器吧!二.消息循环
{
HWND hwnd; 接受该消息的窗口句柄
UINT message; 消息常量标识符
WPARAM wParam; 32位消息的特定附加信息
LPARAM lParam; 32位消息的特定附加信息
DWORD time; 消息创建时的时间
POINT pt; 鼠标/光标在屏幕坐标系中的位置
}MSG;
MSG msg = {0};
while(GetMessage(&msg, NULL, 0, 0))//从消息队列中取消息
{
//只有WM_QUIT消息才会让Getmessage函数返回0,其他时间非0,消息循环判断条件一直为真,直至有WM_QUIT消息
TranslateMessage(&msg);//将虚拟键消息翻译为字符消息
DispatchMessage(&msg);//分发一个消息给窗口程序
}
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
}
}