2013-06-26 3 views
0

제목의 모호성에 사과드립니다. 그러나 문제를 해결하기 위해 어떻게하고 싶은지 잘 모르겠습니다. 기본적으로, 나는 2 개의 단추 그룹을 가지고있다. 사용자가 그룹 중 하나에서 버튼을 선택하면 해당 그룹이 선택되었다는 표시기를 설정하려고합니다. 그래서 그들을 둘러싼 사각형 (파란색) 또는 그룹 뒤의 배경 (또는 배경 이미지)을 색칠하십시오. 최종 사용자는 주변을 둘러싼 직사각형이 좋으므로 좋을 것이라고 지적했습니다. 그룹 상자에서 onCtlColor를 재정의하려고 시도했지만 경계로만 채색을 제한하는 방법을 알지 못합니다. 나는 그것이 절대적으로 z 순서의 가장 먼 뒤에있을 필요가 있다는 것을 알고있다. 어떤 충고?MFC - 컨트롤에 배경 이미지 설정

예제 코드 나는 그룹 상자의 텍스트의 배경색을 변경하는 유일한 방법을 찾을 수

pDC->SetBkColor(GetSysColor(RGB(100,149,237))); 
CRect rect; 
testGb.GetClientRect(rect); 
CBrush brushBlue(RGB(0, 0, 255)); 
CBrush* pOldBrush = pDC->SelectObject(&brushBlue); 

pDC->Rectangle(rect); 
pDC->SelectObject(pOldBrush); 

답변

0

(내가 그것을 상자의 전체를 고통 것을 알고 있어요) :

편집 그룹 상자에 원하는 것을 칠할 수 있습니다!

a) = IDC_GROUPBOX을 CBrush 멤버 변수 m_br 선언과 함께 컬러 브러쉬

b) ID와 그룹 상자 WindowProc 무시 만들기 :

LRESULT CTestMFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ if (message == WM_CTLCOLORSTATIC) 
     if (::GetDlgCtrlID((HWND) lParam) == IDC_GROUPBOX) 
      return (LRESULT) m_br.GetSafeHandle(); 

    return CDialogEx::WindowProc(message, wParam, lParam); 
} 

LRESULT CTestMFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ if (message == WM_CTLCOLORSTATIC) 
     if (::GetDlgCtrlID((HWND) lParam) == IDC_GROUPBOX) 
     { HWND hWnd = (HWND) lParam; 
      HDC hDC = (HDC) wParam; 
      RECT rc; 
      ::GetClientRect(hWnd, &rc); 
      HBRUSH hOldBrush = (HBRUSH) ::SelectObject(hDC, m_br); 
      ::Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); 
      ::SelectObject(hDC, hOldBrush); 
    //  return (LRESULT) m_br.GetSafeHandle(); 
     } 

    return CDialogEx::WindowProc(message, wParam, lParam); 
} 
0

더 나은 코드 (적어도 나를 위해) :

01 23,516,
void MyClass::OnPaint() 
{ 
CPaintDC dc(this); // device context for painting 
COLORREF highlightFillColor; 
CPen nPen, *pOldPen = NULL; 
CBrush nBrush, *pOldBrush = NULL; 
CRect rect; 
GetWindowRect(rect); 

ScreenToClient(rect); 
BmsMemDC memDc(&dc, &rect); 
memDc.SetBkMode(TRANSPARENT); 

//dc.Re 
highlightFillColor = RGB(0x99,0xB4,0xFF); 
nPen.CreatePen(PS_SOLID, 4, highlightFillColor); 
nBrush.CreateSolidBrush(GetSysColor(COLOR_3DFACE)); 

pOldPen = memDc.SelectObject(&nPen); 
pOldBrush = memDc.SelectObject(&nBrush); 

if(leftGroupSelected) 
{   
    rect.SetRect(rect.left + 4, rect.top+30, rect.left + 126, rect.bottom - 5); 
    memDc.FillRect(&rect,&nBrush); 
    memDc.RoundRect(rect.left, rect.top, rect.right, rect.bottom, 8, 8); 
} 
if (rightGroupSelected) 
{ 
    rect.SetRect(rect.left + 134, rect.top+30, rect.left + 256, rect.bottom - 5); 
    memDc.FillRect(&rect,&nBrush); 
    memDc.RoundRect(rect.left, rect.top, rect.right, rect.bottom, 8, 8); 
} 

}

+1

당신은 (내 대답을 참조),이 그룹 상자에 자원 ID를 포기하고 대신 컨트롤의 사각형을 검색하기 위해 더 나은 것 WM_CTLCOLORSTATIC''동안 그림을하지 않으려면 좌표를 하드 코딩하는 중 –