MFC中GDI之CRgn类


API:Application Programming Interface,应用程序编程接口
GDI:Graphic Device Interface 图形设备接口,它也是API的一种,是一组专门负责窗口显示和图形绘制的编程接口。
DC:Device Context 一般称为设备上下文、设备环境或设备描述表。
HDC:Handle of DC 设备环境句柄    HWND:窗口句柄

DC好比画布,GDI对象好比画具,画家使用不同的画具(画笔、画刷、颜料等)在画布上画出绚丽多彩的画。PS:我就是画家了..

GDI对象包括六种类型,全是CGdiObject的派生类
① CPen (画笔)
② CBrush(画刷)
③ CFont(字体)
④ CBitmap(位图)
⑤ CRgn(区域)
⑥ CPalette(调色板)

 https://www.cnblogs.com/weiqubo/archive/2009/12/24/1930029.html

 

CRgn类(区域)
新建对话框类,修改OnPaint(),

复制代码
void CCRgnDlg::OnPaint()
{
    CPaintDC dc(this);
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP1);
    BITMAP bm;
    bmp.GetBitmap(&bm);
    int cx = bm.bmWidth;
    int cy = bm.bmHeight;
    CDC mdc;
    mdc.CreateCompatibleDC(&dc);
    mdc.SelectObject(&bmp);

    /////////////// 创建不规则区域 /////////////////
    POINT pts[] = {
        { 120, 10 }, { 10, 190 }, { 230, 190 },
        { 10, 70 }, { 230, 70 }, { 120, 240 },
    };
    CRgn rg1;
    rg1.CreatePolygonRgn(pts, 3, WINDING);//创建多边形1
    CRgn rg2;
    rg2.CreatePolygonRgn(pts+3, 3, WINDING);//创建多边形2
    rg2.CombineRgn(&rg1, &rg2, RGN_OR);//联合多边形1,2
    dc.SelectObject(&rg2);
    dc.BitBlt(0, 0, cx, cy, &mdc, 0, 0, SRCCOPY);

    /////////////// 创建圆角矩形区域 /////////////////////
    int nLeft = cx - 80;
    int nTop = cy - 50;
    CRgn rg3;
    rg3.CreateRoundRectRgn(nLeft, nTop, nLeft + cx, nTop + cy, 32, 32);//前四个数是Rect的l,t,r,b;最后两个表示圆角的大小
    dc.SelectObject(&rg3);
    dc.BitBlt(nLeft, nTop, cx, cy, &mdc, 0, 0, SRCCOPY);

}
View Code
复制代码

 

 

 在OnPaint函数中添加:
    rg2.CombineRgn(&rg2, &rg3, RGN_OR);
    SetWindowRgn(rg2, TRUE);

添加WM_NCHITTEST消息映射函数

LRESULT CCRgnDlg::OnNcHitTest(CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    UINT nHitTest = CDialog::OnNcHitTest(point);
    if (nHitTest == HTCLIENT)
        nHitTest = HTCAPTION;
    return nHitTest;
}

设置对话框的Border为None,结果如下(可拖动):

 

 

posted @   htj10  阅读(908)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
TOP
点击右上角即可分享
微信分享提示