win32 纯c函数实现裁剪圆形头像
时间: 2023-07-15 09:15:35 浏览: 54
要实现裁剪圆形头像,可以利用 Win32 GDI 中的圆形裁剪区域(clipping region)函数。
以下是一个简单的纯 C 代码示例:
```c
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 加载图片
HBITMAP hBmp = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
// 创建内存 DC
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, hBmp);
// 获取图片尺寸
BITMAP bmp;
GetObject(hBmp, sizeof(BITMAP), &bmp);
// 创建圆形裁剪区域
HRGN hRgn = CreateEllipticRgn(0, 0, bmp.bmWidth, bmp.bmHeight);
SelectClipRgn(hdc, hRgn);
DeleteObject(hRgn);
// 绘制图片
BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, memDC, 0, 0, SRCCOPY);
// 清除裁剪区域
SelectClipRgn(hdc, NULL);
// 清理资源
SelectObject(memDC, oldBmp);
DeleteDC(memDC);
DeleteObject(hBmp);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASS wc = { 0 };
wc.hInstance = hInstance;
wc.lpszClassName = TEXT("MyApp");
wc.lpfnWndProc = WndProc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindow(TEXT("MyApp"), TEXT("My Window"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hInstance, NULL);
// 显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
```
需要注意的是,上述代码中的 `IDB_BITMAP1` 是一个资源 ID,需要在资源文件中定义并添加一张图片作为头像。