WM_CTLCOLOR 메시지
5872 단어 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()