273 lines
6.4 KiB
C++
273 lines
6.4 KiB
C++
#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 *> ((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 *> ((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);
|
|
}
|