小弟因为项目要求,需要实现一个自己的CButton类,这个类要求实现类似任意形状的不规则窗体那样的不规则按钮形状,
我尝试过用实现不规则窗体的方法,SetWindowRgn这样的方式去实现,并且从载了 PreSubClassWindow
,再 PreSubClassWindow 中,实现了类似创建不规则窗体的那种实现代码,但是并没有效果,请教高手,不规则按钮应该怎么实现?

解决方案 »

  1.   

    重载1 DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)    2 OnEraseBkgnd(CDC* pDC)
    BOOL .....::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    return TRUE;
    return CButton::OnEraseBkgnd(pDC);
    }
    3
    void CALUButton::PreSubclassWindow() 
    {
    CButton::PreSubclassWindow();

    ModifyStyle(0, BS_OWNERDRAW); CRect rect;
    GetClientRect(rect); // Convert client coords to the parents client coords
    ClientToScreen(rect);
    CWnd* pParent = GetParent();
    if (pParent) 
    pParent->ScreenToClient(rect); // Resize the window
    MoveWindow(rect.left, rect.top, rect.Width(), rect.Height(), TRUE);}
      

  2.   

    DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    思路: 一般状态,选中状态,按下状态等。创建区域,填充不同的颜色。以及上面字的偏移。
      

  3.   

    可以到www.codeproject.com上找,上面有很多的。
      

  4.   

    各位大哥,
    到底,从载
    1 DrawItem
    2 OnEraseBkgnd
    3 PreSubclassWindow都是有什么用的啊?
    具体实现不规则按钮的功能函数,应该在哪一个函数里面调用啊
      

  5.   

    我是在SDK下封装了一个类,使用贴图方式实现不规则按钮的。
      

  6.   

    找过,网上的都是直接用 
    CRect类得到一个区域,直接画的按钮,不是我所说的那种方式实现的按钮,
      

  7.   

    先在对话框上放置一个按钮,在其properties中选择ownerDraw和bitmap,在---dlg.h中将对按钮的定义如CButton m_button改为CBitmapButton m_button,然后在对话框CPP的onpaint()中对按钮贴图主要使用loadmap,BitBlt函数
      

  8.   

    http://www.vckbase.com/document/viewdoc/?id=561
    这里面有个圆形按钮自绘。
    思路我上面提到过的
      

  9.   

    不规则形状:SetWindowRgn
    外观的话可以用贴图的方式。
    最好就是自己写一个控件了,要怎么画都可以。
      

  10.   

    想问一下,能不能像画不规则窗体一样画不规则按钮,不规则窗体一般的画法是先做一个位图,然后指定该位图中,某个单一的纯色为透明色,然后再用类似 if (dcImage.GetPixel(x, y) == m_colTrans) 这样的语句去一个象素点,一个象素点的比对该象素点的颜色是否是指定的透明色,如果是,就跳过该点,如果不是,就记录该点,然后,把每次记录下来的点通过 rgn.CombineRgn (&rgn, &rgnAdd, RGN_OR); 全部加起来,得到一个不规则的路径,然后把这个路径放到 SetWindowRgn (rgn, TRUE); 里面。
    这样的画法,就可以解决任意的不规则的问题,只要能做的出相应的图片就行,
    我就是想通过类似这样的方法,去实现不规则按钮,可行不?
      

  11.   

    SetWindowRgn就能实现不规则
    不过要事先计算你的区域
    划分,组合区域达到你要的区域