派生一个按钮类,重载它的drawitem函数,用SetWindowRgn改变按钮的形状就行了。

解决方案 »

  1.   

    to adphone 
    可能我说的有点问题,补充一下
    将这些箭头和三角形作为一个窗口对象放在大的窗口中。
      

  2.   

    方法1:用CDC绘制,记住它们的位置,在鼠标事件中判断。(占用系统资源少,但是代码复杂)。
    方法二:作三角形的窗口。(占用系统资源多,易于实现)。
    可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。
      

  3.   

    做个三角形的static control就可以了吗
      

  4.   

    例子:
    给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。
    Class CRoundDlg : public CDialog
    {
     …
    private :
     Crgn m_rgn : // window region
     …
    }
    修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口:
    BOOL CRoundDlg : : OnInitDialog ( )
    {
     CDialog : : OnInitDialog ( ) //Get size of dialog .
     CRect rcDialog
     GetClientRect (rcDialog ) // Create region and assign to window .
     m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) )
     SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE ) return TRUE
    }
      

  5.   

    当个makergn做什么形状的窗口都行!
      

  6.   

    to  macy_wang(小鸟) 
    恕小弟无知,哪儿有makergn?
      

  7.   

    例子:
    给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。
    Class CRoundDlg : public CDialog
    {
     …
    private :
     Crgn m_rgn : // window region
     …
    }
    修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口:
    BOOL CRoundDlg : : OnInitDialog ( )
    {
     CDialog : : OnInitDialog ( ) //Get size of dialog .
     CRect rcDialog
     GetClientRect (rcDialog ) // Create region and assign to window .
     m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) )
     SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE ) return TRUE
    }
      

  8.   

    可以给例程,若需要将EMail和需要一起发个短信息给我。