关于自绘CheckBox而出现的问题

Panghuang 2009-10-12 08:57:04
我准备重载CButton类,实现自绘CheckBox,就是用两幅图片代替系统的方框,现在发现一个问题,就是当点击CheckBox然后放开鼠标后,还是会出现系统方框,经过跟踪发现处理BM_SETSTATE的时候画的,有没有人碰到类似问题,有没有啥好点的解决方法?

谢谢,在线恭候!
...全文
916 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
chkgg 2012-09-26
  • 打赏
  • 举报
回复
CButton::OnLButtonUp(nFlags, point);
this->OnBkg(rectDraw[UP],ptDraw[UP]);
我的代码是这样的,先执行微软写得函数,然后自绘再覆盖它。可是最后没有覆盖这是为什么?
chkgg 2012-09-26
  • 打赏
  • 举报
回复
我想问下你是怎样跟踪到的BM_SETSTATE,我也遇到问题,我找不到时什么原因
zhllxt 2009-10-20
  • 打赏
  • 举报
回复
我搞过一段界面自绘,对界面的自绘算是有点小心得吧。对于CheckBox和RadioBox,如果你给它加上BS_OWNERDRAW属性,你会发现你再点击这些个CheckBox和RadioBox时,他们的状态不会改变,就是不会自己打上勾,去掉勾,原因是加上了BS_OWNERDRAW属性以后,他们的BS_AUTOCHECKBOX属性丢失了,啥原因我也不知道,所以我觉得还是别加BS_OWNERDRAW属性,那样反而更麻烦,后来我就直接重载CheckBox的OnPaint函数了,结果又发现一个问题,就是在CheckBox上点击鼠标,不要松开,这时CheckBox就会自己画一个系统的灰色方框,(这点我就觉得微软搞得不够理想,它没有把CButton的所以绘制代码都放在OnPaint里),如果要想不让它出现系统灰色框,我的做法是重载CButton的DefWindowProc虚函数,截获BM_SETSTATE消息,判断该消息的wParam参数,在CCheckBox这个类中加入成员变量m_bIsPressed,如下:
	case BM_SETSTATE:
if( (UINT)m_bIsPressed != wParam )
{
m_bIsPressed = ( wParam == TRUE );
break;
}
return CButton::DefWindowProc(message, wParam, lParam);

注意上面有个break;跳出,在跳出后我是这样做的:
	LRESULT lResult = CButton::DefWindowProc(message, wParam, lParam);

Draw();//自己的绘制函数
return lResult;


你试试,保证可以,我用了很久了。
Panghuang 2009-10-20
  • 打赏
  • 举报
回复
楼上的,我试了一下,不行

我处理的是CheckBox的,发现不进入OnNMCustomdraw函数的,我用VC6,不知道你用啥
Panghuang 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xylicon 的回复:]
貌似我以前也遇到同样的问题,后来我是自己继承Button类写了一个Check类,也就是不用按钮的BS_CHECKBOX 风格,这样就不会有默认的勾选,我自己实现所有的勾选和去勾选。还有需要加2个成员函数SetCheck和GetCheck。
[/Quote]
这样太累赘了点,我希望能找到一个简洁的方法.
希望大家指点指点
youyifang 2009-10-13
  • 打赏
  • 举报
回复
你在PreSubclassWindow函数中加入如下代码看看:

UINT nBS;

nBS = GetButtonStyle();
SetButtonStyle(nBS | BS_OWNERDRAW);

youyifang 2009-10-13
  • 打赏
  • 举报
回复
邮箱给我,给你一个例子。
Panghuang 2009-10-13
  • 打赏
  • 举报
回复
看来比较麻烦了,有没有那位整过CheckBox的
joimson 2009-10-13
  • 打赏
  • 举报
回复
有点麻烦
主要是看你处理的够不够全面,有的状态可以不处理,有的得处理。
尤其是在自定义一个控件时。
向立天 2009-10-13
  • 打赏
  • 举报
回复
无论是在OnPaint中重绘还是在DrawItem中重绘
都可以获取到按钮的各个状态
要针对各个状态分别重绘
每个状态都处理到
jyh_baoding 2009-10-13
  • 打赏
  • 举报
回复
帮顶
red-fly 2009-10-13
  • 打赏
  • 举报
回复
在NM_CUSTOMDRAW的处理函数中画就行了,我测试了一下,没有看到你说的“系统方框”出现。但是在这里处理,我发现系统还是会自己写字上去,即如果你需要SetWindowText( TEXT("") );然后用其它方式按照你自己的意愿来写字上去,如果你要是用缺省的字而不需要修饰,那就像正常情况下SetWindowText()就行了。

class CMyButton : public CButton
{
DECLARE_DYNAMIC(CMyButton)

public:
CMyButton();
virtual ~CMyButton();

protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);

public:
DWORD m_dwTimeBase;
};

CMyButton::CMyButton()
{
m_dwTimeBase = GetTickCount();
}

BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyButton::OnNMCustomdraw)
END_MESSAGE_MAP()

// 重点是这个函数
void CMyButton::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: Add your control notification handler code here
CDC *pDC = CDC::FromHandle( pNMCD->hdc );
pDC->FillSolidRect( &pNMCD->rc, GetTickCount() - m_dwTimeBase );

CString strText;
GetWindowText( strText );
pDC->TextOut( 0, 0, strText );

*pResult = 0;
}
youyifang 2009-10-13
  • 打赏
  • 举报
回复
收下
red-fly 2009-10-13
  • 打赏
  • 举报
回复
应该是可以做到,可能是有些消息没有处理造成的
我之前用button,没有处理所有的消息,有时候就会出现灰背景的情况,后来由于这问题不严重而且又做了新的软件,那个程序上的这个问题就没有管它了
Panghuang 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xianglitian 的回复:]
你想做成什么样

一般的用自定义控件换换图片就可以了啊
[/Quote]
其实我就是想解决CButton::对BM_SETSTATE这个消息的缺省处理的时候不出现画出系统的灰色的框框,要全部由我来画。
向立天 2009-10-13
  • 打赏
  • 举报
回复
你想做成什么样

一般的用自定义控件换换图片就可以了啊
Panghuang 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 youyifang 的回复:]
你在PreSubclassWindow函数中加入如下代码看看:
C/C++ code
UINT nBS;

nBS= GetButtonStyle();
SetButtonStyle(nBS| BS_OWNERDRAW);
[/Quote]
--这个不能满足我的要求,CheckBox是没有BS_OWNERDRAW,你强行加上,实际是转成Button
Panghuang 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 youyifang 的回复:]
邮箱给我,给你一个例子。
[/Quote]

好,麻烦发到luoqs@126.com,谢谢啦!
xylicon 2009-10-12
  • 打赏
  • 举报
回复
貌似我以前也遇到同样的问题,后来我是自己继承Button类写了一个Check类,也就是不用按钮的BS_CHECKBOX 风格,这样就不会有默认的勾选,我自己实现所有的勾选和去勾选。还有需要加2个成员函数SetCheck和GetCheck。
dirdirdir3 2009-10-12
  • 打赏
  • 举报
回复
check状态改变的时候会要求自绘的..........
加载更多回复(2)

15,980

社区成员

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

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