// // dlgbase.cpp: base class for dialogs // #include "stdafx.h" #include "dlgbase.h" #include "resource.h" #include "wuiids.h" #define TRC_GROUP TRC_GROUP_UI #define TRC_FILE "dlgbase" #include CDlgBase::CDlgBase(HWND hwndOwner, HINSTANCE hInst, DCINT dlgResId) : _hwndOwner(hwndOwner), _hInstance(hInst), _dlgResId(dlgResId) { _hwndDlg = NULL; _startupLeft = _startupTop = 0; } CDlgBase::~CDlgBase() { } /****************************************************************************/ /* Name: DialogBoxProc */ /* */ /* Purpose: Provides message handling for basic operation */ /* */ /* Returns: TRUE - if message dealt with */ /* FALSE otherwise */ /* */ /* Params: See windows documentation */ /* */ /****************************************************************************/ INT_PTR CALLBACK CDlgBase::DialogBoxProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR rc = FALSE; DC_BEGIN_FN("DialogBoxProc"); DC_IGNORE_PARAMETER(lParam); /************************************************************************/ /* Handle dialog messages */ /************************************************************************/ switch(uMsg) { case WM_INITDIALOG: { SetDialogAppIcon(hwndDlg); rc = TRUE; } break; case WM_COMMAND: { switch(DC_GET_WM_COMMAND_ID(wParam)) { case IDCANCEL: { /********************************************************/ /* Closes the dialog */ /********************************************************/ TRC_NRM((TB, _T("Close dialog"))); if(hwndDlg) { EndDialog(hwndDlg, IDCANCEL); } rc = TRUE; } break; default: { /********************************************************/ /* Do Nothing */ /********************************************************/ } break; } } break; case WM_CLOSE: { /****************************************************************/ /* Closes the dialog */ /****************************************************************/ TRC_NRM((TB, _T("Close dialog"))); if(IsWindow(hwndDlg)) { EndDialog(hwndDlg, IDCANCEL); } rc = 0; } break; default: { /****************************************************************/ /* Do Nothing */ /****************************************************************/ } break; } DC_END_FN(); return(rc); } /* DialogBoxProc */ /****************************************************************************/ /* Name: SetDialogAppIcon */ /* */ /* Purpose: Sets the icon for the dialog to the application icon */ /* */ /* Returns: Yes, it does */ /* */ /* Params: IN HWND the dialog for which we want to set the icon */ /* */ /* */ /****************************************************************************/ void CDlgBase::SetDialogAppIcon(HWND hwndDlg) { #ifdef OS_WINCE DC_IGNORE_PARAMETER(hwndDlg); #else // !OS_WINCE HICON hIcon = NULL; hIcon = LoadIcon(_hInstance, MAKEINTRESOURCE(UI_IDI_ICON)); if(hIcon) { #ifdef OS_WIN32 SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); #else //OS_WIN32 SetClassWord(hwndDlg, GCW_HICON, (WORD)hIcon); #endif //OS_WIN32 } #endif // OS_WINCE } /* UISetDialogAppIcon */ /****************************************************************************/ /* Name: EnableDlgItem */ /* */ /* Purpose: Enables or disables a specified dialog control */ /* */ /* Returns: Nothing. */ /* */ /* Params: hwndDlg - dialog window handle */ /* dlgItemId - dialog control id */ /* enabled - TRUE enables the control, FALSE disables it */ /* */ /****************************************************************************/ DCVOID DCINTERNAL CDlgBase::EnableDlgItem( HWND hwndDlg, DCUINT dlgItemId, DCBOOL enabled ) { HWND hwndDlgItem = NULL; DC_BEGIN_FN("EnableDlgItem"); if(hwndDlg) { hwndDlgItem = GetDlgItem(hwndDlg, dlgItemId); } if(hwndDlgItem) { EnableWindow(hwndDlgItem, enabled); } DC_END_FN(); return; } /****************************************************************************/ /* Name: CenterWindowOnParent */ /* */ /* Purpose: Center a window inside another */ /* */ /* Returns: None */ /* */ /* Params: HWND hwndCenterOn (window to center on) */ /* xRatio - horizontal centering factor e.g 2 for (1/2) */ /* yRatio - vertical centering factor e.g 3 for (1/3) /* */ /* */ /****************************************************************************/ VOID CDlgBase::CenterWindow(HWND hwndCenterOn, INT xRatio, INT yRatio) { RECT childRect; RECT parentRect; DCINT xPos; DCINT yPos; LONG desktopX = GetSystemMetrics(SM_CXSCREEN); LONG desktopY = GetSystemMetrics(SM_CYSCREEN); BOOL center = TRUE; DC_BEGIN_FN("CenterWindowOnParent"); TRC_ASSERT(_hwndDlg, (TB, _T("_hwndDlg is NULL...was it set in WM_INITDIALOG?\n"))); if (!_hwndDlg) { TRC_ALT((TB, _T("Window doesn't exist"))); DC_QUIT; } if (!xRatio) { xRatio = 2; } if (!yRatio) { yRatio = 2; } #ifndef OS_WINCE if(!hwndCenterOn) { hwndCenterOn = GetDesktopWindow(); } GetWindowRect(hwndCenterOn, &parentRect); #else /*OS_WINCE*/ if(!hwndCenterOn) { // // WinCE doesn't have GetDesktopWindow() // #if 0 if (g_CEConfig != CE_CONFIG_WBT) { SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)&parentRect, 0); } else #endif { parentRect.left = 0; parentRect.top = 0; parentRect.right = desktopX; parentRect.bottom = desktopY; } } else { GetWindowRect(hwndCenterOn, &parentRect); } #endif/*OS_WINCE*/ GetWindowRect(_hwndDlg, &childRect); /************************************************************************/ /* Calculate the top left - centered in the parent window. */ /************************************************************************/ xPos = ( (parentRect.right + parentRect.left) - (childRect.right - childRect.left)) / xRatio; yPos = ( (parentRect.bottom + parentRect.top) - (childRect.bottom - childRect.top)) / yRatio; /************************************************************************/ /* Constrain to the desktop */ /************************************************************************/ if (xPos < 0) { xPos = 0; } else if (xPos > (desktopX - (childRect.right - childRect.left))) { xPos = desktopX - (childRect.right - childRect.left); } if (yPos < 0) { yPos = 0; } else if (yPos > (desktopY - (childRect.bottom - childRect.top))) { yPos = desktopY - (childRect.bottom - childRect.top); } TRC_DBG((TB, _T("Set dialog position to %u %u"), xPos, yPos)); SetWindowPos(_hwndDlg, NULL, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); DC_EXIT_POINT: DC_END_FN(); return; } /* CenterWindowOnParent */ #ifndef OS_WINCE // // Retreive current dialog position // BOOL CDlgBase::GetPosition(int* pLeft, int* pTop) { if(!pLeft || !pTop) { return FALSE; } if(!_hwndDlg) { return FALSE; } WINDOWPLACEMENT wndPlc; wndPlc.length = sizeof(WINDOWPLACEMENT); if(GetWindowPlacement(_hwndDlg, &wndPlc)) { *pLeft = wndPlc.rcNormalPosition.left; *pTop = wndPlc.rcNormalPosition.top; return TRUE; } return FALSE; } #endif BOOL CDlgBase::SetPosition(int left, int top) { if(!_hwndDlg) { return FALSE; } if(!::SetWindowPos(_hwndDlg, NULL, left, top, 0, 0, SWP_NOZORDER | SWP_NOSIZE)) { return FALSE; } return TRUE; } // // Move the dialog controls // void CDlgBase::RepositionControls(int moveDeltaX, int moveDeltaY, UINT* ctlIDs, int numID) { if(_hwndDlg) { for(int i=0; i< numID; i++) { HWND hwndCtrl = GetDlgItem(_hwndDlg, ctlIDs[i]); if( hwndCtrl) { RECT rc; GetWindowRect( hwndCtrl, &rc); MapWindowPoints( NULL, _hwndDlg, (LPPOINT)&rc, 2); OffsetRect( &rc, moveDeltaX, moveDeltaY); SetWindowPos( hwndCtrl, NULL, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } } } } // // Shows+enable or Hide+disable controls // void CDlgBase::EnableControls(UINT* ctlIDs, int numID, BOOL bEnable) { if(_hwndDlg) { for(int i=0; i< numID; i++) { HWND hwndCtrl = GetDlgItem(_hwndDlg, ctlIDs[i]); if( hwndCtrl) { EnableWindow( hwndCtrl, bEnable); ShowWindow(hwndCtrl, bEnable ? SW_SHOW : SW_HIDE); } } } } // // DoLockDlgRes - loads and locks a dialog template // returns address of locked resource // lpszResName - name of resource // DLGTEMPLATE* CDlgBase::DoLockDlgRes(LPCTSTR lpszResName) { #ifdef OS_WINCE HRSRC hrsrc = FindResource(GetModuleHandle(NULL), lpszResName, RT_DIALOG); #else HRSRC hrsrc = FindResource(NULL, lpszResName, RT_DIALOG); #endif if(!hrsrc) { return NULL; } HGLOBAL hglb = LoadResource( _hInstance, hrsrc); return (DLGTEMPLATE*) LockResource(hglb); }