windows 边框函数 画笔
windows 边框函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static int cxClient, cyClient;
static POINT apt[4];
int i;
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
Rectangle(hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8);
MoveToEx(hdc, 0, 0, NULL);//修改起始位置
LineTo(hdc, cxClient, cyClient);
MoveToEx(hdc, 0, cyClient, NULL);
LineTo(hdc, cxClient, 0);
Ellipse(hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8);
RoundRect(hdc, cxClient / 4, cyClient / 4, 3 * cxClient / 4, 3 * cyClient / 4, cxClient / 4, cyClient / 4);
/*Rectangle(hdc, 100, 100, 300, 200);
Rectangle(hdc, 150, 50, 250, 200);
Ellipse(hdc, 350, 100, 500, 200);
Ellipse(hdc, 550, 100, 700, 250);
RoundRect(hdc, 750, 100, 900, 250,30,40);
Arc(hdc,100, 300, 500, 500, 300, 300, 50, 500);
Chord(hdc, 100, 300, 500, 500, 300, 300, 50, 500);
Pie(hdc, 100, 300, 500, 500, 300, 300, 50, 500);*/
EndPaint(hwnd, &ps);
return 0;
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
画笔
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
HPEN hPen, hOldPen;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
//hPen = (HPEN)GetStockObject(BLACK_PEN);
hPen = CreatePen(BS_SOLID, 100, RGB(255, 0, 0));
hOldPen = (HPEN)SelectObject(hdc, hPen);
//把画笔选入工作区,返回被替换的旧画笔
MoveToEx(hdc, rect.left, (rect.bottom - rect.top) / 2, NULL);
LineTo(hdc, rect.right, (rect.bottom - rect.top) / 2);
SelectObject(hdc, hOldPen);
//把旧画笔送回环境中
EndPaint(hwnd, &ps);
return 0;
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
在代码中
//hPen = (HPEN)GetStockObject(BLACK_PEN);
hPen = CreatePen(BS_SOLID, 100, RGB(255, 0, 0));
hOldPen = (HPEN)SelectObject(hdc, hPen);
GetStockObject 和SelectObject 默认生成HGDIOBJ 类型的队形句柄,如果去掉会报错
错误“C2440: ‘=’: 无法从‘HGDIOBJ’转换为‘HPEN’”
通常发生在尝试将HGDIOBJ
类型的值直接赋值给HPEN
类型的变量时。HGDIOBJ
是一个通用的GDI对象句柄类型,而HPEN
是专门用于表示画笔对象的句柄类型。虽然HPEN
本质上也是HGDIOBJ
,但直接赋值会导致类型不匹配的编译错误。
解决方法
要解决这个问题,可以通过显式类型转换将HGDIOBJ
转换为HPEN
。以下是两种常见的解决方法:
方法一:使用强制类型转换
HGDIOBJ hGdiObj = SelectObject(hdc, hPen);
HPEN hPenSelected = (HPEN)hGdiObj;
通过强制类型转换,将HGDIOBJ
转换为HPEN
。
方法二:直接使用SelectObject
的返回值
如果SelectObject
的返回值是HGDIOBJ
类型,但你知道它实际上是一个HPEN
,可以直接将其强制转换为HPEN
:
HPEN hPenSelected = (HPEN)SelectObject(hdc, hPen);
背景色和混合模式
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static HPEN hPen, hOldPen;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
hPen = CreatePen(PS_DOT, 1, RGB(255,255,255));
hOldPen = (HPEN)SelectObject(hdc, hPen);
SetBkColor(hdc, RGB(0, 255, 0)); //用于填充 画笔 画刷的背景色
SetBkMode(hdc, TRANSPARENT);
SetROP2(hdc, R2_NOT);//混合模式
MoveToEx(hdc, rect.left, (rect.bottom - rect.top) / 2, NULL);
LineTo(hdc, rect.right, (rect.bottom - rect.top) / 2);
SelectObject(hdc, hOldPen);
EndPaint(hwnd, &ps);
return 0;
return 0;
case WM_DESTROY:
DeleteObject(hPen);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}