【问题标题】:How to draw custom border in win32? [duplicate]如何在win32中绘制自定义边框? [复制]
【发布时间】:2014-04-01 07:24:00
【问题描述】:

如何绘制自定义边框,实际上我正在尝试绘制 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; 

【问题讨论】:

  • 一般来说,做自己的非客户绘画是个坏主意。 (仅仅因为你可以做某事并不意味着你应该。)
  • 感谢您的回答。我试过了,但它不起作用。

标签: windows winapi


【解决方案1】:

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

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

【讨论】:

  • 谢谢,你能给出一些想法来处理这个问题吗?我试过但没有得到确切的结果。
  • IIRC,WM_NCCALCSIZE 有一些问题,我从第一次尝试就无法使用它。不幸的是,我手头没有详细信息。对于您的第一个测试,如果您只是在 WM_PAINT 中填充一个矩形,您可能可以忽略 WM_NCPAINT,目标只是确保客户区始终具有正确的大小。
猜你喜欢
  • 2021-05-27
  • 2012-10-09
  • 1970-01-01
  • 2011-11-13
  • 2010-12-29
  • 1970-01-01
  • 2020-11-23
  • 2023-03-15
  • 2012-01-15
相关资源
最近更新 更多