创建窗口
“消息循环”,实际是程序循环即Windows 中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中.
消息循环代码是应用程序中主函数WinMain ( )中类似如下的程序段:
while(GetMessage(&msg,NULL,0,0))
{ //从消息队列中取得消息
TranslateMessage(&msg);
//检索并生成字符消息WM_CHAR
DispatchMessage(&msg);
//将消息发送给相应的窗口函数
}
创建窗口实例
注册表初始化
typedef struct _WNDCLASS {
UINT style; //默认风格,窗口尺寸被修改后重画窗口
WNDPROC lpfnWndProc; //窗口回调
int cbClsExtra; //窗口类的额外空间
int cbWndExtra; //窗口实例的额外空间
HINSTANCE hInstance; //句柄实例
HICON hIcon; //图标
HCURSOR hCursor; //光标
HBRUSH hbrBackground; //背景
LPCTSTR lpszMenuName; //菜单
LPCTSTR lpszClassName; //类名
} WNDCLASS, *PWNDCLASS;
注册窗口类 返回值为0表示失败 成功返回
ATOM nRet = RegisterClass(&wc);
获取错误信息在工具错误列表查看错误报告或者@err.hr *(int*)(tib+0x34).hr
DWORD dwErrCode = GetLastError();
错误信息显示FormatMessage
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR)&lpMsgBuf,
0,
NULL
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);
// Free the buffer.
LocalFree(lpMsgBuf);
创建窗口实例
HWND CreateWindow(
LPCTSTR lpClassName, //窗口类名
LPCTSTR lpWindowName, //窗口标题
DWORD dwStyle,//窗口属性 一般有ws_overlapped ws_child ws_popup
int nWidth,//窗口宽
int nHeight,//窗口高
HWND hWndParent, 父窗口
HMENU hMenu, 菜单
HANDLE hInstance, //句柄实例
PVOID lpParam );//保留值 用来传值 一般添NULL
显示窗口
BOOL ShowWindow(
HWND hWnd, // handle to window 窗口句柄
int nCmdShow // show state 显示风格
);
一般显示窗口完了后就是更新窗口,两个在一块
更新窗口
UpdateWindow(HWND hWnd);
一般系统将消息投入消息队列,消息队列取出消息分辨窗口句柄,将消息传给回调函数,回调函数分辨消息作用来实现对应的功能
获得消息
BOOL GetMessage(
LPMSG lpMsg,获取的消息指针存入, 比如MSG msg; &msg
HWND hWnd, 窗口句柄
UINT wMsgFilterMin, 获取消息最小值
UINT wMsgFilterMax ); 获取消息最小值
列子
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
回调函数(msdn,没找到相关信息 还有待了解)
LRESULT CALLBACK WindowProc(HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
){};
一般回调函数其他情况会返回以下内容 为将其他情况交给系统默认处理
return DefWindowProc(hwnd, uMsg, wParam, lParam);
switch (uMsg)
{
//如果消息为退出 向消息队列投递退出消息队列信息
case WM_DESTROY:
//向消息队列投递WM_QUIT消息
PostQuitMessage(0);
return 0;
// 鼠标消息,左键按下 返回窗口的坐标属性
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
return 0;
}
default:
break;
}