HWND 设置标题栏
时间: 2023-07-04 17:07:27 浏览: 48
在 Windows 程序中,可以使用 `SetWindowText` 函数设置窗口的标题栏。具体用法如下:
```c++
#include <Windows.h>
int main()
{
HWND hwnd = GetForegroundWindow(); // 获取当前窗口句柄
SetWindowText(hwnd, L"New Title"); // 设置窗口标题栏为 "New Title"
return 0;
}
```
需要注意的是,如果窗口句柄无效或者权限不够,`SetWindowText` 函数会返回 0。而且,在一些特殊情况下,例如窗口已经被销毁,也会返回 0。因此,在实际使用时,建议先判断窗口句柄是否有效。
相关问题
wpf 设置标题栏颜色
要在WPF应用程序中设置标题栏颜色,你可以使用以下代码:
1. 首先,添加以下命名空间:
```csharp
using System.Windows.Interop;
using System.Runtime.InteropServices;
```
2. 接着,在你的窗口类中添加以下方法:
```csharp
private void SetWindowTitleBarColor(Color color)
{
var hwnd = new WindowInteropHelper(this).Handle;
var accent = new AccentPolicy();
accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND;
accent.AccentFlags = 0x20 | 0x40 | 0x80 | 0x100;
accent.GradientColor = (color.R << 16) | (color.G << 8) | color.B;
var accentStructSize = Marshal.SizeOf(accent);
var accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);
var data = new WindowCompositionAttributeData();
data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY;
data.SizeOfData = accentStructSize;
data.Data = accentPtr;
SetWindowCompositionAttribute(hwnd, ref data);
Marshal.FreeHGlobal(accentPtr);
}
[DllImport("user32.dll")]
internal static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);
[StructLayout(LayoutKind.Sequential)]
public struct AccentPolicy
{
public AccentState AccentState;
public int AccentFlags;
public int GradientColor;
public int AnimationId;
}
public enum AccentState
{
ACCENT_DISABLED = 0,
ACCENT_ENABLE_GRADIENT = 1,
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
ACCENT_ENABLE_BLURBEHIND = 3,
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
ACCENT_INVALID_STATE = 5
}
public enum WindowCompositionAttribute
{
WCA_UNDEFINED = 0,
WCA_NCRENDERING_ENABLED = 1,
WCA_NCRENDERING_POLICY = 2,
WCA_TRANSITIONS_FORCEDISABLED = 3,
WCA_ALLOW_NCPAINT = 4,
WCA_CAPTION_BUTTON_BOUNDS = 5,
WCA_NONCLIENT_RTL_LAYOUT = 6,
WCA_FORCE_ICONIC_REPRESENTATION = 7,
WCA_EXTENDED_FRAME_BOUNDS = 8,
WCA_HAS_ICONIC_BITMAP = 9,
WCA_THEME_ATTRIBUTES = 10,
WCA_NCRENDERING_EXILED = 11,
WCA_NCADORNMENTINFO = 12,
WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
WCA_VIDEO_OVERLAY_ACTIVE = 14,
WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
WCA_DISALLOW_PEEK = 16,
WCA_CLOAK = 17,
WCA_CLOAKED = 18,
WCA_ACCENT_POLICY = 19,
WCA_FREEZE_REPRESENTATION = 20,
WCA_EVER_UNCLOAKED = 21,
WCA_VISUAL_OWNER = 22,
WCA_LAST = 23
}
[StructLayout(LayoutKind.Sequential)]
public struct WindowCompositionAttributeData
{
public WindowCompositionAttribute Attribute;
public IntPtr Data;
public int SizeOfData;
}
```
3. 最后,在窗口的构造函数中调用 `SetWindowTitleBarColor` 方法,并传递一个 `Color` 类型的参数,如下所示:
```csharp
public MainWindow()
{
InitializeComponent();
SetWindowTitleBarColor(Colors.Blue);
}
```
这将设置标题栏的颜色为蓝色。你可以使用任何有效的 `Color` 对象来设置颜色。
winapi 手绘标题栏
要在 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` 是自定义标题栏的高度。
完成以上步骤后,就可以实现一个手绘标题栏的窗口了。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)