当使用 SetBkMode(TRANSPARENT) 导致 Edit 控件中文字显示重叠时,可以尝试以下几种方法来处理:

  1. 在绘制文本之前,使用 SetBkMode(OPAQUE) 将背景模式设置为不透明。然后在绘制完文本之后,再将背景模式设置回 TRANSPARENT。这样可以保证文本绘制完毕后,背景不会透明。

示例代码:

HDC hdc = GetDC(hWndEdit);
SetBkMode(hdc, OPAQUE);
// 绘制文本代码...

// 绘制完文本后,将背景模式设置回 TRANSPARENT
SetBkMode(hdc, TRANSPARENT);
ReleaseDC(hWndEdit, hdc);
  1. 在处理 WM_PAINT 消息时,使用双缓冲技术。创建一个与 Edit 控件相同大小的内存 DC,并在内存 DC 上绘制文本。然后再将内存 DC 的内容一次性地拷贝到 Edit 控件的 DC 上,以避免重叠问题。

示例代码:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWndEdit, &ps);

    RECT rect;
    GetClientRect(hWndEdit, &rect);

    // 创建内存DC
    HDC hMemDC = CreateCompatibleDC(hdc);
    HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);
    HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, hMemBmp);

    // 在内存DC上绘制文本
    SetBkMode(hMemDC, TRANSPARENT);
    // 绘制文本代码...

    // 将内存DC的内容拷贝到edit控件的DC上
    BitBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hMemDC, 0, 0, SRCCOPY);

    // 清理资源
    SelectObject(hMemDC, hOldBmp);
    DeleteObject(hMemBmp);
    DeleteDC(hMemDC);

    EndPaint(hWndEdit, &ps);
}
break;

通过以上两种方法,你可以处理 SetBkMode(TRANSPARENT) 导致 Edit 控件中文字显示重叠的问题。选择适合你的场景的方法进行处理即可。

MFC Edit 控件使用 SetBkMode(TRANSPARENT) 导致文字重叠的解决方法

原文地址: https://www.cveoy.top/t/topic/o9ns 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录