使用gdi+绘制异形窗口,列出代码实现
时间: 2024-04-24 20:25:41 浏览: 136
以下是使用GDI+绘制异形窗口的示例代码:
```c++
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// 创建窗口
HWND hwnd;
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindowClass";
RegisterClass(&wc);
hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, L"MyWindowClass", L"异形窗口", WS_POPUP,
100, 100, 400, 300, NULL, NULL, hInstance, NULL);
// 设置窗口透明度
SetLayeredWindowAttributes(hwnd, 0, 128, LWA_ALPHA);
// 显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 清理GDI+
GdiplusShutdown(gdiplusToken);
return (int)msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 创建Graphics对象
Graphics graphics(hdc);
// 绘制背景
SolidBrush brush(Color(255, 255, 0, 0)); // 红色
graphics.FillRectangle(&brush, 0, 0, 400, 300);
// 绘制不规则形状
GraphicsPath path;
path.AddEllipse(50, 50, 200, 100);
Region region(&path);
graphics.SetClip(®ion, CombineModeReplace);
// 绘制内部内容
SolidBrush innerBrush(Color(255, 0, 255, 0)); // 绿色
graphics.FillRectangle(&innerBrush, 0, 0, 400, 300);
EndPaint(hwnd, &ps);
}
return 0;
case WM_ERASEBKGND:
return 1; // 留空,避免默认的擦除背景操作
case WM_NCHITTEST:
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
RECT rc;
GetWindowRect(hwnd, &rc);
if (PtInRegion(CreateEllipticRgn(50, 50, 250, 150), pt.x - rc.left, pt.y - rc.top))
return HTCLIENT; // 鼠标在不规则形状的区域,返回HTCLIENT表示在客户区
else
return HTCAPTION; // 鼠标在其他区域,返回HTCAPTION表示在标题栏
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
```
上述代码示例创建了一个异形窗口,窗口形状为一个椭圆。在WM_PAINT消息处理函数中,使用Graphics对象进行绘制操作,首先绘制了一个红色的背景矩形,然后使用GraphicsPath对象创建了一个椭圆形状的区域,并将其应用到绘图上下文中。最后,绘制了一个绿色的矩形作为内部内容。在WM_NCHITTEST消息处理函数中,根据鼠标坐标和窗口的形状判断鼠标在窗口的哪个区域,并返回相应的结果。
阅读全文