windows-nt/Source/XPSP1/NT/printscan/wia/common/stirt/cdlg.cpp
2020-09-26 16:20:57 +08:00

237 lines
4.4 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
cdlg.cpp
Abstract:
Imitation of MFC CDialog class
Author:
Vlad Sadovsky (vlads) 26-Mar-1997
Revision History:
26-Mar-1997 VladS created
--*/
#include "cplusinc.h"
#include "sticomm.h"
#include "cdlg.h"
#include "windowsx.h"
VOID CALLBACK
TimerDlgProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
//
// Constructor/destructor
//
CDlg::CDlg(int DlgID, HWND hWnd, HINSTANCE hInst,UINT msElapseTimePeriod)
: m_DlgID(DlgID),
m_hParent(hWnd),
m_Inst(hInst),
m_bCreatedModeless(FALSE),
m_msElapseTimePeriod(msElapseTimePeriod),
m_hDlg(0),
m_uiTimerId(0)
{
}
CDlg::~CDlg()
{
if (m_uiTimerId) {
::KillTimer(GetWindow(),m_uiTimerId);
m_uiTimerId = 0;
}
if(m_hDlg) {
DestroyWindow(m_hDlg);
}
}
INT_PTR
CALLBACK
CDlg::BaseDlgProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam
)
{
CDlg * pSV = (CDlg*) GetWindowLongPtr(hDlg,DWLP_USER);
switch (uMessage) {
case WM_INITDIALOG:
{
ASSERT(lParam);
pSV=(CDlg*)lParam;
pSV->SetWindow(hDlg);
SetWindowLongPtr(hDlg,DWLP_USER,(LONG_PTR)pSV);
//
// Create timer for canceling dialog if user did not respond in time
//
if(pSV->m_msElapseTimePeriod) {
pSV->m_uiTimerId = ::SetTimer(pSV->GetWindow(),ID_TIMER_EVENT,pSV->m_msElapseTimePeriod,NULL);
//(TIMERPROC)TimerDlgProc);
}
pSV->OnInit();
}
break;
case WM_COMMAND:
if(pSV) {
return pSV->OnCommand(LOWORD(wParam),(HWND)lParam,HIWORD(wParam));
}
break;
case WM_NOTIFY:
if(pSV) {
return pSV->OnNotify((NMHDR FAR *)lParam);
}
break;
case WM_DESTROY:
if(pSV) {
pSV->Destroy();
}
break;
case WM_TIMER:
if(pSV && pSV->m_uiTimerId && (ID_TIMER_EVENT == wParam)) {
// Imitate cancel
::PostMessage(hDlg,
WM_COMMAND,
#ifdef _WIN64
(WPARAM)MAKELONG(IDCANCEL,0), (LPARAM)(pSV->GetDlgItem(IDCANCEL))
#else
GET_WM_COMMAND_MPS(IDCANCEL, pSV->GetDlgItem(IDCANCEL), 0)
#endif
);
}
break;
}
if(pSV) {
return pSV->DlgProc(hDlg,uMessage,wParam,lParam);
}
return FALSE;
}
//
// Overridable dialog procedure and message handlers
//
BOOL
CALLBACK
CDlg::DlgProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam
)
{
return FALSE;
}
int
CDlg::OnCommand(
UINT id,
HWND hwndCtl,
UINT codeNotify
)
{
switch( id) {
case IDOK:
case IDCANCEL:
EndDialog(id);
break;
}
return 1; // not handled
}
void CDlg::OnInit()
{
}
int CDlg::OnNotify(NMHDR * pHdr)
{
return FALSE;
}
//
// Creation functions
//
INT_PTR CDlg::CreateModal()
{
m_bCreatedModeless=FALSE;
return DialogBoxParam( m_Inst, MAKEINTRESOURCE(m_DlgID), m_hParent, BaseDlgProc, (LPARAM)this);
}
HWND CDlg::CreateModeless()
{
if(m_hDlg) {
return m_hDlg;
}
HWND hWnd=CreateDialogParam(m_Inst, MAKEINTRESOURCE(m_DlgID), m_hParent, BaseDlgProc, (LPARAM)this);
if(hWnd) {
m_bCreatedModeless=TRUE;
}
return hWnd;
}
void CDlg::Destroy()
{
if(m_bCreatedModeless) {
if(m_hDlg) {
m_hDlg=NULL;
}
}
}
void CDlg::SetDlgID(UINT id)
{
m_DlgID=id;
}
void CDlg::SetInstance(HINSTANCE hInst)
{
m_Inst=hInst;
}
VOID CALLBACK
TimerDlgProc(
HWND hDlg, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
CDlg * pSV = (CDlg*) GetWindowLongPtr(hDlg,DWLP_USER);
if((uMsg == WM_TIMER) &&
(pSV &&(pSV->GetTimerId() == (UINT_PTR)idEvent))
) {
// Imitate cancel
PostMessage(hDlg,
WM_COMMAND,
// GET_WM_COMMAND_MPS(IDCANCEL, pSV->GetDlgItem(IDCANCEL), 0)
(WPARAM)MAKELONG(IDCANCEL,0), (LPARAM)(pSV->GetDlgItem(IDCANCEL))
);
}
}