|
|
//
// 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 <atrcapi.h>
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); }
|