178 lines
4.5 KiB
C++
178 lines
4.5 KiB
C++
//-----------------------------------------------------------------------------
|
|
// File: Dialog.h
|
|
// Desc: Dialog class
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (C) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
// Misc helper functions
|
|
|
|
HINSTANCE GetInstance();
|
|
HBITMAP SetBitmapImg(HINSTANCE hinst, WORD nID, HWND hwnd);
|
|
void ShowLastError(HWND hwnd);
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* CBaseDialog Class
|
|
* Implements a Win32 modal dialog.
|
|
*
|
|
* Examle of usage:
|
|
*
|
|
* Derive a new class from CBaseDialog
|
|
* class CMyDialog : public CBaseDialog
|
|
*
|
|
* Create an instance of the class:
|
|
* CMyDialog *pDlg = new CMyDialog();
|
|
*
|
|
* Call ShowDialog to show the dialog:
|
|
* if (pDlg)
|
|
* {
|
|
* pDlg->ShowDialog(m_hinst, m_hwndParent);
|
|
* }
|
|
*
|
|
*****************************************************************************/
|
|
|
|
class CBaseDialog
|
|
{
|
|
|
|
private:
|
|
LONG m_NcTop;
|
|
LONG m_NcBottom;
|
|
LONG m_NcWidth;
|
|
void CalcNcSize();
|
|
|
|
protected:
|
|
HINSTANCE m_hinst; // application instance
|
|
HWND m_hwnd; // parent window - can be NULL
|
|
HWND m_hDlg; // this dialog window
|
|
int m_nID; // Resource ID of the dialog window
|
|
// (Set this in the constructor)
|
|
|
|
protected:
|
|
|
|
// Dialog proc for the dialog we manage
|
|
static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
// Return one of our dialog controls
|
|
HWND GetDlgItem(int nID) { return ::GetDlgItem(m_hDlg, nID); }
|
|
|
|
void EnableWindow(int nID, BOOL bEnable)
|
|
{
|
|
HWND hControl = GetDlgItem(nID);
|
|
assert(hControl != NULL);
|
|
|
|
if (!bEnable && hControl == GetFocus())
|
|
{
|
|
// If we're being disabled and this control has focus,
|
|
// set the focus to the next control.
|
|
|
|
::SendMessage(m_hDlg, WM_NEXTDLGCTL, 0, FALSE);
|
|
}
|
|
|
|
::EnableWindow(hControl, bEnable);
|
|
}
|
|
|
|
// Associate a Control object with a control window.
|
|
void SetControlWindow(Control& control, int nID);
|
|
|
|
// Redraw a control
|
|
void RedrawControl(int nID);
|
|
|
|
|
|
// some wrappers for Win32 functions
|
|
void EnableMenuItem(int nID, BOOL bEnable)
|
|
{
|
|
::EnableMenuItem(GetMenu(m_hDlg), nID, (bEnable ? MF_ENABLED : MF_GRAYED));
|
|
}
|
|
|
|
|
|
BOOL SetDlgItemText(int nIDDlgItem, LPCTSTR lpString)
|
|
{
|
|
return ::SetDlgItemText(m_hDlg, nIDDlgItem, lpString);
|
|
}
|
|
|
|
UINT GetDlgItemText(int nIDDlgItem, LPTSTR lpString, int nMaxCount)
|
|
{
|
|
return ::GetDlgItemText(m_hDlg, nIDDlgItem, lpString, nMaxCount);
|
|
}
|
|
|
|
BOOL SetDlgItemInt(int nIDDlgItem, UINT uValue, BOOL bSigned)
|
|
{
|
|
return ::SetDlgItemInt(m_hDlg, nIDDlgItem, uValue, bSigned);
|
|
}
|
|
|
|
UINT GetDlgItemInt(int nIDDlgItem, BOOL *lpTranslated, BOOL bSigned)
|
|
{
|
|
return ::GetDlgItemInt(m_hDlg, nIDDlgItem, lpTranslated, bSigned);
|
|
}
|
|
|
|
BOOL CheckDlgButton(int nIDButton, UINT uCheck)
|
|
{
|
|
return ::CheckDlgButton(m_hDlg, nIDButton, uCheck);
|
|
}
|
|
|
|
UINT IsDlgButtonChecked(int nIDButton)
|
|
{
|
|
return ::IsDlgButtonChecked(m_hDlg, nIDButton);
|
|
}
|
|
|
|
|
|
// Override the following to handle various window messages
|
|
|
|
// WM_INIT_DIALOG
|
|
virtual HRESULT OnInitDialog() { return S_OK; }
|
|
|
|
// IDOK and IDCANCEL. Return TRUE to close the dialog or FALSE to leave it open
|
|
virtual BOOL OnOK() { return TRUE; }
|
|
virtual BOOL OnCancel() { return TRUE; }
|
|
|
|
// WM_COMMAND (except IDOK and IDCANCEL)
|
|
virtual INT_PTR OnCommand(HWND /*hControl*/, WORD /*idControl*/, WORD /*msg*/)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// WM_NOTIFY
|
|
virtual INT_PTR OnNotify(NMHDR * /*pNotifyHeader*/)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// All other window messages
|
|
virtual INT_PTR OnReceiveMsg(UINT /*msg*/, WPARAM /*wParam*/, LPARAM /*lParam*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
virtual void EndDialog(INT_PTR cmd)
|
|
{
|
|
if (m_hDlg)
|
|
{
|
|
::EndDialog(m_hDlg, cmd);
|
|
}
|
|
}
|
|
|
|
public:
|
|
CBaseDialog(int nID);
|
|
virtual ~CBaseDialog();
|
|
|
|
virtual BOOL ShowDialog(HINSTANCE hinst, HWND hwnd);
|
|
|
|
LONG NonClientTop() const { return m_NcTop; }
|
|
LONG NonClientBottom() const { return m_NcBottom; }
|
|
LONG NonClientWidth() const { return m_NcWidth; }
|
|
};
|
|
|
|
|
|
|
|
|