// Dialog definitions ***************************** #include #pragma hdrstop #include #include #include #include Dialog *D; BOOL PASCAL DialogHandler (HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam); Dialog::Dialog(Object *Parent ,int Id, char *Sect) : Object(Parent) { lpProcDialog = (DLGPROC) MakeProcInstance( (FARPROC)DialogHandler, App::hInstance); ID=Id; hWnd=0; Section=Sect; } Dialog::~Dialog() { if (hWnd) { if (IsModal) ::EndDialog(hWnd,IDCANCEL); else DestroyWindow(hWnd); //destroy modeless dialog } FreeProcInstance( (FARPROC)lpProcDialog); } int Dialog::Execute() { IsModal=TRUE; D=this; // temp storage to initialise return DialogBox(App::hInstance, MAKEINTRESOURCE(ID), ParentHWnd,lpProcDialog); } static BYTE* offsetDWord(BYTE* ptr) { int offset = (int)(DWORD_PTR)ptr; if (offset & 3) return ptr + (4 - (offset & 3)); return ptr; } int Dialog::ExecuteWithFont() { IsModal=TRUE; D=this; // temp storage to initialise int code = -1; NONCLIENTMETRICS ncm; ::ZeroMemory(&ncm,sizeof ncm); ncm.cbSize = sizeof ncm; ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof ncm,&ncm,0); OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof osvi; ::GetVersionEx(&osvi); WCHAR fontName[256]; MultiByteToWideChar(CP_ACP,0, ncm.lfMessageFont.lfFaceName,strlen(ncm.lfMessageFont.lfFaceName)+1,fontName,256); HRSRC resInfo = FindResource(App::hInstance,MAKEINTRESOURCE(ID),RT_DIALOG); if (resInfo != 0) { DWORD resSize = SizeofResource(App::hInstance,resInfo); HGLOBAL resGlobal = LoadResource(App::hInstance,resInfo); if (resGlobal != 0) { BYTE* resMem = (BYTE*)LockResource(resGlobal); if (resMem != NULL) { HGLOBAL copyGlobal = GlobalAlloc(GMEM_ZEROINIT,resSize+64); if (copyGlobal != 0) { BYTE* copyMem = (BYTE*)GlobalLock(copyGlobal); if (copyMem != 0) { int titleLen = (wcslen(((WCHAR*)resMem)+15)+1)*sizeof(WCHAR); int copy1Size = (18*sizeof(WORD))+titleLen; int font1Len = (wcslen((WCHAR*)(resMem+copy1Size))+1)*sizeof(WCHAR); int copy2Size = resSize-copy1Size-font1Len; int font2Len = (wcslen(fontName)+1)*sizeof(WCHAR); memcpy(copyMem,resMem,copy1Size); wcscpy((WCHAR*)(copyMem+copy1Size),fontName); memcpy(offsetDWord(copyMem+copy1Size+font2Len),offsetDWord(resMem+copy1Size+font1Len),copy2Size); *((WORD*)(copyMem+copy1Size-(3*sizeof(WORD)))) = (osvi.dwMajorVersion < 6) ? 8 : 9; GlobalUnlock(copyGlobal); } code = DialogBoxIndirect(App::hInstance,(LPDLGTEMPLATE)copyGlobal,ParentHWnd,lpProcDialog); GlobalFree(copyGlobal); } } } } return code; } BOOL Dialog::Create() { IsModal=FALSE; D=this; // modeless dialog creation hWnd=CreateDialog(App::hInstance, MAKEINTRESOURCE(ID), ParentHWnd,lpProcDialog); return hWnd!=NULL; } BOOL Dialog::SetupWindow() { return TRUE; } void Dialog::EndDialog(int) {} // Call from EndDialog() void Dialog::SaveDialogPos() { RECT rc; GetWindowRect(hWnd,&rc); WriteIniString(Section,"Position",String()<< (int) rc.left << ',' << (int) rc.top); } // call this from SetupWindow void Dialog::GetDialogPos() { RECT rc; // if this puts dialog completely offscreen, then dont do it??? String S; ReadIniString(Section,"Position",S); if (!S.Empty()) { Parse P(S); P >> rc.left >> rc.top; SetWindowPos(hWnd,0,rc.left,rc.top,0,0,SWP_NOSIZE | SWP_NOZORDER); } } void Dialog::CentreDlgOnParent() { RECT rc; GetWindowRect(ParentHWnd,&rc); int x=(rc.left+rc.right)/2; int y=(rc.top+rc.bottom)/2; GetClientRect(hWnd,&rc); SetWindowPos(hWnd,0,x-rc.right/2,y-rc.bottom/2,0,0,SWP_NOSIZE | SWP_NOZORDER); } void Dialog::KillDialog(int Value) { if (Value==IDOK) { if (!CanClose()) return; if (Section) SaveDialogPos(); } EndDialog(Value); if (IsModal) ::EndDialog(hWnd, Value); else { DestroyWindow(hWnd); } } void Dialog::Paint(HDC, BOOL, RECT&) {} BOOL Dialog::ChildIDMessage(UINT id ,TMSG &Msg) { return ChildMessage(GetDlgItem(hWnd,id),Msg); } BOOL Dialog::ChildMessage(HWND hw,TMSG &Msg) { Object *Child=FirstChild(); while (Child) { if (Child->hWnd==hw) return Child->WndProc(Msg); Child=NextChild(Child); } return FALSE; } // if breakpoint is set in this code then dialogs lose their modalness ????? BOOL PASCAL DialogHandler (HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam) { //allow user to grab any message Dialog *Dlg; if ( (Dlg=(Dialog*)WindowInfo::Find(hDlg) )==NULL) { if (D==NULL) return FALSE; new WindowInfo((Object*) (Dlg=D),hDlg); D=NULL; } TMSG Msg={uMessage,wParam,lParam,0}; if (Dlg->EV_FIND(Msg)) return TRUE; switch (uMessage) { case WM_INITDIALOG: Dlg->hWnd=hDlg; Dlg->SetupWindow(); if (Dlg->Section) Dlg->GetDialogPos(); return TRUE; case WM_DESTROY: //if main window? if (Dlg==App::MainWindow) PostQuitMessage(0); WindowInfo::Delete(hDlg); Dlg->hWnd=NULL; return TRUE; case WM_PAINT: PAINTSTRUCT ps; BeginPaint(Dlg->hWnd, (LPPAINTSTRUCT) &ps); Dlg->Paint(ps.hdc,ps.fErase,ps.rcPaint); EndPaint(Dlg->hWnd, (LPPAINTSTRUCT) &ps); return TRUE; case WM_DRAWITEM: return Dlg->ChildIDMessage((UINT) wParam,Msg); #ifndef WIN32 case WM_CTLCOLOR: return Dlg->ChildMessage((HWND) LOWORD(lParam),Msg); #endif case WM_COMMAND: switch (wParam) { case IDOK: case IDCANCEL: Dlg->KillDialog(wParam); return (TRUE); default: #ifndef WIN32 return Dlg->ChildMessage((HWND) LOWORD(lParam),Msg); #else return Dlg->ChildMessage((HWND) lParam,Msg); #endif } // switch (wParam) } // switch (uMessage) return FALSE; }