WTL利用CIndirectDialogImpl实现InputBox
Window中VB有InputBox的功能,但SDK、MFC、WTL等并未提供类似功能。
WTL有CIndirectDialogImpl,可以很简单的构建对话框。基于此,实现一个简单的InputBox功能
#define BUF_LEN MAX_PATH #define IDC_TEXT (100) class CInputBox: public CIndirectDialogImpl< CInputBox >{private:
LPCTSTR szPrompt_;
LPCTSTR szTitle_;
LPCTSTR szDefaultText_;
TCHAR strResult[BUF_LEN];public:
BEGIN_DIALOG(0, 0, 257, 62)
DIALOG_CAPTION(szTitle_!= nullptr ? szTitle_ : _T(""))
DIALOG_STYLE(DS_MODALFRAME| WS_POPUP | WS_CAPTION |WS_SYSMENU)
DIALOG_FONT(9, _T("SimSun"))
END_DIALOG()
BEGIN_CONTROLS_MAP()
CONTROL_DEFPUSHBUTTON(_T("OK"), IDOK, 200, 11, 50, 14, 0, 0)
CONTROL_PUSHBUTTON(_T("Cancel"), IDCANCEL, 200, 31, 50, 14, 0, 0)
CONTROL_LTEXT(szPrompt_!= nullptr ? szPrompt_ : _T("Please input:"), IDC_STATIC, 7, 7, 158, 14, 0, 0)
CONTROL_EDITTEXT(IDC_TEXT,7, 31, 180, 14, 0, 0)
END_CONTROLS_MAP()
BEGIN_MSG_MAP(CInputBox)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnCloseCmd)
COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd)
END_MSG_MAP()
CInputBox::CInputBox() : szPrompt_(nullptr), szTitle_(nullptr), szDefaultText_(nullptr){
memset(strResult,0, sizeof(TCHAR)*BUF_LEN);
}static bool InputBox(LPCTSTR szPrompt, LPTSTR strResult, LPCTSTR szTitle = _T(""), LPCTSTR szDefaultText = _T(""), HWND hParent =nullptr){
CInputBox dlg;
dlg.szPrompt_=szPrompt;
dlg.szTitle_=szTitle;
dlg.szDefaultText_=szDefaultText;if (IDOK ==dlg.DoModal(hParent)) {//get return string. lstrcpyn(strResult, dlg.strResult, BUF_LEN);return true;
}return false;
}
LRESULT OnInitDialog(UINT/*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CenterWindow(GetParent());if(szDefaultText_) {
::SetWindowText(::GetDlgItem(m_hWnd, IDC_TEXT), szDefaultText_);
}//set focus to edit control item. ::SetFocus(::GetDlgItem(m_hWnd, IDC_TEXT));//return false to prevent setfocus in dialogproc. return false;
}
LRESULT OnCloseCmd(WORD/*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{if (wID ==IDOK) {
::GetWindowText(::GetDlgItem(m_hWnd, IDC_TEXT), strResult, BUF_LEN- 1);
}
EndDialog(wID);return 0;
}
};
使用类似于如下:
voiddemo()
{
TCHAR strPassWd[MAX_PATH];if (CInputBox::InputBox(_T("请输入加密密码:"), strPassWd, _T("输入密码"))) {//}return;
}