0

CPropertyPage に配置された CEdit コントロールの既定の背景色は何ですか? 私が困惑しているのは、CEdit のホストが変更されると背景色が異なることです。つまり、CEdit を含む CTabCtrl を含むダイアログがある場合、読み取り専用の CEdit の背景は灰色になります (Windows のデフォルトの背景だと思います)。ただし、CDialog の代わりに CPropertySheet と CPropertyPage を使用すると、読み取り専用の CEdit の背景は白になります。CDialog の場合: 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 で何か間違ったことをしている可能性がありますか?

4

1 に答える 1

0

これは Windows のデフォルトの動作です。したがって、選択する必要があります: デフォルトのウィンドウの動作に固執するか、WM_CTLCOLORSTATIC メッセージを CPropertyPage から背景色 (デフォルトではグレー) を返す CPropertySheet に転送します。クラシック テーマでは、CPropertyPage の色が灰色であるため、すべてが正しく機能します。

于 2012-05-31T07:56:03.077 に答える