依然是贺岁篇!!亲,不要不耐烦哈!在上节中和大家糊里糊涂地分析下了HelloWorld运行的逻辑,细心的朋友肯定会发现,我提到过显示窗口、消息循环,发现问题所在了吧,就是为啥没有注册窗口类,创建窗口和窗口处理函数??
我想你肯定再说我一点也不专业,实不相瞒,确实是很不专业,来来,继续分析,我们回到 CCApplication::run():
- int CCApplication::run()
- {
- PVRFrameEnableControlWindow(false);
-
-
- MSG msg;
- LARGE_INTEGER nFreq;
- LARGE_INTEGER nLast;
- LARGE_INTEGER nNow;
-
- QueryPerformanceFrequency(&nFreq);
- QueryPerformanceCounter(&nLast);
-
-
-
- if (!applicationDidFinishLaunching())
- {
- return 0;
- }
-
-
- CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();
- pMainWnd->centerWindow();
-
-
- ShowWindow(pMainWnd->getHWnd(), SW_SHOW);
-
-
- while (1)
- {
- if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
-
- QueryPerformanceCounter(&nNow);
-
-
- if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)
- {
- nLast.QuadPart = nNow.QuadPart;
- CCDirector::sharedDirector()->mainLoop();
- }
- else
- {
- Sleep(0);
- }
- continue;
- }
-
- if (WM_QUIT == msg.message)
- {
-
- break;
- }
-
-
- if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
-
- return (int) msg.wParam;
- }
请看22行代码,老规矩,进去看看,不进虎穴,焉得虎子?
跳转到sharedOpenGLView的定义:
- CCEGLView* CCEGLView::sharedOpenGLView()
- {
-
- static CCEGLView* s_pEglView = NULL;
- if (s_pEglView == NULL)
- {
-
- s_pEglView = new CCEGLView();
- }
- return s_pEglView;
- }
仔细看看此时的文件,你会发现你想要的都在这里,我截取部分吧:
-
- bool CCEGLView::Create(LPCTSTR pTitle, int w, int h)
- {
- bool bRet = false;
- do
- {
- CC_BREAK_IF(m_hWnd);
-
- HINSTANCE hInstance = GetModuleHandle( NULL );
- WNDCLASS wc;
-
-
- wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
- wc.lpfnWndProc = _WindowProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
- wc.hCursor = LoadCursor( NULL, IDC_ARROW );
- wc.hbrBackground = NULL;
- wc.lpszMenuName = m_menu;
- wc.lpszClassName = kWindowClassName;
-
- CC_BREAK_IF(! RegisterClass(&wc) && 1410 != GetLastError());
-
-
- RECT rcDesktop;
- GetWindowRect(GetDesktopWindow(), &rcDesktop);
-
- WCHAR wszBuf[50] = {0};
- MultiByteToWideChar(CP_UTF8, 0, m_szViewName, -1, wszBuf, sizeof(wszBuf));
-
-
- m_hWnd = CreateWindowEx(
- WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,
- kWindowClassName,
- wszBuf,
- WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,
- 0, 0,
- 0,
- 0,
- NULL,
- NULL,
- hInstance,
- NULL );
-
- CC_BREAK_IF(! m_hWnd);
-
- resize(w, h);
-
- bRet = initGL();
- CC_BREAK_IF(!bRet);
-
- s_pMainWindow = this;
- bRet = true;
- } while (0);
-
- return bRet;
- }
-
- LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- BOOL bProcessed = FALSE;
-
- switch (message)
- {
- case WM_LBUTTONDOWN:
- if (m_pDelegate && MK_LBUTTON == wParam)
- {
- POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)};
- CCPoint pt(point.x/CC_CONTENT_SCALE_FACTOR(), point.y/CC_CONTENT_SCALE_FACTOR());
- CCPoint tmp = ccp(pt.x, m_obScreenSize.height - pt.y);
- if (m_obViewPortRect.equals(CCRectZero) || m_obViewPortRect.containsPoint(tmp))
- {
- m_bCaptured = true;
- SetCapture(m_hWnd);
- int id = 0;
- pt.x *= m_windowTouchScaleX;
- pt.y *= m_windowTouchScaleY;
- handleTouchesBegin(1, &id, &pt.x, &pt.y);
- }
- }
- break;
-
- case WM_MOUSEMOVE:
- if (MK_LBUTTON == wParam && m_bCaptured)
- {
- POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)};
- CCPoint pt(point.x/CC_CONTENT_SCALE_FACTOR(), point.y/CC_CONTENT_SCALE_FACTOR());
- int id = 0;
- pt.x *= m_windowTouchScaleX;
- pt.y *= m_windowTouchScaleY;
- handleTouchesMove(1, &id, &pt.x, &pt.y);
- }
- break;
-
- case WM_LBUTTONUP:
- if (m_bCaptured)
- {
- POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)};
- CCPoint pt(point.x/CC_CONTENT_SCALE_FACTOR(), point.y/CC_CONTENT_SCALE_FACTOR());
- int id = 0;
- pt.x *= m_windowTouchScaleX;
- pt.y *= m_windowTouchScaleY;
- handleTouchesEnd(1, &id, &pt.x, &pt.y);
-
- ReleaseCapture();
- m_bCaptured = false;
- }
- break;
- case WM_SIZE:
- switch (wParam)
- {
- case SIZE_RESTORED:
- CCApplication::sharedApplication()->applicationWillEnterForeground();
- break;
- case SIZE_MINIMIZED:
- CCApplication::sharedApplication()->applicationDidEnterBackground();
- break;
- }
- break;
- case WM_KEYDOWN:
- if (wParam == VK_F1 || wParam == VK_F2)
- {
- CCDirector* pDirector = CCDirector::sharedDirector();
- if (GetKeyState(VK_LSHIFT) < 0 || GetKeyState(VK_RSHIFT) < 0 || GetKeyState(VK_SHIFT) < 0)
- pDirector->getKeypadDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked);
- }
- if ( m_lpfnAccelerometerKeyHook!=NULL )
- {
- (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam );
- }
- break;
- case WM_KEYUP:
- if ( m_lpfnAccelerometerKeyHook!=NULL )
- {
- (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam );
- }
- break;
- case WM_CHAR:
- {
- if (wParam < 0x20)
- {
- if (VK_BACK == wParam)
- {
- CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward();
- }
- else if (VK_RETURN == wParam)
- {
- CCIMEDispatcher::sharedDispatcher()->dispatchInsertText("\n", 1);
- }
- else if (VK_TAB == wParam)
- {
-
- }
- else if (VK_ESCAPE == wParam)
- {
-
-
- }
- }
- else if (wParam < 128)
- {
-
- CCIMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&wParam, 1);
- }
- else
- {
- char szUtf8[8] = {0};
- int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&wParam, 1, szUtf8, sizeof(szUtf8), NULL, NULL);
- CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen);
- }
- if ( m_lpfnAccelerometerKeyHook!=NULL )
- {
- (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam );
- }
- }
- break;
- case WM_PAINT:
- PAINTSTRUCT ps;
- BeginPaint(m_hWnd, &ps);
- EndPaint(m_hWnd, &ps);
- break;
-
- case WM_CLOSE:
- CCDirector::sharedDirector()->end();
- break;
-
- case WM_DESTROY:
- destroyGL();
- PostQuitMessage(0);
- break;
-
- default:
- if (m_wndproc)
- {
-
- m_wndproc(message, wParam, lParam, &bProcessed);
- if (bProcessed) break;
- }
- return DefWindowProc(m_hWnd, message, wParam, lParam);
- }
-
- if (m_wndproc && !bProcessed)
- {
- m_wndproc(message, wParam, lParam, &bProcessed);
- }
- return 0;
- }
到目前为此,windows程序的那三把斧头都找到了。。。。也不早了,想睡觉觉去了。
第一次写学习博文,不足之处请原谅,由于水平有限,此博文仅是为了抛砖引玉,如有错误之处,忘勘正,勘正热线QQ947491240,谢谢!!我们下节见!!