#include "compatadmin.h" BOOL CWindow::Create( LPCTSTR szClassName, LPCTSTR szWindowTitle, int nX, int nY, int nWidth, int nHeight, CWindow * pParent, HMENU nMenuID, DWORD dwExFlags, DWORD dwFlags) { HWND hParent = NULL; HMENU hMenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(nMenuID)); int nTries = 0; if ( NULL == hMenu ) hMenu = nMenuID; if ( NULL != pParent ) hParent = pParent->m_hWnd; do { // Attempt to create the window as provided to the class. // If this fails that means that the window class does not exist and we have to make a new window //class m_hWnd = ::CreateWindowEx( dwExFlags, szClassName, szWindowTitle, dwFlags, nX, nY, nWidth, nHeight, hParent, hMenu, g_hInstance, this);// This is the window-creation application data // Failed? if ( NULL == m_hWnd ) { // If the creation failed, register the class // and try again. WNDCLASS wc; ZeroMemory(&wc,sizeof(wc)); wc.style = CS_DBLCLKS; wc.lpfnWndProc = MsgProc; wc.hInstance = g_hInstance; wc.hIcon = ::LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_COMPATADMIN)); wc.hCursor = ::LoadCursor(g_hInstance,TEXT("AppCursor")); if ( NULL == wc.hCursor ) wc.hCursor = ::LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszClassName = szClassName; // If the registration failed, it's probably already // registered. Failure is then severe enough to fail // the call immediately. if ( 0 == ::RegisterClass(&wc)){ MessageBox(NULL,TEXT("This program needs an operating system with UNICODE support to execute properly !"),TEXT("Error"),MB_ICONERROR); return FALSE; } } ++nTries; } while ( NULL == m_hWnd && 1 >= nTries ); return(NULL == m_hWnd) ? FALSE:TRUE; } void CWindow::Refresh(void) { InvalidateRect(m_hWnd,NULL,TRUE); UpdateWindow(m_hWnd); } void CWindow::msgCommand(UINT uID,HWND hSender) { } void CWindow::msgCreate(void) { } void CWindow::msgClose(void) { } void CWindow::msgResize(UINT uWidth, UINT uHeight) { } void CWindow::msgPaint(HDC hDC) { } void CWindow::msgEraseBackground(HDC hDC) { RECT rRect; GetClientRect(m_hWnd,&rRect); ++rRect.right; ++rRect.bottom; FillRect(hDC,&rRect,(HBRUSH) (COLOR_WINDOW + 1)); } void CWindow::msgChar(TCHAR chChar) { } void CWindow::msgNotify(LPNMHDR pHdr) { } LRESULT CWindow::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam) { switch ( uMsg ) { case WM_KEYDOWN: { } break; case WM_CHAR: { msgChar((TCHAR)wParam); } break; case WM_CREATE: { msgCreate(); } break; case WM_CLOSE: { msgClose(); } break; case WM_COMMAND: { msgCommand(LOWORD(wParam),(HWND)lParam); } break; case WM_NOTIFY: { msgNotify((LPNMHDR) lParam); } break; case WM_PAINT: { HDC hDC; PAINTSTRUCT ps; int nSave; hDC = ::BeginPaint(m_hWnd,&ps); nSave = SaveDC(hDC); msgPaint(hDC); RestoreDC(hDC,nSave); ::EndPaint(m_hWnd,&ps); } break; case WM_ERASEBKGND: { HDC hDC = (HDC) wParam; msgEraseBackground(hDC); } return 1; case WM_SIZE: { UINT uWidth = LOWORD(lParam); UINT uHeight = HIWORD(lParam); msgResize(uWidth,uHeight); } break; default: return DefWindowProc(m_hWnd,uMsg,wParam,lParam); } return 0; } //RTTI needed. LRESULT CALLBACK CWindow::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CWindow * pWnd; // Wrap this in a try-except. If we assert inside the window proc, // RTTI may throw instead of return NULL. __try { pWnd = dynamic_cast ((CWindow *)GetWindowLongPtr(hWnd,GWLP_USERDATA)); } __except(1) { pWnd = NULL; } // If the window is being created, record the "this" pointer with the window. if ( WM_CREATE == uMsg ) { LPCREATESTRUCT lpCS = (LPCREATESTRUCT) lParam; pWnd = dynamic_cast ((CWindow *) lpCS->lpCreateParams); assert(NULL != pWnd);//TEXT("CreateWindow was called on a class owned by CWindow outside of CWindow::Create()")); // Write the class pointer. if ( NULL != pWnd ) { pWnd->m_hWnd = hWnd; ::SetWindowLongPtr(hWnd,GWLP_USERDATA,(LONG_PTR) pWnd); } else { // Critical failure. CreateWindow was called on a class that we // own, but wasn't called through the class. Fail the create call. return -1; } } assert(((CWindow *) GetWindowLongPtr(hWnd,GWLP_USERDATA)) == pWnd);//,TEXT("GetWindowLongPtr data has been corrupted")); // Dispatch the message to the class based window proc if ( NULL != pWnd ) return pWnd->MsgProc(uMsg,wParam,lParam); // The window hasn't recorded the class "this" pointer yet. So, // perform default processing on the message. return DefWindowProc(hWnd,uMsg,wParam,lParam); }