问题1:cocos2d-x应用程序如何创建win窗口?
GetMessage: 从线程的消息队列取出一个消息 ;
TranslateMessage: 将msg结构传给Windows,进行一些转换,比如A键按下,转换成WM_CHAR消息等
DispatchMessage():再将msg结构传给Windows,Windows将该消息发给窗口过程,由窗口过程处理.
GetMessage是从系统为每个应用程序自动分配的消息对列的头部得到一个消息。
TranslateMessage是对一些键盘事件做预处理。
TranslateMessage是翻译需要翻译的消息
DispatchMessage()则会把翻译好的消息发送到系统的消息处理函数中,而这个函数又会把这个消息传递到注册窗体时用户指定的消息处理函数中。翻译消息不是简单的转换,一个消息被翻译后,可能会产生几个消息。实战:
1) 新建项目、win32项目、填写名称及选择项目存储路径;根据 Win32 应用程序向导(windows应用程序),进行项目创建。分析源代码。
2) 注意:项目属性、不适unicode字符集;
3)程序进入点WinMain、窗口类注册与窗口诞生、启动消息循环、回调窗口过程。请仔细分析;点击鼠标或键盘,win处理流程
1、 点击鼠标、鼠标发电信号,给鼠标驱动;
2、 鼠标驱动通过中断,发给win内核;
3、 win内核产生消息队列,并通知响应win应用窗口程序
4、 win应用程序处理消息。对应代码,在winproc回到地方,进行代码处理。
5、 编写键盘点击事件。
以上流程请仔细分析哪些是win操作系统做的,哪些是win应用程序做的。
代码模型: int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。 MSG msg; HACCEL hAccelTable;
// 初始化全局字符串 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WIN3202, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance);
// 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; }
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN3202));
// 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
return (int) msg.wParam; }
|
// // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc;
switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break;
default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break;
case WM_KEYDOWN: MessageBox(hWnd, "bombing lptest", "bombing caption", 0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } |