步骤如下:
1、我在自己的工程中增加了一个CButton的派生类:CRgnBtn
2、在派生类中重载PreSubclassWindow函数,添加如下代码:
         //获取按钮大小
CRect rc;
//创建对象
GetClientRect(&rc );
// 创建区域并赋予对话框.
CRgn rgn;
//直接从RECT结构定义的椭圆形区域
rgn.CreateEllipticRgn (0 , 0 , rc.Width( ) , rc.Height ( ) );
//设置区域
SetWindowRgn( (HRGN) rgn ,TRUE );
3、然后在view类OnCreate函数中添加创建按钮代码:
//创建不规则按钮
m_RgnBtn.Create(NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,CRect(210,130,390,180),
this,IDC_BUTTON_RGN);
其中m_RgnBtn为我添加的CRgnBtn对象。
4、可是无法看到按钮变成椭圆。后来我调试了一下,发现程序进入执行GetClientRect(&rc )后,rc的值还都是0,这是为什么??
5、另外一旦设置了区域,按钮就无法点击了,而且无法响应消息,这是为什么呢?恳请诸位老师帮忙了!!

解决方案 »

  1.   

    看看这个
    http://www.vckbase.com/document/viewdoc/?id=1960
      

  2.   

    好象要重写create函数,诸位老师前辈帮忙呀。
      

  3.   

    之前没设置button的rc吧,不知道你的button是不是自己动态生成的,如果是的话create的时候要设置大小吧,不设置也行,然后用个movewindow什么的。
      

  4.   

    我是在视图窗口中用create创建按钮,好像要重载create函数,加入CRgn参数,能否详细解释下。好困扰
      

  5.   

    下面3句:
    CRgn rgn;
    //直接从RECT结构定义的椭圆形区域
    rgn.CreateEllipticRgn (0 , 0 , rc.Width( ) , rc.Height ( ) );
    //设置区域
    SetWindowRgn( (HRGN) rgn ,TRUE );
    要放:
    //创建不规则按钮
    m_RgnBtn.Create(NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,CRect(210,130,390,180),
    this,IDC_BUTTON_RGN);
    后。
    也就是不能在:
    PreSubclassWindow
    中。
      

  6.   

    多谢回复,已经可以了,不过能否说明一下为什么不能放在PreSubclassWindow中吗?而为什么对对话框编辑器中编辑的按钮就可以在PreSubclassWindow中添加设置区域这个步骤??多谢了,困扰我好久了?
      

  7.   

    多谢回复,已经可以了,不过能否说明一下为什么不能放在PreSubclassWindow中吗?而为什么对对话框编辑器中编辑的按钮就可以在PreSubclassWindow中添加设置区域这个步骤??多谢了,困扰我好久了?
      

  8.   

    暂时不结贴,希望得到答案,关于为什么不能放在PreSubclassWindow中这个问题,我想了好几天了!
      

  9.   

    PreSubclassWindow是资源绑定的时才有用  比如你在资源编辑器里加了一个按钮 然后和你的定义的按钮绑定。比如果你要动态创建的话 SetWindowRgn可以写在派生类的OnSize里