zoukankan      html  css  js  c++  java
  • 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;
        }
    };

    使用类似于如下:

    void demo()
    {
        TCHAR strPassWd[MAX_PATH];
        if (CInputBox::InputBox(_T("请输入加密密码:"), strPassWd, _T("输入密码"))) {
            //
        }
    
        return ;
    }
  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/13901882.html
Copyright © 2011-2022 走看看