You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.5 KiB
167 lines
4.5 KiB
/******************************************************************************
|
|
|
|
Source File: Dialog.CPP
|
|
|
|
Implements the CDialog class. See Dialog.H for class definitions and details
|
|
|
|
Copyright (c) 1996 by Microsoft Corporation
|
|
|
|
A Pretty Penny Enterprises Production
|
|
|
|
Change History:
|
|
|
|
11-01-96 [email protected] Created it
|
|
12-11-96 [email protected] Implemented hook
|
|
|
|
******************************************************************************/
|
|
|
|
#include "ICMUI.H"
|
|
|
|
// CDialog member functions
|
|
|
|
// Class constructor- just save things, for now
|
|
|
|
CDialog::CDialog(HINSTANCE hiWhere, int id, HWND hwndParent) {
|
|
m_idMain = id;
|
|
m_hwndParent = hwndParent;
|
|
m_hiWhere = hiWhere;
|
|
m_bIsModal = FALSE;
|
|
m_hwnd = NULL;
|
|
m_dpHook = NULL;
|
|
m_lpHook = 0;
|
|
}
|
|
|
|
CDialog::CDialog(CDialog &cdOwner, int id) {
|
|
m_idMain = id;
|
|
m_hwndParent = cdOwner.m_hwnd;
|
|
m_hiWhere = cdOwner.m_hiWhere;
|
|
m_bIsModal = FALSE;
|
|
m_hwnd = NULL;
|
|
m_dpHook = NULL;
|
|
m_lpHook = 0;
|
|
}
|
|
|
|
// Class destructor- clean up the window, if it is modeless.
|
|
|
|
CDialog::~CDialog() {
|
|
Destroy();
|
|
}
|
|
|
|
// Modal Dialog Box
|
|
|
|
LONG CDialog::DoModal() {
|
|
m_bIsModal = TRUE;
|
|
return (LONG)DialogBoxParam(m_hiWhere, MAKEINTRESOURCE(m_idMain), m_hwndParent,
|
|
CDialog::DialogProc, (LPARAM) this);
|
|
}
|
|
|
|
// Modeless dialog box creation
|
|
|
|
void CDialog::Create() {
|
|
if (!m_bIsModal && m_hwnd)
|
|
return; // We'va already got one!
|
|
|
|
m_bIsModal = FALSE;
|
|
CreateDialogParam(m_hiWhere, MAKEINTRESOURCE(m_idMain),
|
|
m_hwndParent, CDialog::DialogProc, (LPARAM) this);
|
|
}
|
|
|
|
// Modeless dialog box destruction
|
|
|
|
void CDialog::Destroy() {
|
|
if (!m_bIsModal && m_hwnd) {
|
|
DestroyWindow(m_hwnd);
|
|
m_hwnd = NULL;
|
|
}
|
|
}
|
|
|
|
// Dialog Procedure- this is a static private method. This means
|
|
// that all instances of this class (including derived classes) share
|
|
// this code (no pointers needed) and that only instances of this
|
|
// class (not even derived classes) can find it.
|
|
|
|
INT_PTR CALLBACK CDialog::DialogProc(HWND hwndMe, UINT uMsg, WPARAM wp,
|
|
LPARAM lp) {
|
|
|
|
CDialog *pcdMe = (CDialog *) GetWindowLongPtr(hwndMe, DWLP_USER);
|
|
|
|
// If there is a hook procedure, it can either ignore or filter a
|
|
// message by returning FALSE, or it can handle itself by returning
|
|
// TRUE. WM_INITDALOG hook processing occurs AFTER all of our other
|
|
// calls are made, and we allow the base class to define the LPARAM
|
|
// that is passed in to the hook.
|
|
// Because we do not have a pointer to the base class, we will miss
|
|
// messages sent before WM_INITDIALOG (specifically WM_SETFONT)
|
|
|
|
if (uMsg != WM_INITDIALOG && pcdMe && pcdMe -> m_dpHook &&
|
|
(*pcdMe -> m_dpHook)(hwndMe, uMsg, wp, lp))
|
|
return TRUE;
|
|
|
|
switch (uMsg) {
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
// The lp is the this pointer for the caller
|
|
|
|
pcdMe = (CDialog *) lp;
|
|
|
|
if(!pcdMe)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
SetWindowLongPtr(hwndMe, DWLP_USER, (LONG_PTR)pcdMe);
|
|
pcdMe -> m_hwnd = hwndMe;
|
|
|
|
// Derived classes override OnInit to initialize the dialog
|
|
|
|
if (!pcdMe -> m_dpHook)
|
|
return pcdMe -> OnInit();
|
|
else {
|
|
// If there is a hook procedure, we will call that after the
|
|
// override- if the override returned FALSE, so must we
|
|
BOOL bReturn = pcdMe -> OnInit();
|
|
return (*pcdMe -> m_dpHook)(hwndMe, uMsg, wp,
|
|
pcdMe -> m_lpHook) && bReturn;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
if(pcdMe)
|
|
{
|
|
return pcdMe -> OnCommand(HIWORD(wp), LOWORD(wp), (HWND) lp);
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
if(pcdMe)
|
|
{
|
|
return pcdMe -> OnNotify((int) wp, (LPNMHDR) lp);
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
if(pcdMe)
|
|
{
|
|
return pcdMe -> OnHelp((LPHELPINFO) lp);
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
if(pcdMe)
|
|
{
|
|
return pcdMe -> OnContextMenu((HWND) wp);
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
// Moves the window into position (needed to get dialogs positioned proeprly
|
|
// in tab control display area).
|
|
|
|
void CDialog::Adjust(RECT& rc) {
|
|
SetWindowPos(m_hwnd, HWND_TOP, rc.left, rc.top, 0, 0,
|
|
SWP_NOACTIVATE | SWP_NOSIZE | SWP_SHOWWINDOW);
|
|
}
|