c - 纯 winapi c GUI 更改静态文本背景

标签 c windows winapi

我正在使用普通的 winapi c 创建一个 GUI,我是这种语言的新手,并且正在努力解决许多人可能认为是基本的问题。有人可以向我解释一下我如何更改静态文本的背景颜色,因为当前是透明的。我用于文本的代码是:

 hwndStatic = CreateWindow(TEXT("static"), TEXT(""), 
              WS_CHILD | WS_VISIBLE,
              10, 70, 90, 25, hwnd, NULL, g_hinst, NULL); 

最佳答案

通常,您可以通过处理 WM_GETCTLCOLORSTATIC 来更改静态文本控件的绘制。

在该处理程序中,您可以更改有关 DC 的内容,例如文本颜色、背景模式、背景颜色,甚至是所选的字体。

您还可以返回一个 GDI 画笔的句柄(通过类型系统使用强制转换来获取它)。控件将先用画笔删除自身,然后再绘制文本。

回调将发生在所有作为当前窗口子项的静态控件上,因此您首先要测试它是否是您关心的子项。

例如:

case WM_CTLCOLORSTATIC:
  HWND hwnd = (HWND) lParam;
  if (hwnd == hwndStatic) {
    HDC hdc = (HDC) wParam;
    ::SetTextColor(hdc, RGB(0xFF, 0, 0));  // set the text to red
    ::SetBkMode(hdc, OPAQUE);
    ::SetBkColor(hdc, RGB(0x00, 0xFF, 0x00));  // set background to green
    HBRUSH hbrBackground = ::GetSysColorBrush(COLOR_WINDOW);  
    return (INT_PTR) hbrBackground;
  }
  return 0;

这显示了您可以做的几件事。您可能不想做所有这些,但看到它们全部付诸实践可能很有教育意义。

请注意,如果您创建了要返回的画笔,则必须跟踪它并在以后将其删除。我依靠 GetSysColorBrush 避免了这个问题。系统拥有这些,所以你不应该删除它们。您还可以将 GetStockObject 用于您不必管理的系统 GDI 对象。但是,如果您需要自定义颜色,则必须使用 CreateSolidBrush,然后将其清理干净。

关于c - 纯 winapi c GUI 更改静态文本背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21101188/

相关文章:

c - 如何使用双指针找到二维数组中列的长度?

windows - CreateFile 如何以 FILE_SHARE_READ 失败并以 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE 成功?

Python命令行不接受制表符

c# - 将信息传回控制台应用程序窗口的批处理

c++ - DirectShow-IMediaDet 只提取第一帧

c - 无效到 HBITMAP 转换问题

c - 我想将输入文件复制到输出文件。

c - MIPS 中的 lw(也有点 C)

c++ - code::blocks 出现奇怪的编译器错误

c - 初始化包含数组的结构