winapi 手绘标题栏
时间: 2023-09-19 10:11:47 浏览: 44
要在 WinAPI 中实现手绘标题栏,可以使用以下步骤:
1. 创建自定义标题栏
在创建窗口时,设置窗口样式为无标题栏,并创建一个自定义标题栏控件。可以使用 WinAPI 的 `CreateWindow` 函数创建一个自定义标题栏控件。
```
HWND hTitleBar = CreateWindow(
L"TitleBarClass", // 自定义标题栏控件类名
NULL, // 标题栏文本
WS_VISIBLE | WS_CHILD, // 窗口样式
0, 0, 0, 0, // 控件位置和大小
hWnd, // 父窗口句柄
NULL, // 菜单句柄
hInstance, // 应用程序实例句柄
NULL // 附加参数
);
```
2. 绘制标题栏背景
在自定义标题栏控件的绘制过程中,可以使用 WinAPI 的 `FillRect` 函数绘制标题栏的背景,例如:
```
case WM_PAINT:
{
HDC hdc = GetDC(hWnd);
RECT rect;
GetClientRect(hWnd, &rect);
FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 1));
ReleaseDC(hWnd, hdc);
}
break;
```
3. 绘制标题栏按钮
在自定义标题栏控件中添加关闭、最小化、最大化等按钮,并在按钮控件的绘制过程中使用 WinAPI 的 `DrawFrameControl` 函数绘制按钮。例如:
```
case WM_PAINT:
{
HDC hdc = GetDC(hWnd);
RECT rect;
GetClientRect(hWnd, &rect);
// 绘制关闭按钮
DrawFrameControl(hdc, &btnCloseRect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
// 绘制最小化按钮
DrawFrameControl(hdc, &btnMinimizeRect, DFC_CAPTION, DFCS_CAPTIONMIN);
// 绘制最大化/还原按钮
UINT state = (IsZoomed(hWnd)) ? DFCS_CAPTIONRESTORE : DFCS_CAPTIONMAX;
DrawFrameControl(hdc, &btnMaximizeRect, DFC_CAPTION, state);
ReleaseDC(hWnd, hdc);
}
break;
```
其中,`btnCloseRect`、`btnMinimizeRect`、`btnMaximizeRect` 分别是关闭按钮、最小化按钮、最大化/还原按钮的矩形区域。
4. 处理窗口移动和调整大小
在自定义标题栏控件中添加鼠标事件处理程序,实现窗口的移动和调整大小。可以使用 WinAPI 的 `SendMessage` 函数发送 `WM_SYSCOMMAND` 消息来实现窗口的最小化、最大化、还原和关闭。
```
case WM_LBUTTONDOWN:
{
if (PtInRect(&btnCloseRect, pt))
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
}
else if (PtInRect(&btnMinimizeRect, pt))
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
}
else if (PtInRect(&btnMaximizeRect, pt))
{
if (IsZoomed(hWnd))
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
}
else
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
}
else
{
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}
break;
case WM_NCHITTEST:
{
LRESULT hit = DefWindowProc(hWnd, message, wParam, lParam);
if (hit == HTCLIENT)
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
ScreenToClient(hWnd, &pt);
if (pt.y < TITLEBAR_HEIGHT)
{
return HTCAPTION;
}
}
return hit;
}
break;
```
其中,`pt` 是鼠标点击位置的坐标,`btnCloseRect`、`btnMinimizeRect`、`btnMaximizeRect` 分别是关闭按钮、最小化按钮、最大化/还原按钮的矩形区域。`TITLEBAR_HEIGHT` 是自定义标题栏的高度。
完成以上步骤后,就可以实现一个手绘标题栏的窗口了。