杜小姐的bug人生 2024-11-07 17:45 采纳率: 54.5%
浏览 2

MFC如何实现控件中显示不真实的文件,类似图片中的效果

MFC界面设计成图片中的效果,该如何进行,想把一些不真实的文件显示在控件上,实现提示该控件功能的作用

img

  • 写回答

1条回答 默认 最新

  • 赵4老师 2024-11-08 09:18
    关注

    MFC CEdit 实现提示文字
    在MFC中,要为CEdit控件添加提示文字(placeholder text),可以通过继承CEdit类,并添加一些额外的消息处理来实现。以下是一个简单的例子:

    class CPlaceHolderEdit : public CEdit
    {
    public:
        CPlaceHolderEdit();
     
        // 重写WM_PAINT消息处理,绘制提示文字
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
     
        // 设置提示文字
        void SetPlaceHolderText(const CString& text);
     
    protected:
        // 重写WM_ENABLE消息处理,以更新控件状态
        afx_msg void OnEnable(BOOL bEnable);
     
        DECLARE_MESSAGE_MAP()
     
    private:
        CString m_strPlaceHolder; // 存储提示文字
        BOOL m_bPlaceHolderVisible; // 是否显示提示文字
    };
     
    BEGIN_MESSAGE_MAP(CPlaceHolderEdit, CEdit)
        ON_WM_ENABLE()
        ON_WM_PAINT()
    END_MESSAGE_MAP()
     
    CPlaceHolderEdit::CPlaceHolderEdit() : m_bPlaceHolderVisible(FALSE)
    {
    }
     
    void CPlaceHolderEdit::SetPlaceHolderText(const CString& text)
    {
        m_strPlaceHolder = text;
        m_bPlaceHolderVisible = TRUE;
        RedrawWindow(); // 请求重新绘制
    }
     
    void CPlaceHolderEdit::OnEnable(BOOL bEnable)
    {
        CEdit::OnEnable(bEnable);
        if (!bEnable)
        {
            m_bPlaceHolderVisible = TRUE;
            RedrawWindow();
        }
        else
        {
            m_bPlaceHolderVisible = FALSE;
            RedrawWindow();
        }
    }
     
    void CPlaceHolderEdit::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        if (m_bPlaceHolderVisible)
        {
            // 绘制提示文字的代码
            CRect rect;
            GetClientRect(rect);
            CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
            pDC->SetBkMode(TRANSPARENT);
            pDC->DrawText(m_strPlaceHolder, this, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        }
    }
    
    

    在上面的代码中,CPlaceHolderEdit类继承自CEdit,并添加了SetPlaceHolderText函数来设置提示文字。在OnEnable消息处理中,当编辑控件被禁用时,会显示提示文字。在DrawItem函数中,当m_bPlaceHolderVisible为TRUE时,使用设置的提示文字来绘制编辑控件的内部。

    要在对话框中使用这个控件,你需要做以下步骤:

    在对话框的头文件中包含上面的CPlaceHolderEdit类的定义。

    声明一个CPlaceHolderEdit类型的成员变量。

    重写对话框的OnInitDialog函数,创建CPlaceHolderEdit控件并设置提示文字。

    示例:

    class CMyDialog : public CDialog
    {
        // ... 其他代码 ...
     
        CPlaceHolderEdit m_wndPlaceHolderEdit;
     
        // 对话框初始化时创建控件
        virtual BOOL OnInitDialog();
    };
     
    BOOL CMyDialog::OnInitDialog()
    {
        CDialog::OnInitDialog();
     
        // 创建编辑控件
        CRect rect;
        GetDlgItem(IDC_EDIT_PLACEHOLDER)->GetWindowRect(rect);
        ScreenToClient(rect);
        m_wndPlaceHolderEdit.Create(WS_CHILD | WS_VISIBLE | WS_BORDER |
    

    提示:AI自动生成,仅供参考

    评论

报告相同问题?

问题事件

  • 创建了问题 11月7日