如何在win32中绘制自定义边框?

时间:2014-02-28 10:36:59

标签: windows winapi

如何绘制自定义边框,其实我试图绘制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; 

1 个答案:

答案 0 :(得分:2)

这有点复杂。它需要至少正确处理WM_NCCALCSIZEWM_NCPAINTWM_NCHITTEST

另请注意,自从Aero过来之后我就没有尝试过,而且我知道Aero改变了很多东西:在Aero下,不是只调整实际边框的大小,而是使用无边框窗口,然后调用{{ 1}}函数添加类似边框的外观和行为(MSDN上有an article关于它的内容)。