比如我想在MDI标题栏或者对话框窗体内通过给定的范围,镂空一块(也就是挖空一块),该怎么做?我先谢谢您了,能给点源码最好!
UP有分!!!

解决方案 »

  1.   

    有本书叫Visual C++ 案例教程,其中案例1.7就是,
    给点分吧,我都一个多月没得分了。
      

  2.   

    好像是由API :SetWindowRgn()来实现的。还要建立一个形状区域。你的问题可以这样:建立一个窗体矩形区域,再在此区域内建立一个挖空的区域,然后再将将两个区域异或化合,最后用API将区域转换成窗体。
      

  3.   

    combineRgn也需要用到啊int CombineRgn(
      HRGN hrgnDest,      // handle to destination region
      HRGN hrgnSrc1,      // handle to source region
      HRGN hrgnSrc2,      // handle to source region
      int fnCombineMode   // region combining mode
    );这样用:
    首先定义三个区域
    hRgn,hRgn1,hRgn2
    再CombineRgn(hRgn,hRgn1,hRgn2,4)
    就是将hRgn2从hRgn1中去掉
    再定义窗体的形状:
    int SetWindowRgn(
      HWND hWnd,     // handle to window
      HRGN hRgn,     // handle to region
      BOOL bRedraw   // window redraw option
    );知道怎么用了?
      

  4.   

    在CMainFrame::OnCreate()中
    CRect rcWnd,rcUnused;
    GetWindowRect(&rcWnd);
    rcUnused.SetRect(....);//要抠掉的矩形CRgn rgnWnd,rgnUnused;
    rgnWnd.SetRectRgn(&rcWnd);
    rgnUnused.SetRectRgn(&rcUnused);
    rgnWnd.CombineRgn(&rgnWnd,&rgnUnused,RGN_XOR);
    SetWindowRgn((HRGN)rgnWnd.GetSafeHandle(),TRUE);具体你可以再修改
      

  5.   

    多谢,多谢!
    我修改了一下,可以镂空了!不过在MDI窗体中必须GetWindowRect(&rect)得到的屏幕坐标转换为客户区坐标才可以有正确的显示哦!不知道怎么回事?而在dialog中却转不转换都无所谓!可是用过SetWindowRgn()后,窗体最大化或者放缩,却不能正常显示了,怎么回事?得重载什么函数不是???
      

  6.   

    在OnSize中,应该重新设定窗体区域。
      

  7.   

    最大化和恢复的时候,应该在 OnSysCommand 里添加对
     SC_MAXIMIZE 和 SC_RESTORE 的处理
      

  8.   

    设好背景后调用CWnd::DrawMenuBar()重画菜单