2012-05-17 42 views
0

放置在某個CPropertyPage中的CEdit控件的默認背景顏色是什麼? 讓我感到困惑的是,當一系列CEdit被改變時,背景顏色會有所不同。也就是說,如果有一個與CTabCtrl對話的CEdit,只讀CEdit的背景是灰色的(我想這是Windows中的默認設置)。但是,如果使用CPropertySheet和CPropertyPage而不是CDialog,則只讀CEdit的背景爲白色。 隨着CDialog的: Default behaviour in CDialogCEdit CPropertyPage中的只讀背景顏色

而且隨着CPropertySheet的: enter image description here

用於構建這些窗口中的代碼:基於

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錯誤?

回答

0

這是默認的Windows行爲。因此,必須選擇:使用默認的窗口行爲或將CP_Collection屬性頁中的WM_CTLCOLORSTATIC消息傳遞給CPropertySheet,該函數返回其背景色(默認爲灰色)。在經典主題上,一切正常,因爲CPropertyPage的顏色是灰色的。