|
|
1.1 ! root 1: // This is a part of the Microsoft Foundation Classes C++ library. ! 2: // Copyright (C) 1992 Microsoft Corporation ! 3: // All rights reserved. ! 4: // ! 5: // This source code is only intended as a supplement to the ! 6: // Microsoft Foundation Classes Reference and Microsoft ! 7: // QuickHelp documentation provided with the library. ! 8: // See these sources for detailed information regarding the ! 9: // Microsoft Foundation Classes product. ! 10: ! 11: ! 12: #include "afxwin.h" ! 13: #pragma hdrstop ! 14: ! 15: #include "afxdlgs.h" // standard AFX dialogs ! 16: ! 17: #include "stddef.h" // for offsetof macro ! 18: #include "window_.h" // for hooks and other internals ! 19: #include "dlgs.h" // for standard control IDs for commdlg ! 20: ! 21: #ifdef AFX_CORE_SEG ! 22: #pragma code_seg(AFX_AUX_SEG) ! 23: #endif ! 24: ! 25: #ifdef _DEBUG ! 26: #undef THIS_FILE ! 27: static char BASED_CODE THIS_FILE[] = __FILE__; ! 28: #define new DEBUG_NEW ! 29: #endif ! 30: ! 31: static char BASED_CODE szLBSELCH[] = LBSELCHSTRING; ! 32: static char BASED_CODE szSHAREVI[] = SHAREVISTRING; ! 33: static char BASED_CODE szFILEOK[] = FILEOKSTRING; ! 34: static char BASED_CODE szCOLOROK[] = COLOROKSTRING; ! 35: static char BASED_CODE szSETRGB[] = SETRGBSTRING; ! 36: ! 37: static UINT nMsgLBSELCHANGE = ::RegisterWindowMessage(szLBSELCH); ! 38: static UINT nMsgSHAREVI = ::RegisterWindowMessage(szSHAREVI); ! 39: static UINT nMsgFILEOK = ::RegisterWindowMessage(szFILEOK); ! 40: static UINT nMsgCOLOROK = ::RegisterWindowMessage(szCOLOROK); ! 41: static UINT nMsgSETRGB = ::RegisterWindowMessage(szSETRGB); ! 42: ! 43: typedef UINT (FAR PASCAL* COMMDLGPROC)(HWND, UINT, UINT, LONG); ! 44: ! 45: UINT FAR PASCAL AFX_EXPORT ! 46: _AfxCommDlgProc(HWND hWnd, register UINT message, UINT wParam, LONG lParam) ! 47: { ! 48: if (message == WM_SETFONT || message == WM_INITDIALOG) ! 49: return (UINT)_AfxDlgProc(hWnd, message, wParam, lParam); ! 50: ! 51: if (message < 0xC000) ! 52: // not a ::RegisterWindowMessage message ! 53: return 0; ! 54: ! 55: // RegisterWindowMessage - does not copy to lastState buffer, so ! 56: // CWnd::GetCurrentMessage and CWnd::Default will NOT work ! 57: // while in these handlers ! 58: ! 59: // Get our Window ! 60: // assume it is already wired up to a permanent one ! 61: CDialog* pDlg = (CDialog*) CWnd::FromHandlePermanent(hWnd); ! 62: ASSERT(pDlg != NULL); ! 63: ASSERT(pDlg->m_hWnd == hWnd); ! 64: ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CDialog))); ! 65: ! 66: // Dispatch special commdlg messages through our virtual callbacks ! 67: if (message == nMsgSHAREVI) ! 68: { ! 69: ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CFileDialog))); ! 70: return ((CFileDialog*)pDlg)->OnShareViolation((LPCSTR)lParam); ! 71: } ! 72: else if (message == nMsgFILEOK) ! 73: { ! 74: ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CFileDialog))); ! 75: return ((CFileDialog*)pDlg)->OnFileNameOK(); ! 76: } ! 77: else if (message == nMsgLBSELCHANGE) ! 78: { ! 79: ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CFileDialog))); ! 80: ((CFileDialog*)pDlg)->OnLBSelChangedNotify(wParam, LOWORD(lParam), ! 81: HIWORD(lParam)); ! 82: return 0; ! 83: } ! 84: else if (message == nMsgCOLOROK) ! 85: { ! 86: ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CColorDialog))); ! 87: return ((CColorDialog*)pDlg)->OnColorOK(); ! 88: } ! 89: else if (message == nMsgSETRGB) ! 90: { ! 91: // nothing to do here, since this is a SendMessage ! 92: return 0; ! 93: } ! 94: ! 95: TRACE("_AfxCommDlgProc: received unknown user message, returning 0\n"); ! 96: return 0; ! 97: } ! 98: ! 99: //////////////////////////////////////////////////////////////////////////// ! 100: // FileOpen/FileSaveAs common dialog helper ! 101: ! 102: IMPLEMENT_DYNAMIC(CFileDialog, CModalDialog) ! 103: ! 104: CFileDialog::CFileDialog(BOOL bOpenFileDialog, ! 105: LPCSTR lpszDefExt /* = NULL */, ! 106: LPCSTR lpszFileName /* = NULL */, ! 107: DWORD dwFlags /* = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT */, ! 108: LPCSTR lpszFilter /* = NULL */, ! 109: CWnd* pParentWnd /* = NULL */) : CModalDialog((UINT)0, pParentWnd) ! 110: { ! 111: memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL ! 112: m_szFileName[0] = '\0'; ! 113: m_szFileTitle[0] = '\0'; ! 114: ! 115: m_bOpenFileDialog = bOpenFileDialog; ! 116: ! 117: m_ofn.lStructSize = sizeof(m_ofn); ! 118: ! 119: if (m_pParentWnd != NULL) ! 120: m_ofn.hwndOwner = m_pParentWnd->m_hWnd; ! 121: else ! 122: m_ofn.hwndOwner = AfxGetApp()->m_pMainWnd->GetSafeHwnd(); ! 123: m_ofn.lpstrFile = (LPSTR)&m_szFileName; ! 124: m_ofn.nMaxFile = sizeof(m_szFileName); ! 125: m_ofn.lpstrDefExt = lpszDefExt; ! 126: m_ofn.lpstrFileTitle = (LPSTR)m_szFileTitle; ! 127: m_ofn.nMaxFileTitle = sizeof(m_szFileTitle); ! 128: ! 129: m_ofn.Flags |= dwFlags | OFN_ENABLEHOOK; ! 130: m_ofn.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc; ! 131: ! 132: // setup initial file name ! 133: if (lpszFileName) ! 134: { ! 135: _fstrncpy(m_szFileName, lpszFileName, sizeof(m_szFileName)); ! 136: m_szFileName[sizeof(m_szFileName)-1] = '\0'; ! 137: } ! 138: ! 139: // Translate filter into commdlg format (lots of \0) ! 140: if (lpszFilter) ! 141: { ! 142: int nLen = _fstrlen(lpszFilter); ! 143: ! 144: m_strFilter.GetBuffer(_fstrlen(lpszFilter)); // required because of '\0' ! 145: while (*lpszFilter) ! 146: { ! 147: if (*lpszFilter == '|') // MFC delimits with ':' not '\0' ! 148: m_strFilter += (char)'\0'; ! 149: else ! 150: m_strFilter += *lpszFilter; ! 151: lpszFilter++; ! 152: } ! 153: m_ofn.lpstrFilter = m_strFilter; ! 154: m_strFilter.ReleaseBuffer(nLen); ! 155: } ! 156: } ! 157: ! 158: int ! 159: CFileDialog::DoModal() ! 160: { ! 161: ASSERT_VALID(this); ! 162: ASSERT(m_ofn.Flags & OFN_ENABLEHOOK); ! 163: ASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook ! 164: ! 165: BOOL bResult; ! 166: ! 167: _AfxHookWindowCreate(this); ! 168: ! 169: if (m_bOpenFileDialog) ! 170: bResult = ::GetOpenFileName(&m_ofn); ! 171: else ! 172: bResult = ::GetSaveFileName(&m_ofn); ! 173: ! 174: _AfxUnhookWindowCreate(); // just in case ! 175: Detach(); // just in case ! 176: ! 177: return bResult ? IDOK : IDCANCEL; ! 178: } ! 179: ! 180: CString CFileDialog::GetFileName() const ! 181: { ! 182: ASSERT_VALID(this); ! 183: char szFile[32]; ! 184: ! 185: if (m_ofn.nFileExtension == 0 || ! 186: m_ofn.lpstrFile[m_ofn.nFileExtension] == '\0') ! 187: return m_ofn.lpstrFile + m_ofn.nFileOffset; ! 188: else ! 189: { ! 190: int nFileLen = m_ofn.nFileExtension - m_ofn.nFileOffset - 1; ! 191: _fstrncpy(szFile, m_ofn.lpstrFile + m_ofn.nFileOffset, nFileLen); ! 192: szFile[nFileLen] = '\0'; ! 193: return szFile; ! 194: } ! 195: } ! 196: ! 197: UINT ! 198: CFileDialog::OnShareViolation(LPCSTR) ! 199: { ! 200: ASSERT_VALID(this); ! 201: ! 202: // Do not call Default() if you override ! 203: return OFN_SHAREWARN; // default ! 204: } ! 205: ! 206: BOOL ! 207: CFileDialog::OnFileNameOK() ! 208: { ! 209: ASSERT_VALID(this); ! 210: ! 211: // Do not call Default() if you override ! 212: return FALSE; ! 213: } ! 214: ! 215: void ! 216: CFileDialog::OnLBSelChangedNotify(UINT, UINT, UINT) ! 217: { ! 218: ASSERT_VALID(this); ! 219: ! 220: // Do not call Default() if you override ! 221: // no default processing needed ! 222: } ! 223: ! 224: void ! 225: CFileDialog::OnOK() ! 226: { ! 227: // Common dialogs do not require ::EndDialog ! 228: ASSERT_VALID(this); ! 229: Default(); ! 230: } ! 231: ! 232: void ! 233: CFileDialog::OnCancel() ! 234: { ! 235: // Common dialogs do not require ::EndDialog ! 236: ASSERT_VALID(this); ! 237: Default(); ! 238: } ! 239: ! 240: #ifdef _DEBUG ! 241: void ! 242: CFileDialog::Dump(CDumpContext& dc) const ! 243: { ! 244: ASSERT_VALID(this); ! 245: ! 246: CModalDialog::Dump(dc); ! 247: ! 248: if (m_bOpenFileDialog) ! 249: dc << "\nFile open dialog"; ! 250: else ! 251: dc << "\nFile save dialog"; ! 252: dc << "\nm_ofn.hwndOwner = " << (void NEAR*)m_ofn.hwndOwner; ! 253: dc << "\nm_ofn.nFilterIndex = " << m_ofn.nFilterIndex; ! 254: dc << "\nm_ofn.lpstrFile = " << m_ofn.lpstrFile; ! 255: dc << "\nm_ofn.nMaxFile = " << m_ofn.nMaxFile; ! 256: dc << "\nm_ofn.lpstrFileTitle = " << m_ofn.lpstrFileTitle; ! 257: dc << "\nm_ofn.nMaxFileTitle = " << m_ofn.nMaxFileTitle; ! 258: dc << "\nm_ofn.lpstrTitle = " << m_ofn.lpstrTitle; ! 259: dc << "\nm_ofn.Flags = " << (LPVOID)m_ofn.Flags; ! 260: dc << "\nm_ofn.lpstrDefExt = " << m_ofn.lpstrDefExt; ! 261: dc << "\nm_ofn.nFileOffset = " << m_ofn.nFileOffset; ! 262: dc << "\nm_ofn.nFileExtension = " << m_ofn.nFileExtension; ! 263: ! 264: dc << "\nm_ofn.lpstrFilter = "; ! 265: LPCSTR lpstrItem = m_ofn.lpstrFilter; ! 266: char* szBreak = "|"; ! 267: ! 268: while (lpstrItem != NULL && *lpstrItem != '\0') ! 269: { ! 270: dc << lpstrItem << szBreak; ! 271: lpstrItem += _fstrlen(lpstrItem) + 1; ! 272: } ! 273: if (lpstrItem != NULL) ! 274: dc << szBreak; ! 275: ! 276: dc << "\nm_ofn.lpstrCustomFilter = "; ! 277: lpstrItem = m_ofn.lpstrCustomFilter; ! 278: while (lpstrItem != NULL && *lpstrItem != '\0') ! 279: { ! 280: dc << lpstrItem << szBreak; ! 281: lpstrItem += _fstrlen(lpstrItem) + 1; ! 282: } ! 283: if (lpstrItem != NULL) ! 284: dc << szBreak; ! 285: ! 286: if (m_ofn.lpfnHook == (COMMDLGPROC)_AfxCommDlgProc) ! 287: dc << "\nhook function set to standard MFC hook function"; ! 288: else ! 289: dc << "\nhook function set to non-standard hook function"; ! 290: } ! 291: #endif ! 292: ! 293: ! 294: ///////////////////////////////////////////////////////////////////////////// ! 295: // Choose Color dialog ! 296: ! 297: IMPLEMENT_DYNAMIC(CColorDialog, CModalDialog) ! 298: ! 299: COLORREF CColorDialog::clrSavedCustom[16] = { RGB(255, 255, 255), ! 300: RGB(255, 255, 255), RGB(255, 255, 255), RGB(255, 255, 255), ! 301: RGB(255, 255, 255), RGB(255, 255, 255), RGB(255, 255, 255), ! 302: RGB(255, 255, 255), RGB(255, 255, 255), RGB(255, 255, 255), ! 303: RGB(255, 255, 255), RGB(255, 255, 255), RGB(255, 255, 255), ! 304: RGB(255, 255, 255), RGB(255, 255, 255), RGB(255, 255, 255) }; ! 305: ! 306: CColorDialog::CColorDialog(COLORREF clrInit /* = 0 */, ! 307: DWORD dwFlags /* = 0 */, ! 308: CWnd* pParentWnd /* = NULL */) : CModalDialog((UINT)0, pParentWnd) ! 309: { ! 310: memset(&m_cc, 0, sizeof(m_cc)); ! 311: ! 312: m_cc.lStructSize = sizeof(m_cc); ! 313: if (m_pParentWnd != NULL) ! 314: m_cc.hwndOwner = m_pParentWnd->m_hWnd; ! 315: else ! 316: m_cc.hwndOwner = AfxGetApp()->m_pMainWnd->GetSafeHwnd(); ! 317: m_cc.lpCustColors = (COLORREF FAR*)&clrSavedCustom; ! 318: m_cc.Flags = dwFlags | CC_ENABLEHOOK; ! 319: m_cc.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc; ! 320: ! 321: if ((m_cc.rgbResult = clrInit) != 0) ! 322: m_cc.Flags |= CC_RGBINIT; ! 323: ! 324: // There is a "bug" in the Windows 3.1 COMMDLG implementation ! 325: // of ::ChooseColor that prevents the "new AFX look" from ! 326: // functioning correctly. If you wish to disable the default ! 327: // AFX look, then ::DeleteObject(m_hBrushCtlBk) and set it ! 328: // to NULL at this point. ! 329: } ! 330: ! 331: int ! 332: CColorDialog::DoModal() ! 333: { ! 334: ASSERT_VALID(this); ! 335: ASSERT(m_cc.Flags & CC_ENABLEHOOK); ! 336: ASSERT(m_cc.lpfnHook != NULL); // can still be a user hook ! 337: ! 338: BOOL bResult; ! 339: ! 340: _AfxHookWindowCreate(this); ! 341: ! 342: bResult = ::ChooseColor(&m_cc); ! 343: ! 344: _AfxUnhookWindowCreate(); // just in case ! 345: Detach(); // just in case ! 346: ! 347: return bResult ? IDOK : IDCANCEL; ! 348: } ! 349: ! 350: BOOL ! 351: CColorDialog::OnColorOK() ! 352: { ! 353: ASSERT_VALID(this); ! 354: // Do not call Default() if you override ! 355: return FALSE; ! 356: } ! 357: ! 358: void ! 359: CColorDialog::SetCurrentColor(COLORREF clr) ! 360: { ! 361: ASSERT_VALID(this); ! 362: ASSERT(m_hWnd != NULL); ! 363: ! 364: SendMessage(nMsgSETRGB, 0, (DWORD)clr); ! 365: } ! 366: ! 367: void ! 368: CColorDialog::OnOK() ! 369: { ! 370: // Common dialogs do not require ::EndDialog ! 371: ASSERT_VALID(this); ! 372: ! 373: Default(); ! 374: } ! 375: ! 376: void ! 377: CColorDialog::OnCancel() ! 378: { ! 379: // Common dialogs do not require ::EndDialog ! 380: ASSERT_VALID(this); ! 381: Default(); ! 382: } ! 383: ! 384: #ifdef _DEBUG ! 385: void ! 386: CColorDialog::Dump(CDumpContext& dc) const ! 387: { ! 388: ASSERT_VALID(this); ! 389: CModalDialog::Dump(dc); ! 390: ! 391: dc << "\nm_cc.hwndOwner = " << (void NEAR*)m_cc.hwndOwner; ! 392: dc << "\nm_cc.rgbResult = " << (LPVOID)m_cc.rgbResult; ! 393: dc << "\nm_cc.Flags = " << (LPVOID)m_cc.Flags; ! 394: dc << "\nm_cc.lpCustColors "; ! 395: for (int iClr = 0; iClr < 16; iClr++) ! 396: dc << "\n\t" << (LPVOID)m_cc.lpCustColors[iClr]; ! 397: if (m_cc.lpfnHook == (COMMDLGPROC)_AfxCommDlgProc) ! 398: dc << "\nhook function set to standard MFC hook function"; ! 399: else ! 400: dc << "\nhook function set to non-standard hook function"; ! 401: } ! 402: #endif ! 403: ! 404: ///////////////////////////////////////////////////////////////////////////// ! 405: // Choose Font dialog ! 406: ! 407: IMPLEMENT_DYNAMIC(CFontDialog, CModalDialog) ! 408: ! 409: CFontDialog::CFontDialog(LPLOGFONT lplfInitial /* = NULL */, ! 410: DWORD dwFlags /* = CF_EFFECTS | CF_SCREENFONTS */, ! 411: CDC* pdcPrinter /* = NULL */, ! 412: CWnd* pParentWnd /* = NULL */) : CModalDialog((UINT)0, pParentWnd) ! 413: { ! 414: memset(&m_cf, 0, sizeof(m_cf)); ! 415: memset(&m_lf, 0, sizeof(m_lf)); ! 416: memset(&m_szStyleName, 0, sizeof(m_szStyleName)); ! 417: ! 418: m_cf.lStructSize = sizeof(m_cf); ! 419: if (m_pParentWnd != NULL) ! 420: m_cf.hwndOwner = m_pParentWnd->m_hWnd; ! 421: else ! 422: m_cf.hwndOwner = AfxGetApp()->m_pMainWnd->GetSafeHwnd(); ! 423: m_cf.lpszStyle = (LPSTR)&m_szStyleName; ! 424: m_cf.Flags = dwFlags | CF_USESTYLE | CF_ENABLEHOOK; ! 425: m_cf.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc; ! 426: ! 427: if (lplfInitial) ! 428: { ! 429: m_cf.lpLogFont = lplfInitial; ! 430: m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; ! 431: _fmemcpy(&m_lf, m_cf.lpLogFont, sizeof(m_lf)); ! 432: } ! 433: else ! 434: { ! 435: m_cf.lpLogFont = &m_lf; ! 436: } ! 437: ! 438: if (pdcPrinter) ! 439: { ! 440: ASSERT(pdcPrinter->m_hDC != NULL); ! 441: m_cf.hDC = pdcPrinter->m_hDC; ! 442: m_cf.Flags |= CF_PRINTERFONTS; ! 443: } ! 444: } ! 445: ! 446: BOOL ! 447: CFontDialog::DoModal() ! 448: { ! 449: ASSERT_VALID(this); ! 450: ASSERT(m_cf.Flags & CF_ENABLEHOOK); ! 451: ASSERT(m_cf.lpfnHook != NULL); // can still be a user hook ! 452: ! 453: BOOL bResult; ! 454: ! 455: _AfxHookWindowCreate(this); ! 456: ! 457: bResult = ::ChooseFont(&m_cf); ! 458: ! 459: _AfxUnhookWindowCreate(); // just in case ! 460: Detach(); // just in case ! 461: ! 462: if (bResult) ! 463: // copy logical font from user's initialization buffer (if needed) ! 464: _fmemcpy(&m_lf, m_cf.lpLogFont, sizeof(m_lf)); ! 465: ! 466: return bResult ? IDOK : IDCANCEL; ! 467: } ! 468: ! 469: ! 470: void ! 471: CFontDialog::OnOK() ! 472: { ! 473: // Common dialogs do not require ::EndDialog ! 474: ASSERT_VALID(this); ! 475: Default(); ! 476: } ! 477: ! 478: void ! 479: CFontDialog::OnCancel() ! 480: { ! 481: // Common dialogs do not require ::EndDialog ! 482: ASSERT_VALID(this); ! 483: Default(); ! 484: } ! 485: ! 486: #ifdef _DEBUG ! 487: void ! 488: CFontDialog::Dump(CDumpContext& dc) const ! 489: { ! 490: ASSERT_VALID(this); ! 491: ! 492: CModalDialog::Dump(dc); ! 493: dc << "\nm_cf.hwndOwner = " << (void NEAR*)m_cf.hwndOwner; ! 494: if (m_cf.hDC != NULL) ! 495: dc << "\nm_cf.hDC = " << CDC::FromHandle(m_cf.hDC); ! 496: dc << "\nm_cf.iPointSize = " << m_cf.iPointSize; ! 497: dc << "\nm_cf.Flags = " << (LPVOID)m_cf.Flags; ! 498: dc << "\nm_cf.lpszStyle = " << m_cf.lpszStyle; ! 499: dc << "\nm_cf.nSizeMin = " << m_cf.nSizeMin; ! 500: dc << "\nm_cf.nSizeMax = " << m_cf.nSizeMax; ! 501: dc << "\nm_cf.nFontType = " << (void NEAR*)m_cf.nFontType; ! 502: dc << "\nm_cf.rgbColors = " << (LPVOID)m_cf.rgbColors; ! 503: if (m_cf.lpfnHook == (COMMDLGPROC)_AfxCommDlgProc) ! 504: dc << "\nhook function set to standard MFC hook function"; ! 505: else ! 506: dc << "\nhook function set to non-standard hook function"; ! 507: } ! 508: ! 509: #endif ! 510: ! 511: ///////////////////////////////////////////////////////////////////////////// ! 512: // Print/Print Setup dialog ! 513: ! 514: IMPLEMENT_DYNAMIC(CPrintDialog, CModalDialog) ! 515: ! 516: BEGIN_MESSAGE_MAP(CPrintDialog, CModalDialog) ! 517: // Handle the print setup button when print is displayed ! 518: ON_COMMAND(psh1, OnPrintSetup) ! 519: END_MESSAGE_MAP() ! 520: ! 521: CPrintDialog::CPrintDialog(BOOL bPrintSetupOnly, ! 522: DWORD dwFlags /* = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS ! 523: | PD_HIDEPRINTTOFILE | PD_NOSELECTION */, ! 524: CWnd* pParentWnd /* = NULL */) ! 525: : m_pd(m_pdActual), CModalDialog((UINT)0, pParentWnd) ! 526: { ! 527: memset(&m_pdActual, 0, sizeof(m_pdActual)); ! 528: ! 529: m_pd.lStructSize = sizeof(m_pdActual); ! 530: if (m_pParentWnd != NULL) ! 531: m_pd.hwndOwner = m_pParentWnd->m_hWnd; ! 532: else ! 533: m_pd.hwndOwner = AfxGetApp()->m_pMainWnd->GetSafeHwnd(); ! 534: m_pd.Flags = (dwFlags | PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK); ! 535: m_pd.lpfnPrintHook = (COMMDLGPROC)_AfxCommDlgProc; ! 536: m_pd.lpfnSetupHook = (COMMDLGPROC)_AfxCommDlgProc; ! 537: ! 538: ! 539: if (bPrintSetupOnly) ! 540: m_pd.Flags |= PD_PRINTSETUP; ! 541: else ! 542: m_pd.Flags |= PD_RETURNDC; ! 543: ! 544: m_pd.Flags &= ~PD_RETURNIC; // do not support information context ! 545: } ! 546: ! 547: // Helper ctor for AttachOnSetup ! 548: CPrintDialog::CPrintDialog(PRINTDLG FAR& pdInit) ! 549: : m_pd(pdInit), CModalDialog((UINT)0, NULL) ! 550: { ! 551: } ! 552: ! 553: // Function to keep m_pd in sync after user invokes Setup from ! 554: // the print dialog (via the Setup button) ! 555: // If you decide to handle any messages/notifications and wish to ! 556: // handle them differently between Print/PrintSetup then override ! 557: // this function and create an object of a derived class ! 558: CPrintDialog* ! 559: CPrintDialog::AttachOnSetup() ! 560: { ! 561: ASSERT_VALID(this); ! 562: ! 563: CPrintDialog* pDlgSetup; ! 564: ! 565: pDlgSetup = new CPrintDialog(m_pd); ! 566: pDlgSetup->m_hWnd = NULL; ! 567: pDlgSetup->m_pParentWnd = m_pParentWnd; ! 568: return pDlgSetup; ! 569: } ! 570: ! 571: void ! 572: CPrintDialog::OnPrintSetup() ! 573: { ! 574: ASSERT_VALID(this); ! 575: ! 576: CPrintDialog* pDlgSetup; ! 577: ! 578: VERIFY((pDlgSetup = this->AttachOnSetup()) != NULL); ! 579: ! 580: _AfxHookWindowCreate(pDlgSetup); ! 581: Default(); ! 582: _AfxUnhookWindowCreate(); ! 583: ! 584: delete pDlgSetup; ! 585: } ! 586: ! 587: int ! 588: CPrintDialog::DoModal() ! 589: { ! 590: ASSERT_VALID(this); ! 591: ASSERT(m_pd.Flags & PD_ENABLEPRINTHOOK); ! 592: ASSERT(m_pd.Flags & PD_ENABLESETUPHOOK); ! 593: ASSERT(m_pd.lpfnPrintHook != NULL); // can still be a user hook ! 594: ASSERT(m_pd.lpfnSetupHook != NULL); // can still be a user hook ! 595: ! 596: BOOL bResult; ! 597: ! 598: _AfxHookWindowCreate(this); ! 599: ! 600: bResult = ::PrintDlg(&m_pd); ! 601: ! 602: _AfxUnhookWindowCreate(); // just in case ! 603: Detach(); // just in case ! 604: ! 605: return bResult ? IDOK : IDCANCEL; ! 606: } ! 607: ! 608: // Return an HDC. We don't return a CDC* so the user can decide ! 609: // where to attach this HDC: either to a newly allocated object ! 610: // (use operator delete to clean up) or to an embedded/frame ! 611: // object (destructor will clean up when leaving scope) ! 612: HDC ! 613: CPrintDialog::GetPrinterDC() const ! 614: { ! 615: ASSERT_VALID(this); ! 616: ASSERT(m_pd.Flags & PD_RETURNDC); ! 617: ! 618: return m_pd.hDC; ! 619: } ! 620: ! 621: int ! 622: CPrintDialog::GetCopies() const ! 623: { ! 624: ASSERT_VALID(this); ! 625: if (m_pd.Flags & PD_USEDEVMODECOPIES) ! 626: return GetDevMode()->dmCopies; ! 627: else ! 628: return m_pd.nCopies; ! 629: } ! 630: ! 631: void ! 632: CPrintDialog::OnOK() ! 633: { ! 634: // Common dialogs do not require ::EndDialog ! 635: ASSERT_VALID(this); ! 636: Default(); ! 637: } ! 638: ! 639: void ! 640: CPrintDialog::OnCancel() ! 641: { ! 642: // Common dialogs do not require ::EndDialog ! 643: ASSERT_VALID(this); ! 644: Default(); ! 645: } ! 646: ! 647: #ifdef _DEBUG ! 648: void ! 649: CPrintDialog::Dump(CDumpContext& dc) const ! 650: { ! 651: ASSERT_VALID(this); ! 652: CModalDialog::Dump(dc); ! 653: ! 654: dc << "\nm_pd.hwndOwner = " << (void NEAR*)m_pd.hwndOwner; ! 655: if (m_pd.hDC != NULL) ! 656: dc << "\nm_pd.hDC = " << CDC::FromHandle(m_pd.hDC); ! 657: dc << "\nm_pd.Flags = " << (LPVOID)m_pd.Flags; ! 658: dc << "\nm_pd.nFromPage = " << m_pd.nFromPage; ! 659: dc << "\nm_pd.nToPage = " << m_pd.nToPage; ! 660: dc << "\nm_pd.nMinPage = " << m_pd.nMinPage; ! 661: dc << "\nm_pd.nMaxPage = " << m_pd.nMaxPage; ! 662: dc << "\nm_pd.nCopies = " << m_pd.nCopies; ! 663: if (m_pd.lpfnSetupHook == (COMMDLGPROC)_AfxCommDlgProc) ! 664: dc << "\nsetup hook function set to standard MFC hook function"; ! 665: else ! 666: dc << "\nsetup hook function set to non-standard hook function"; ! 667: if (m_pd.lpfnPrintHook == (COMMDLGPROC)_AfxCommDlgProc) ! 668: dc << "\nprint hook function set to standard MFC hook function"; ! 669: else ! 670: dc << "\nprint hook function set to non-standard hook function"; ! 671: ! 672: } ! 673: #endif ! 674: ! 675: ///////////////////////////////////////////////////////////////////////////// ! 676: // Find/FindReplace dialogs ! 677: ! 678: IMPLEMENT_DYNAMIC(CFindReplaceDialog, CDialog) ! 679: ! 680: CFindReplaceDialog::CFindReplaceDialog() ! 681: { ! 682: memset(&m_fr, 0, sizeof(m_fr)); ! 683: m_szFindWhat[0] = '\0'; ! 684: m_szReplaceWith[0] = '\0'; ! 685: ! 686: m_fr.Flags = FR_ENABLEHOOK; ! 687: m_fr.lpfnHook = (COMMDLGPROC)_AfxCommDlgProc; ! 688: m_fr.lStructSize = sizeof(m_fr); ! 689: m_fr.lpstrFindWhat = (LPSTR)m_szFindWhat; ! 690: } ! 691: ! 692: void ! 693: CFindReplaceDialog::PostNcDestroy() ! 694: { ! 695: ASSERT(m_hWnd == NULL); ! 696: delete this; ! 697: } ! 698: ! 699: ! 700: BOOL ! 701: CFindReplaceDialog::Create(BOOL bFindDialogOnly, ! 702: LPCSTR lpszFindWhat, ! 703: LPCSTR lpszReplaceWith /* = NULL */, ! 704: DWORD dwFlags /* = FR_DOWN */, ! 705: CWnd* pParentWnd /* = NULL */) ! 706: { ! 707: ASSERT_VALID(this); ! 708: ASSERT(m_fr.Flags & FR_ENABLEHOOK); ! 709: ASSERT(m_fr.lpfnHook != NULL); ! 710: ! 711: HWND hwndResult; ! 712: ! 713: m_fr.wFindWhatLen = sizeof(m_szFindWhat); ! 714: m_fr.lpstrReplaceWith = (LPSTR)m_szReplaceWith; ! 715: m_fr.wReplaceWithLen = sizeof(m_szReplaceWith); ! 716: m_fr.Flags |= dwFlags; ! 717: ! 718: if (pParentWnd == NULL) ! 719: m_fr.hwndOwner = AfxGetApp()->m_pMainWnd->GetSafeHwnd(); ! 720: else ! 721: { ! 722: ASSERT_VALID(pParentWnd); ! 723: m_fr.hwndOwner = pParentWnd->m_hWnd; ! 724: } ! 725: ASSERT(m_fr.hwndOwner != NULL); // must have a parent for modeless dialog ! 726: ! 727: ! 728: if (lpszFindWhat) ! 729: _fstrncpy(m_szFindWhat, lpszFindWhat, sizeof(m_szFindWhat)); ! 730: ! 731: if (lpszReplaceWith) ! 732: _fstrncpy(m_szReplaceWith, lpszReplaceWith, sizeof(m_szReplaceWith)); ! 733: ! 734: ! 735: _AfxHookWindowCreate(this); ! 736: if (bFindDialogOnly) ! 737: hwndResult = ::FindText(&m_fr); ! 738: else ! 739: hwndResult = ::ReplaceText(&m_fr); ! 740: _AfxUnhookWindowCreate(); // just in case ! 741: ! 742: ASSERT(hwndResult == NULL || m_hWnd != NULL); ! 743: ! 744: return hwndResult == NULL ? FALSE : TRUE; ! 745: } ! 746: ! 747: /* static */ CFindReplaceDialog* ! 748: CFindReplaceDialog::GetNotifier(LONG lParam) ! 749: { ! 750: ASSERT(lParam != NULL); ! 751: CFindReplaceDialog* pDlg; ! 752: ! 753: pDlg = (CFindReplaceDialog*)(lParam - offsetof(CFindReplaceDialog, m_fr)); ! 754: ASSERT_VALID(pDlg); ! 755: ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CFindReplaceDialog))); ! 756: ! 757: return pDlg; ! 758: } ! 759: ! 760: #ifdef _DEBUG ! 761: void ! 762: CFindReplaceDialog::Dump(CDumpContext& dc) const ! 763: { ! 764: ASSERT_VALID(this); ! 765: ! 766: CDialog::Dump(dc); ! 767: ! 768: dc << "\nm_fr.hwndOwner = " << (void NEAR*)m_fr.hwndOwner; ! 769: dc << "\nm_fr.Flags = " << (LPVOID)m_fr.Flags; ! 770: dc << "\nm_fr.lpstrFindWhat = " << m_fr.lpstrFindWhat; ! 771: dc << "\nm_fr.lpstrReplaceWith = " << m_fr.lpstrReplaceWith; ! 772: if (m_fr.lpfnHook == (COMMDLGPROC)_AfxCommDlgProc) ! 773: dc << "\nhook function set to standard MFC hook function"; ! 774: else ! 775: dc << "\nhook function set to non-standard hook function"; ! 776: } ! 777: #endif ! 778: ! 779: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.