【问题标题】:MFC: FrameRgn is not framing the entire regionMFC:FrameRgn 未对整个区域进行构图
【发布时间】:2015-05-01 14:48:24
【问题描述】:

我从对话框属性创建了一个基于对话框的应用程序,我删除了标题栏并设置了无边框。然后我使用 MOveWindow() 修改了对话框大小并将对话框形状更改为多边形区域和应用的框架区域。它工作正常。

但是当我创建一个基于对话框的应用程序编程时,我删除了标题栏和对话框框架,如下所示:

ModifyStyle(WS_CAPTION,0);
ModifyStyle(WS_DLGFRAME,0)
  • 然后,我使用 MOveWindow() 以编程方式修改了对话框大小,并将对话框形状更改为多边形区域并应用了框架区域。该框架未出现在对话框周围。它只在左侧和顶部。

    BOOL CDialogShapeDlg::OnInitDialog() { CDialogEx::OnInitDialog();

    ModifyStyle(WS_CAPTION,0);
    ModifyStyle(WS_DLGFRAME,0);
    
    CRect rect;
    GetClientRect(&rect);
    MoveWindow(rect.left,rect.top,400,500);
    
    GetClientRect(&rect);
    CPoint vertex[4];
    vertex[0] = CPoint(rect.left,rect.top);
    vertex[1] = CPoint(rect.right,rect.top);
    vertex[2] = CPoint(rect.right,rect.bottom);
    vertex[3] = CPoint(rect.left,rect.bottom);
    
    
    rgn.CreatePolygonRgn(vertex,4,ALTERNATE);
    HGDIOBJ hRgn = rgn.Detach();
    ::SetWindowRgn(GetSafeHwnd(), (HRGN)hRgn, TRUE);
    rgn.CreatePolygonRgn(vertex,4,ALTERNATE);
    return TRUE;  
    

    }

    void CDialogShapeDlg::OnPaint() { CPaintDC dc(这个); CBrush *pBrush = new CBrush(RGB(255,0,0)); dc.FrameRgn(&rgn,pBrush,1,1); }

请帮忙。 谢谢

【问题讨论】:

    标签: winapi mfc


    【解决方案1】:

    使用区域是一项高级功能,从您的代码和问题来看,您是初学者。您应该阅读更多有关 Windows 编程的信息。然后你就会知道你可能正在使用 GetWindowRect() 而不是 GetClientRect()。 GetClientRect() 以窗口客户空间坐标返回窗口客户区的大小。

    【讨论】:

    • 其实我想在客户区周围画一个框架。所以从对话框中我删除了边框和标题。所以现在剩下的就是客户区了。然后我试图在它周围画一个框架。所以我使用了GetClientArea。即使我按照您的建议使用 GetWindowRect,我仍然有同样的问题。
    • 如果你只是想绘制框架,那么不要删除样式。那是行不通的。而是处理 WM_NCPAINT 消息。
    • 我的要求是我想在删除对话框标题栏/边框/框架后在对话框周围画一个框架。但这对我来说看起来很奇怪,如果我从对话框属性中删除窗口样式,那么相同的代码工作正常,但如果我尝试通过代码删除,那么问题就来了。
    • 需求错误,忽略了Windows的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多