2025-11-28 00:35:46 +09:00

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; }
};