• 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,结果如下(可拖动):

     

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    Linux 进程通信之:内存共享(Shared Memory)(转,好文章)
    进程和线程的对比和区别(转)
    CentOS下安装gdb的方法
    有关职业发展的帖子(整理)
    阿里钉钉面试题
    SSIS添加分区-动态
    java内存占用问题(一)
    网络网关TCP/IP
    java代码数组求平均值,最大值,最小值
    java代码。。。圆的面积好搞人。。。不是一般的搞人。。。欢迎指点指点
  • 原文地址:https://www.cnblogs.com/htj10/p/11780095.html
Copyright © 2020-2023  润新知