WM_CTLCOLOR 메시지

참고 문장: 백교 오리지널: VC의 미화 인터페이스 편
각 컨트롤이 그려지기 전에 부모 창에 WM 보내기CTLCOLOR 공지 메시지, 메시지 처리 함수에서 텍스트의 전경색, 배경색 및 글꼴을 표시하는 컨트롤을 설정할 수 있습니다.이 메시지 처리 함수는 컨트롤이 구체적으로 그려지기 전에 클라이언트 구역을 지우는 데 사용할 브러시 핸들을 되돌려 달라고 요구합니다.
        WM_CTLCOLOR 매핑 메시지 처리 함수는 afxmsg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor). 일반 코드는 다음과 같습니다.
pDC->SetTextColor(RGB(255, 0, 0));    //       
pDC->SetBkColor(RGB(255, 255, 255));  //       
pDC->SetBkMode(TRANSPARENT);          //TRANSPARENT OPAQUE
pDC->SelectObject(...)

간단한 예는 다음과 같습니다.
//
//m_font1 m_font2 CTestDlg   ,   CFont
//
BOOL CTestDlg::OnInitDialog()
{
        ......
	// TODO: Add extra initialization here
        m_font1.CreatePointFont(120,  TEXT("Impact")); 
        m_font2.CreatePointFont(120,  TEXT("Arial"));
        ......
}

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  Change any attributes of the DC here
	if (nCtlColor == CTLCOLOR_STATIC)
	{
		switch (pWnd->GetDlgCtrlID())
		{
		case IDC_STATIC_1:
			pDC->SetTextColor(RGB(255, 0, 0));
			pDC->SetBkColor(RGB(255, 255, 255));
			pDC->SetBkMode(TRANSPARENT);
			pDC->SelectObject(&m_font1);
			return (HBRUSH)::GetStockObject(BLACK_BRUSH);
			break;
		case IDC_STATIC_2:
			pDC->SetTextColor(RGB(255, 255, 0));
			pDC->SetBkColor(RGB(255, 255, 255));
			pDC->SelectObject(&m_font2);
			return (HBRUSH)::GetStockObject(BLACK_BRUSH);
			break;
		default:
			break;
		}
	}

	// TODO:  Return a different brush if the default is not desired
	return hbr;
}

설명 1
OnCtlColor  nCtlColor  :
    CTLCOLOR_BTN       Button control
    CTLCOLOR_DLG       Dialog box
    CTLCOLOR_EDIT      Edit control
    CTLCOLOR_LISTBOX    List-box control
    CTLCOLOR_MSGBOX     Message box
    CTLCOLOR_SCROLLBAR  Scroll-bar control
    CTLCOLOR_STATIC     Static control

표시, WMCTLCOLOR는 버튼 컨트롤 CButton, 편집 상자 컨트롤 CEdit, ListBox 컨트롤, Static 컨트롤, 스크롤 바 컨트롤 또는 대화상자 자체에 작용할 수 있다.참고: 앞에서 설명한 WMCTLCOLOR는 알림 메시지이며, 하위 컨트롤이 부모 창에 전송되지만, 대화상자 자체에 대해서는 nCtlColor가 CTLCOLORDLG용 WMCTLCOLOR 메시지, 이것은 자신이 자신에게 보낸 것입니다. 분명히 이것은 통고 메시지가 아닙니다.예:
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  Change any attributes of the DC here
	if (nCtlColor == CTLCOLOR_DLG)
		return (HBRUSH)::GetStockObject(BLACK_BRUSH);
	else
		pDC->SetTextColor(RGB(255, 0, 0));

	// TODO:  Return a different brush if the default is not desired
	return hbr;
}
       
    OnCtlColor        PushButton      ,               ,  CheckBox RadioButton OK 。  CSDN     :
    Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight, and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.
      , PushButton       owner-drawn button,          WM_DRAWITEM   ,           afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)。
    
       : ComboBox     
    ComboBox      EditBox,        ,     ListBox       ,  ,  ListBox          ComboBox,  ComboBox    。
      ,           ComboBox             (EditBox    ListBox    ),   ComboBox ID IDC_COMBO,             。
if (pWnd->GetDlgCtrlID() == IDC_COMBO)
{
    pDC->SetTextColor(RGB(255, 0, 0));
}
EditBox와 드롭다운 ListBox의 문자 색상은 변경되지 않았습니다.
             ComboBox  m_combo1,m_combo2。   m_combo1           , m_combo2   。    
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  Change any attributes of the DC here

	// m_combo1 EditBox( EditBox     m_combo1)
	if (nCtlColor == CTLCOLOR_EDIT
		&& pWnd->GetParent()->GetDlgCtrlID() == m_combo1.GetDlgCtrlID())
	{
		pDC->SetTextColor(RGB(255, 0, 0));
	}

	// m_combo1   ListBox
	if (nCtlColor == CTLCOLOR_LISTBOX
		&& m_combo1.GetParent()->GetDlgCtrlID() == pWnd->GetParent()->GetDlgCtrlID())
	{
		//  ListBox m_combo1       
		RECT rectListBox;
		RECT rectComboBox;
		pWnd->GetWindowRect(&rectListBox);
		m_combo1.GetWindowRect(&rectComboBox);
		//   ListBox   m_combo1   ,    m_combo1     ListBox
		if (rectListBox.left == rectComboBox.left
			&& rectListBox.top == rectComboBox.bottom)
		{
			pDC->SetTextColor(RGB(255, 0, 0));
		}
	}

	// TODO:  Return a different brush if the default is not desired
	return hbr;
}
효과는 다음과 같습니다.
           :      MFC CMyComboBox : CComboBox,   WM_CTLCOLOR       。(  :ComboBox  EditBox ListBox   ComboBox    WM_CTLCOLOR  ,   ComboBox                   ,  CComboBox      WM_CTLCOLOR  ,       WM_NOTIFY        )
BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)
	ON_WM_CTLCOLOR()
END_MESSAGE_MAP()

HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  Change any attributes of the DC here
	pDC->SetTextColor(RGB(255, 255, 0));

	// TODO:  Return a different brush if the default is not desired
	return hbr;
}
pDC->SetTextColor(RGB(255, 255, 0));코드 한 마디로 위의 기능을 실현할 수 있다.
       、WM_CTLCOLOR     ,             。
ON_WM_CTLCOLOR_REFLECT()

좋은 웹페이지 즐겨찾기