/*++ 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)) ); } }