|
|
/*+
Copyright (c) 2000 Microsoft Corporation
Module Name:
DLG.CPP
Abstract:
C_Dlg implementation Author:
990518 dane Created. 990721 dane Added _THIS_MODULE_ for logging macros. georgema 000310 updated
Environment: Win98, Win2000
Revision History:
--*/
#pragma comment(user, "Compiled on " __DATE__ " at " __TIME__)
#pragma comment(compiler)
//////////////////////////////////////////////////////////////////////////////
//
// Include files
//
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include "macros.h"
#include <shfusion.h>
#include "Dlg.h"
//////////////////////////////////////////////////////////////////////////////
//
// Static initialization
//
static const char _THIS_FILE_[ ] = __FILE__;
//////////////////////////////////////////////////////////////////////////////
//
// Static member initialization
//
LPCTSTR C_Dlg::SZ_HWND_PROP = _T("hwnd");
//////////////////////////////////////////////////////////////////////////////
//
// C_Dlg
//
// Constructor.
//
// parameters:
// hwndParent parent window for the dialog (may be NULL)
// hInstance instance handle of the parent window (may be NULL)
// lIDD dialog template id
// pfnDlgProc pointer to the function that will process messages for
// the dialog. if it is NULL, the default dialog proc
// will be used.
//
// returns:
// Nothing.
//
//////////////////////////////////////////////////////////////////////////////
C_Dlg::C_Dlg( HWND hwndParent, HINSTANCE hInstance, LONG lIDD, DLGPROC pfnDlgProc // = NULL
) : m_hwndParent(hwndParent), m_hInstance(hInstance), m_lIDD(lIDD), m_pfnDlgProc(pfnDlgProc), m_hwnd(NULL) {
ASSERT(NULL != SZ_HWND_PROP); if (NULL == m_pfnDlgProc) { // Use the default dialog proc
//
m_pfnDlgProc = C_Dlg::DlgProc; } } // C_Dlg::C_Dlg
//////////////////////////////////////////////////////////////////////////////
//
// ~C_Dlg
//
// Destructor.
//
// parameters:
// None.
//
// returns:
// Nothing.
//
//////////////////////////////////////////////////////////////////////////////
C_Dlg::~C_Dlg( ) { OnShutdown(); } // C_Dlg::~C_Dlg
//////////////////////////////////////////////////////////////////////////////
//
// DoModal
//
// Display the dialog box modally and wait for it to be closed.
//
// parameters:
// lparam user-defined data that will be passed to the dialog
// proc as the lparam of the WM_INITDIALOG message.
//
// returns:
// User-defined result code returned by EndDialog( ).
//
//////////////////////////////////////////////////////////////////////////////
INT_PTR C_Dlg::DoModal( LPARAM lparam // = NULL
) {
INT_PTR nResult = DialogBoxParam(m_hInstance, MAKEINTRESOURCE(m_lIDD), m_hwndParent, m_pfnDlgProc, lparam ); // nResult will be 0 or -1 on failure, else will be value assigned from EndDialog()
return nResult;
} // C_Dlg::DoModal
//////////////////////////////////////////////////////////////////////////////
//
// DlgProc
//
// Window procedure for wizard pages. All messages are routed here, then
// dispatched to the appropriate C_Dlg object.
//
// parameters:
// hwndDlg window handle of the page for which the message is
// intended
// uMessage the message
// wparam message-specific data
// lparam message-specific data
//
// returns:
// TRUE if the message was processed
// FALSE otherwise
//
//////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK C_Dlg::DlgProc( HWND hwndDlg, UINT uMessage, WPARAM wparam, LPARAM lparam ) {
CHECK_MESSAGE(hwndDlg, uMessage, wparam, lparam);
// Get the pointer to the C_Dlg object corresponding to the hwndDlg
//
C_Dlg* pDlg = NULL;
if (WM_INITDIALOG == uMessage) { // For WM_INITDIALOG, the pointer to the dialog object will be in
// the lparam.
//
pDlg = (C_Dlg*) lparam; } else { // For all other messages, it will be attached to the HWND
//
HRESULT hr = C_Dlg::DlgFromHwnd(hwndDlg, &pDlg); if (FAILED(hr)) { return FALSE; } ASSERT(NULL != pDlg); }
// Let the page route application-specific messages
//
if (WM_APP <= uMessage) { return pDlg->OnAppMessage(uMessage, wparam, lparam); }
// Route Windows messages to appropriate handler
//
switch (uMessage) { case WM_INITDIALOG: return pDlg->OnInitDialog(hwndDlg, (HWND)wparam ); case WM_HELP: return pDlg->OnHelpInfo(lparam); case WM_CONTEXTMENU: return pDlg->OnContextMenu(wparam,lparam); case WM_COMMAND: return pDlg->OnCommand(HIWORD(wparam), LOWORD(wparam), (HWND)lparam); case WM_NOTIFY: return RouteNotificationMessage(pDlg, (NMHDR*)lparam); break;
case WM_DESTROY: return pDlg->OnDestroyDialog(); break; default: // Message was not processed
//
return FALSE; } // switch (uMessage)
} // C_Dlg::DlgProc
//////////////////////////////////////////////////////////////////////////////
//
// RouteNotificationMessage
//
// Routes notification messages from wizard buttons to the appropriate page
// and handler.
//
// parameters:
// hwndDlg window handle of page to which message is to be sent
// pnmhdr pointer to the NMHDR structure containing info about
// the particular notification
//
// returns:
// TRUE if the message is processed
// FALSE otherwise
//
//////////////////////////////////////////////////////////////////////////////
BOOL C_Dlg::RouteNotificationMessage( C_Dlg* pDlg, NMHDR* pnmhdr ) {
if (NULL == pDlg) { //FIX220699
return FALSE; //return E_INVALIDARG;
}
// If any specific notifications are to be handled, switch on pnmhdr->code.
//
return pDlg->OnNotify(pnmhdr);
} // C_Dlg::RouteNotificationMessage
//////////////////////////////////////////////////////////////////////////////
//
// LinkHwnd
//
// Store the pointer to this object in a window handle property. This
// provides a way to get to the object when all that is known is the HWND.
// Particularly useful in window procedures.
//
// parameters:
// None.
//
// returns:
// TRUE if the operation is successful
// FALSE otherwise
//
//////////////////////////////////////////////////////////////////////////////
BOOL C_Dlg::LinkHwnd( ) {
ASSERT(IsWindow(m_hwnd)); if (! IsWindow(m_hwnd)) { return FALSE; }
return SetProp(m_hwnd, SZ_HWND_PROP, (HANDLE)this);
} // C_Dlg::LinkHwnd
//////////////////////////////////////////////////////////////////////////////
//
// UnlinkHwnd
//
// Remove the pointer to the associated object from a window handle. The
// pointer must have been set with LinkHwnd( ).
//
// parameters:
// None.
//
// returns:
// TRUE if the window handle is removed and it is a pointer to
// this object
// FALSE otherwise
//
//////////////////////////////////////////////////////////////////////////////
BOOL C_Dlg::UnlinkHwnd( ) {
ASSERT(IsWindow(m_hwnd)); if (! IsWindow(m_hwnd)) { return FALSE; }
C_Dlg* pDlg = (C_Dlg*)RemoveProp(m_hwnd, SZ_HWND_PROP);
ASSERT(this == pDlg); return (this == pDlg);
} // C_Dlg::UnlinkHwnd
//////////////////////////////////////////////////////////////////////////////
//
// DlgFromHwnd
//
// Retrieves the pointer to the associated object from a window handle. The
// pointer was stored in a property by LinkHwnd( ).
//
// parameters:
// hwnd the window handle containing the pointer
// ppDlg pointer to a buffer that will receive the pointer to
// the C_Dlg object
//
// returns:
// S_OK if the operation is successful
// E_INVALIDARG if hwnd is not a valid window or ppDlg is NULL
// E_POINTER if the retrieved pointer is NULL
//
//////////////////////////////////////////////////////////////////////////////
HRESULT C_Dlg::DlgFromHwnd( HWND hwnd, C_Dlg** ppDlg ) {
if (! ::IsWindow(hwnd)) { return (E_INVALIDARG); }
ASSERT(NULL != ppDlg); if (NULL == ppDlg) { return (E_INVALIDARG); }
*ppDlg = (C_Dlg*) GetProp(hwnd, SZ_HWND_PROP);
if (NULL == *ppDlg) { return (E_POINTER); }
return (S_OK);
} // C_Dlg::DlgFromHwnd
//
///// End of file: Dlg.cpp ////////////////////////////////////////////////
|