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 ;
    }
  • 相关阅读:
    Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
    CAP原则 (阿里)
    分布式系统一致性问题解决实战(阿里) 异步解耦+消息队列可作为分布式系统满足最终一致性的优秀方案
    高并发&高可用系统的常见应对策略 秒杀等-(阿里)
    Redis的内存回收策略和内存上限(阿里)
    如何保证MQ的顺序性?比如Kafka
    spring的controller默认是单例还是多例
    HashMap线程不安全的体现
    TCP的三次握手与四次挥手
    常见排序算法及对应的时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/13901882.html
Copyright © 2011-2022 走看看