2009-09-28 3 views
1

나는 CButton을 사용하여 소유자가 그려진 체크 상자를 만들려고하지만, 텍스트 색상 만 바꾸고 싶으므로 체크 상자 표시를 그대로 유지하고 싶습니다.기본 확인란 이미지를 얻으려면 어떻게해야합니까?

프로그램이 실행되는 플랫폼의 기본 확인란 비트 맵을 검색 할 수있는 명령이 있습니까?

는 (또는 : 어떻게 체크 박스 표시를 보존, 텍스트 만의 색상을 변경할 수 있습니다?)

답변

4

UxTheme.dll을 사용하여 사용자 정의 확인란을 그립니다.

먼저 내가 체크 박스 마크 사용 그릴 : DrawThemeBackground 그것을 수정하는 구형을 전달 (checkboxRect.right = pCustomDraw-> rc.left + 15)

그리고 나 자신이 사용하여 텍스트를 그릴 :: DrawText.

도움이되기를 바랍니다.

+1

그 작품, 게다가 그 CMFCVisualManager :: GetInstance() -> DrawCheckBox 똑같은 않습니다 알아 냈어. – djeidot

+0

문제를 해결할 수 있다는 점을 잘 알고 있습니다! –

+0

그래, 텍스트 색상을 변경하는 작업은 여전히 ​​많이 있지만 그래도 ... – djeidot

1

는 당신의 최선의 전략은 OnCtlColor 핸들러를 오버라이드 (override)하는 것입니다 :

BEGIN_MESSAGE_MAP(CBaseDialog, CDialog) 
{ 
    ON_WM_CTLCOLOR() 
} 

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

    pDC->SetTextColor(RGB(255,0,0)); // red 
    pDC->SetBkMode (TRANSPARENT); 
    return hBkgrBrush; 
} 

참조 http://msdn.microsoft.com/en-us/library/0wwk06hc(VS.80).aspx|

+0

하지만 CButtons에서는 작동하지 않습니다 ... 배경색을 설정할 수는 있지만 SetTextColor 명령이 작동하지 않습니다. – djeidot

+0

포함 대화 상자 수준에서 구현하면 작동합니다. –

+0

나를 위해 작동하지 않습니다. MFC 기능 팩에서 CMFCVisualManager를 사용하여 응용 프로그램 모양을 설정했는지, 그 이유는 무엇입니까? – djeidot

1

텍스트 색상 만 변경하려는 경우 포함 대화 상자에서 OnCtlColor에 대한 핸들러를 구현하십시오. 이처럼 :

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

    if(pWnd->GetDlgCtrlID() == IDC_CHECK_BOX) //check for your check box control ID 
    { 
     pDC->SetTextColor(RGB(255,0,0)); 
    } 
    return hbr; 
} 

이 일반 푸시 버튼에없는 작동을 조심하지만, 체크 박스에 대한 아무 문제가 없어야합니다. 소유자가 그린 컨트롤을 구현할 필요가 없습니다.

편집 : 당신은 확인해야

, 당신의 체크 박스는 BS_AUTOCHECKBOX 스타일을 사용합니다. BS_OWNERDRAW 스타일이 설정되지 않았는지 확인하십시오.

편집 # 2 : DFCS_BUTTONCHECK와 DrawFrameControl()는 기본 확인란 비트 맵을 그릴 수있게된다.

+0

@ Lior Kogan의 대답을 확인하십시오. – djeidot

+0

예제를 작성하고 제안 된 변경 사항을 적용하면 정상적으로 작동합니다. 어쩌면 코드를 더 게시 할 수 있습니다. Lior Kogan이 제안했듯이 대화 상자가 포함 된 핸들러를 구현하고 메시지 맵에 올바르게 등록해야합니다. –

+0

VS2003에서는 작동하지만 VS2008에서는 작동하지 않습니다. 여전히 DrawFrameControl()을 확인하고 있습니다. – djeidot

관련 문제