GDI+的PNG透明4状态按钮,放到DIALOG或者FRAMEWND上就不刷新自己了

aben456 2012-03-11 03:08:00
诚向各位高手求教!!!
这个类可以在网络上找到,单独使用没问题,可加上背景以后,透明的地方就漏出来了。
对GID+不太熟,见谅!
背景已处理 OnCtlColor, OnEraseBkGrnd之类的函数。

class CGdipButton : public CButton
{
public:

CGdipButton();
virtual ~CGdipButton();

// image types
enum {
STD_TYPE = 0,
ALT_TYPE,
DIS_TYPE
};

// sets the image type
void SetImage(int type);

BOOL LoadAltImage(UINT id, LPCTSTR pType);
BOOL LoadStdImage(UINT id, LPCTSTR pType);

// if false, disables the press state and uses grayscale image if it exists
void EnableButton(BOOL bEnable = TRUE) { m_bIsDisabled = !bEnable; }

// in toggle mode each press toggles between std and alt images
void EnableToggle(BOOL bEnable = TRUE);

// return the enable/disable state
BOOL IsDisabled(void) {return (m_bIsDisabled == TRUE); }

void SetBkGnd(CDC* pDC);

void SetToolTipText(CString spText, BOOL bActivate = TRUE);
void SetToolTipText(UINT nId, BOOL bActivate = TRUE);
void SetHorizontal(bool ImagesAreLaidOutHorizontally = FALSE);
void DeleteToolTip();


protected:

void PaintBk(CDC* pDC);
void PaintBtn(CDC* pDC);

BOOL m_bHaveAltImage;
BOOL m_bHaveBitmaps;

BOOL m_bIsDisabled;
BOOL m_bIsToggle;
BOOL m_bIsHovering;
BOOL m_bIsTracking;

int m_nCurType;

CGdiPlusBitmapResource* m_pAltImage;
CGdiPlusBitmapResource* m_pStdImage;

CString m_tooltext;
CToolTipCtrl* m_pToolTip;

void InitToolTip();

virtual void PreSubclassWindow();
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
virtual BOOL PreTranslateMessage(MSG* pMsg);

//{{AFX_MSG(CGdipButton)
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam);
afx_msg LRESULT OnMouseHover(WPARAM wparam, LPARAM lparam) ;
//}}AFX_MSG

DECLARE_MESSAGE_MAP()

private:

CDC m_dcBk; // button background

CDC m_dcStd; // standard button
CDC m_dcStdP; // standard button pressed
CDC m_dcStdH; // standard button hot

CDC m_dcAlt; // alternate button
CDC m_dcAltP; // alternate button pressed
CDC m_dcAltH; // alternate button hot

CDC m_dcGS; // grayscale button (does not have a hot or pressed state)

CDC* m_pCurBtn; // current pointer to one of the above

};
...全文
447 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyunde 2013-07-04
  • 打赏
  • 举报
回复
我也用了这个,一张PNG就可以实现3态
reage_wang 2012-04-24
  • 打赏
  • 举报
回复
这么多分啊。。过来接分。。楼主好人啊
向立天 2012-04-18
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
hideforever 2012-03-12
  • 打赏
  • 举报
回复
这个类我也用了,放在对话框上没问题啊,你的问题是什么没明白
疯狂-的-蜗牛 2012-03-11
  • 打赏
  • 举报
回复
大牛啊,这么多分子
向立天 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aben456 的回复:]

自己解决。
父窗口要取消 WS_CLIPCHILDREN 属性即可
[/Quote]
谢谢分享
zgl7903 2012-03-11
  • 打赏
  • 举报
回复
aben456 2012-03-11
  • 打赏
  • 举报
回复
自己解决。
父窗口要取消 WS_CLIPCHILDREN 属性即可

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧