MFC Edit 控件使用 SetBkMode(TRANSPARENT) 导致文字重叠的解决方法
当使用 SetBkMode(TRANSPARENT) 导致 Edit 控件中文字显示重叠时,可以尝试以下几种方法来处理:
- 在绘制文本之前,使用
SetBkMode(OPAQUE)将背景模式设置为不透明。然后在绘制完文本之后,再将背景模式设置回TRANSPARENT。这样可以保证文本绘制完毕后,背景不会透明。
示例代码:
HDC hdc = GetDC(hWndEdit);
SetBkMode(hdc, OPAQUE);
// 绘制文本代码...
// 绘制完文本后,将背景模式设置回 TRANSPARENT
SetBkMode(hdc, TRANSPARENT);
ReleaseDC(hWndEdit, hdc);
- 在处理
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 控件中文字显示重叠的问题。选择适合你的场景的方法进行处理即可。
原文地址: https://www.cveoy.top/t/topic/o9ns 著作权归作者所有。请勿转载和采集!