2009-10-06 110 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

你确定你的代码块被执行了吗? – 2009-10-06 14:04:33

+0

case语句是,但我认为这更多基于用户交互,例如单击按钮。 我不太确定如何在Win32 API上静态设置颜色。我更习惯于在对象上有颜色属性的C++。 – 2009-10-06 14:09:11

+0

那么,蓝色现在正在工作,我现在有其他地方的白色背景! – 2009-10-06 14:55:05

回答

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; 
} 

另外请注意,这将是有点奇怪过滤WM_COMMAND的wParam参数时的wParam应该为WM_CTLCOLORSTATIC提供HDC。

WM_CTLCOLORSTATIC Notification at MSDN

+1

有没有办法做到这一点,而不处理CTLCOLORSTATIC消息>? – viraj 2011-11-19 10:00:09

+3

上面的解决方案泄漏至少一个GDI对象。没有代码可以调用DeleteObject来调用CreateSolidBrush。我不确定WM_CTLCOLORSTATIC是否在每个绘画操作上传递,或者只在对话框初始化时传递。但泄漏是泄漏。上面的代码应该在WM_INITDIALOG中创建画笔,然后在WM_DESTROY中调用DeleteObject。或者,GetSysColorBrush可能是上述代码的更好解决方案,而不是调用CreateSolidBrush。 – selbie 2014-11-15 01:49:35

+0

@selbie固定。谢谢。 – meklarian 2014-11-17 21:08:57