|
|
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.