win32 textbox重画,支持垂直居中
时间: 2023-06-30 13:07:15 浏览: 129
Winform TextBox支持垂直居中自定义控件
4星 · 用户满意度95%
要实现win32 textbox的重画并支持垂直居中,可以通过以下步骤实现:
1. 在窗口过程函数中处理WM_CTLCOLORSTATIC消息,该消息会在文本框控件被创建或重画时发送。
2. 在该消息处理中,获取文本框的句柄,并设置文本框的背景颜色和文本颜色。同时,返回一个画刷句柄,用于绘制文本框的背景。
3. 在WM_PAINT消息中,使用GetClientRect获取文本框的客户区矩形,并计算出文本框中文本的垂直居中位置。
4. 使用DrawText函数绘制文本框中的文本,设置绘制参数时,使用DT_SINGLELINE和DT_VCENTER参数实现文本的垂直居中。
下面是一个示例代码:
```
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE: {
// 创建文本框控件
HWND hTextbox = CreateWindowEx(0, L"EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE,
0, 0, 100, 100, hwnd, (HMENU)IDC_TEXTBOX, GetModuleHandle(NULL), NULL);
// 设置文本框字体
HFONT hFont = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, L"Arial");
SendMessage(hTextbox, WM_SETFONT, (WPARAM)hFont, TRUE);
break;
}
case WM_CTLCOLORSTATIC: {
// 获取文本框句柄
HWND hTextbox = (HWND)lParam;
// 设置文本框背景颜色和文本颜色
SetBkColor((HDC)wParam, RGB(255, 255, 255));
SetTextColor((HDC)wParam, RGB(0, 0, 0));
// 返回画刷句柄,用于绘制文本框背景
return (LRESULT)GetStockObject(WHITE_BRUSH);
}
case WM_PAINT: {
// 获取文本框客户区矩形
RECT rect;
GetClientRect(GetDlgItem(hwnd, IDC_TEXTBOX), &rect);
// 计算文本垂直居中位置
int textHeight = rect.bottom - rect.top;
HFONT hFont = (HFONT)SendMessage(GetDlgItem(hwnd, IDC_TEXTBOX), WM_GETFONT, 0, 0);
LOGFONT lf = { 0 };
GetObject(hFont, sizeof(LOGFONT), &lf);
int fontSize = lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight - lf.lfHeight / 4;
textHeight -= fontSize;
// 绘制文本
HDC hdc = GetDC(GetDlgItem(hwnd, IDC_TEXTBOX));
TCHAR text[256] = L"Hello, World!";
DrawText(hdc, text, -1, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
ReleaseDC(GetDlgItem(hwnd, IDC_TEXTBOX), hdc);
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
```
阅读全文