CPropertyPage 中的 CEdit 只读背景颜色

Posted

技术标签:

【中文标题】CPropertyPage 中的 CEdit 只读背景颜色【英文标题】:CEdit read-only background color in CPropertyPage 【发布时间】:2012-05-17 05:56:31 【问题描述】:

放置在某些 CPropertyPage 中的 CEdit 控件的默认背景颜色是什么? 令我困惑的是,当大量 CEdit 更改时,背景颜色会有所不同。也就是说,如果有一个带有 CEdit 的 CTabCtrl 对话框,则只读 CEdit 的背景是灰色的(我想它是 Windows 中的默认设置)。但是,如果使用 CPropertySheet 和 CPropertyPage 而不是 CDialog,则只读 CEdit 的背景为白色。 使用 CDialog:

使用 CPropertySheet:

用于构建这些窗口的代码:

基于CDialog

// DialogWithEdit.h
#pragma once

class CDialogWithEdit : public CDialog

    DECLARE_DYNAMIC(CDialogWithEdit)    
public:
    CDialogWithEdit(CWnd* pParent = NULL);   // standard constructor
    virtual ~CDialogWithEdit();
    enum  IDD = IDD_DIALOG1 ;
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    virtual BOOL OnInitDialog();
    DECLARE_MESSAGE_MAP()    
private:
    CEdit m_regularEdit;
    CEdit m_readOnlyEdit;
;

// DialogWithEdit.cpp : implementation file

#include "stdafx.h"
#include "PropertySheetTest.h"
#include "DialogWithEdit.h"
#include "afxdialogex.h"

IMPLEMENT_DYNAMIC(CDialogWithEdit, CDialog)

CDialogWithEdit::CDialogWithEdit(CWnd* pParent /*=NULL*/)
    : CDialog(CDialogWithEdit::IDD, pParent)    

CDialogWithEdit::~CDialogWithEdit()    

void CDialogWithEdit::DoDataExchange(CDataExchange* pDX)

    CDialog::DoDataExchange(pDX);


BEGIN_MESSAGE_MAP(CDialogWithEdit, CDialog)
END_MESSAGE_MAP()

BOOL CDialogWithEdit::OnInitDialog ()
    
    BOOL retVal = CDialog::OnInitDialog ();

    WCHAR tabStr[5] = 0;
    wcscpy (tabStr, L"Tab1");

    TCITEM tab1 = 0;
    tab1.mask = TCIF_TEXT;
    tab1.cchTextMax = 5;
    tab1.pszText = tabStr;
    CTabCtrl * tabCtrl = (CTabCtrl*) GetDlgItem (IDC_TAB1);
    tabCtrl->InsertItem (0, &tab1);
    RECT tabRc = 0;
    tabCtrl->GetItemRect (0, &tabRc);

    m_readOnlyEdit.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL|ES_READONLY, CRect (10, 30, 100, 50), GetDlgItem (IDC_TAB1), 5);
    m_readOnlyEdit.SetWindowText (L"read only");
    m_regularEdit.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL, CRect (110, 30, 200, 50), GetDlgItem (IDC_TAB1), 5+1);
    m_regularEdit.SetWindowText (L"editable");
    return retVal;
    

基于 CPropertySheet

// SheetX.h
#pragma once
#include "PageX.h"

class CSheetX : public CPropertySheet

    DECLARE_DYNAMIC(CSheetX)    
public:
    CSheetX(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    CSheetX(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    virtual ~CSheetX();    
protected:
    DECLARE_MESSAGE_MAP()    
private:
    CPageX m_pageX;
;

// SheetX.cpp : implementation file

#include "stdafx.h"
#include "PropertySheetTest.h"
#include "SheetX.h"

IMPLEMENT_DYNAMIC(CSheetX, CPropertySheet)

CSheetX::CSheetX(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
    :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
 AddPage (&m_pageX);   

CSheetX::CSheetX(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
 AddPage (&m_pageX);   

CSheetX::~CSheetX()      

BEGIN_MESSAGE_MAP(CSheetX, CPropertySheet)
END_MESSAGE_MAP()

// PaheX.h
#pragma once

class CPageX : public CPropertyPage

    DECLARE_DYNAMIC(CPageX)    
public:
    CPageX();
    virtual ~CPageX();
    enum  IDD = IDD_PAGEX ;    
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    virtual BOOL OnInitDialog ();
    DECLARE_MESSAGE_MAP()    
private:
    CEdit m_readOnlyEdit;
    CEdit m_regularEdit;
;
// PageX.cpp : implementation file

#include "stdafx.h"
#include "PropertySheetTest.h"
#include "PageX.h"    

#define ID_EDITCTRL     151    
IMPLEMENT_DYNAMIC(CPageX, CPropertyPage)

CPageX::CPageX()
    : CPropertyPage(CPageX::IDD)    

CPageX::~CPageX()    

void CPageX::DoDataExchange(CDataExchange* pDX)

    CPropertyPage::DoDataExchange(pDX);


BOOL CPageX::OnInitDialog ()
    
    BOOL retVal = CPropertyPage::OnInitDialog ();
    m_readOnlyEdit.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL|ES_READONLY, CRect (10,10,100,30), this, ID_EDITCTRL);
    m_readOnlyEdit.SetWindowText (L"read only");
    m_regularEdit.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL, CRect (110,10,200,30), this, ID_EDITCTRL+1);
    m_regularEdit.SetWindowText (L"editable");
    return retVal;
    

BEGIN_MESSAGE_MAP(CPageX, CPropertyPage)
END_MESSAGE_MAP()

我可以通过在 CPropertyPage 中处理 WM_CTLCOLORSTATIC 并返回默认对话框背景颜色的画笔来添加白色背景颜色的解决方法。但这对我来说似乎不对。另一方面,msdn 表示将 WM_CTLCOLORSTATIC 发送给父级,以便它指定背景颜色。由于有问题的 CEdit 控件的父级是 CPropertyPage 我猜这就是它返回白色画笔的原因。 或者我在 CPropertyPage 上做错了什么?

【问题讨论】:

【参考方案1】:

这是默认的 Windows 行为。因此必须选择:坚持默认的窗口行为或将 WM_CTLCOLORSTATIC 消息从 CPropertyPage 传输到 CPropertySheet,后者返回其背景颜色(默认为灰色)。在经典主题上一切正常,因为 CPropertyPage 的颜色是灰色的。

【讨论】:

以上是关于CPropertyPage 中的 CEdit 只读背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

CEdit使用(Edit Control控件)

MFC:CToolTipCtrl 导致 ASSERT

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

在 CEdit 文本更改时选择 CListCtrl 中的项目