如何绘制自定义边框,其实我试图绘制1像素边框但失败了,我们怎么能实现这个呢? 我曾经试过这个。但是失败了。我尝试这样它在窗户没有儿童窗户时工作正常..在我的情况下,在我的窗户上有3个儿童窗口,在这种情况下,我得到了闪烁。
case WM_NCACTIVATE :
{
if(TRUE == wParam)
{
stateofWindow = true;
InvalidateRect(hwnd,NULL,true);
}
else if(FALSE == wParam )
{
stateofWindow = false;
InvalidateRect(hwnd,NULL,true);
}
}
break;
case WM_NCCALCSIZE :
{
if (true == wParam )
{
return 0;
}
}
break;
case WM_PAINT:
{
HDC hcd = NULL;
PAINTSTRUCT ps;
hcd = BeginPaint(hwnd,&ps);
HPEN hPen = CreatePen(PS_SOLID, 1, RGB(165,165,165));;
SelectObject(hcd, hPen);
RECT rcClientRect = {0};
GetClientRect(hwnd,&rcClientRect);
//GetWindowRect(hwnd,&rcClientRect);
if(FALSE == stateofWindow)
{
MoveToEx(hcd,rcClientRect.left,rcClientRect.top,NULL);
LineTo(hcd,rcClientRect.right-1,rcClientRect.top );
LineTo(hcd,rcClientRect.right-1,rcClientRect.bottom-1 );
LineTo(hcd,rcClientRect.left,rcClientRect.bottom-1 );
LineTo(hcd,rcClientRect.left,rcClientRect.top);
}
else
{
HPEN hPen1 = CreatePen(PS_SOLID, 1, RGB(255,0,0));;
SelectObject(hcd, hPen1);
MoveToEx(hcd,rcClientRect.left,rcClientRect.top,NULL);
LineTo(hcd,rcClientRect.right-1,rcClientRect.top );
LineTo(hcd,rcClientRect.right-1,rcClientRect.bottom-1 );
LineTo(hcd,rcClientRect.left,rcClientRect.bottom-1 );
LineTo(hcd,rcClientRect.left,rcClientRect.top);
}
EndPaint(hwnd,&ps);
}
break;
答案 0 :(得分:2)
这有点复杂。它需要至少正确处理WM_NCCALCSIZE
,WM_NCPAINT
和WM_NCHITTEST
。
另请注意,自从Aero过来之后我就没有尝试过,而且我知道Aero改变了很多东西:在Aero下,不是只调整实际边框的大小,而是使用无边框窗口,然后调用{{ 1}}函数添加类似边框的外观和行为(MSDN上有an article关于它的内容)。