2009-10-06 7 views
3

대화 상자를 제어하는 ​​DLL을 만들고 있습니다. 나는 빨간 글씨가있는 특정 영역을 얻는 것을 좋아한다. 이 코드는 컴파일되지만 효과는 나타나지 않습니다. 여기에 dialogProc이 완료되는 영역은 다음과 같습니다정적 텍스트 색상 설정 Win32

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
    case WM_INITDIALOG:  
     CheckDlgButton(hDlg, IDC_CHECK, FALSE); 
     EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
     return TRUE; 

    case WM_COMMAND: 
     switch (LOWORD(wParam)) 
     { 
     case IDC_CHECK: 
      if (IsDlgButtonChecked(hDlg, IDC_CHECK)) 
      { 
       EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); 
       EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE); 
      } 
      else 
      { 
       EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
       EnableWindow(GetDlgItem(hDlg, IDCANCEL), TRUE); 
      } 
      break; 
     case IDOK: 
      {   
       EndDialog(hDlg, TRUE); 
       return FALSE; 
      } 
     case IDCANCEL: 
      {    
       EndDialog(hDlg, FALSE); 
       return FALSE; 
      } 
     case WM_CTLCOLORSTATIC: 
      // Set the colour of the text for our URL 
      if ((HWND)lParam == GetDlgItem(hDlg,IDC_WARNING)) 
      { 
       // we're about to draw the static 
       // set the text colour in (HDC)lParam 
       SetBkMode((HDC)wParam,TRANSPARENT); 
       SetTextColor((HDC)wParam, RGB(255,0,0)); 
       return (BOOL)CreateSolidBrush (GetSysColor(COLOR_MENU)); 
      } 
    return TRUE; 
     } 
    } 
    return FALSE; 
} 
+0

코드 블록이 실행 되었습니까? –

+0

case 문은 그렇지만 버튼을 클릭하는 것과 같은 사용자 상호 작용에 기반한다고 생각합니다. Win32 API에서 색상을 정적으로 설정하는 방법이 너무 명확하지 않습니다. 나는 C++에서 객체에 색상 속성이있는 곳이 많다. –

+0

음, 파란색이 이제 작동 중입니다. 이제는 흰색 배경이 도처에 있습니다! –

답변

8

WM_CTLCOLORSTATIC는 WM_COMMAND에서 별도의 메시지입니다. WM_COMMAND 특정 항목에 대한 점검 내에서 메시지 확인이 제외된다는 점을 제외하고는 원하는 메시지 처리가 정확합니다. 외부 switch 문을 재구성 해보십시오. 다음과 같은 아마 뭔가 :

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, 
          WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
    case WM_INITDIALOG:   
     // ... 
     break; 
    case WM_COMMAND: 
     switch (LOWORD(wParam)) 
     { 
     case IDC_CHECK: 
      // ... 
      break; 
     case IDOK: 
      // ... 
      break; 
     case IDCANCEL: 
      // ... 
      break; 
     } 
     break; 
    case WM_CTLCOLORSTATIC: 
     // Set the colour of the text for our URL 
     if ((HWND)lParam == GetDlgItem(hDlg, IDC_WARNING)) 
     { 
       // we're about to draw the static 
       // set the text colour in (HDC)lParam 
       SetBkMode((HDC)wParam,TRANSPARENT); 
       SetTextColor((HDC)wParam, RGB(255,0,0)); 
       // NOTE: per documentation as pointed out by selbie, GetSolidBrush would leak a GDI handle. 
       return (BOOL)GetSysColorBrush(COLOR_MENU); 
     } 
     break; 
    } 
    return FALSE; 
} 

또한의 wParam이 WM_CTLCOLORSTATIC의 HDC를 제공하도록되어 때 WM_COMMAND의의 wParam 인수를 필터링하는 좀 이상한 것이 있습니다.

WM_CTLCOLORSTATIC Notification at MSDN

+1

CTLCOLORSTATIC 메시지를 처리하지 않고이 작업을 수행 할 수있는 방법이 있습니까?>? – viraj

+3

위의 솔루션은 하나 이상의 GDI 개체를 누수합니다. CreateSolidBrush를 호출 할 때 DeleteObject를 호출하는 코드는 없습니다. WM_CTLCOLORSTATIC 각 페인트 작업에 전달되는 경우 또는 대화 초기화에서만 경우 잘 모르겠습니다. 그러나 누출은 누수입니다. 위의 코드는 WM_INITDIALOG에 브러쉬를 만들고 WM_DESTROY에서 DeleteObject를 호출해야합니다. 또는 CreateSolidBrush를 호출하는 대신 GetSysColorBrush를 사용하여 위 코드를 더 잘 처리 할 수 ​​있습니다. – selbie

+0

@selbie가 수정되었습니다. 고맙습니다. – meklarian