重绘CheckBox遇到一个问题

lang14 2012-11-21 11:43:08
比如有一个CheckBox控件 IDC_CHECK1 .h文件 CMyCheckBox m_check1;

cpp文件响应按钮点击事件比如:
void CXXXDlg::OnCheck1()
{
CButton *p1=(CButton*)GetDlgItem(IDC_CHECK1); //在这里设了一个断点
CButton *p2=(CButton*)GetDlgItem(IDC_CHECK2);
p1->SetCheck(1);
p2->SetCheck(1);
}
这时问题就来了,当我点击CheckBox按钮时,为什么进不去OnCheck1()这个函数呢?

附:我重绘CheckBox的代码是这样
// MyCheckBox.cpp : implementation file
//

/////////////////////////////////////////////////////////////////////////////
// CMyCheckBox message handlers

void CMyCheckBox::PreSubclassWindow()
{
UINT nBS;
nBS= GetButtonStyle();
SetButtonStyle(nBS| BS_OWNERDRAW);
CButton::PreSubclassWindow();
}

void CMyCheckBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rect = lpDrawItemStruct->rcItem;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);

CRect ReRect,TextRect;
// CopyRect(ReRect,rect);
// ReRect.right=rect.Height();
ReRect.top=2;
ReRect.bottom=rect.bottom-2;
ReRect.left=rect.left=2;
ReRect.right=ReRect.bottom-ReRect.top;
CopyRect(TextRect,rect);
TextRect.left=ReRect.right+8;

CString strText;
GetWindowText(strText);

UINT state = lpDrawItemStruct->itemState;
if (state&ODS_DISABLED|| state & ODS_DEFAULT)
{
m_bDisable=TRUE;
}
else
{
m_bDisable=FALSE;
}

CBrush m_br;
m_br.CreateSolidBrush(m_BkColor);
pDC->FillRect(&rect,&m_br);

int nCheck=GetCheck();
if (nCheck)
{
DrawBitmap(pDC,IDB_BITMAP2,ReRect);
}
else
{
DrawBitmap(pDC,IDB_BITMAP3,ReRect);
}

CFont font;
font.CreateFont(m_FontSize,0,0,0,FW_NORMAL,FALSE,FALSE,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODERN,m_strFontName);
pDC->SelectObject(&font);
pDC->SetBkMode(TRANSPARENT);
if (m_bDisable)
{
pDC->SetTextColor(RGB(128,128,128));
}
else
{
pDC->SetTextColor(RGB(0,0,0));
}
pDC->DrawText(strText,&TextRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
font.DeleteObject();
m_br.DeleteObject();
}

void CMyCheckBox::OnClicked()
{
int nState;
nState = GetCheck();
if(nState == 0)
nState = 1;
else
nState = 0;
SetCheck(nState);
}

LRESULT CMyCheckBox::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message==BM_SETCHECK)
{
// m_nChecked=wParam;
// SetMyCheck(wParam);
SetCheck(wParam);SetMyCheck(wParam);
}
if (message==BM_GETCHECK)
{
// return GetCheck();
return GetMyCheck();
// return m_nChecked;
}
return CButton::DefWindowProc(message, wParam, lParam);
}
int CMyCheckBox::GetMyCheck()
{
if (m_nChecked)
{
return 1;
}
return 0;
}
void CMyCheckBox::SetMyCheck(int nState)
{
if (nState)
{
m_nChecked=1;
}
else
{
m_nChecked=0;
}
Invalidate();
}
void CMyCheckBox::SetFontBkColor(COLORREF rgb)
{
m_BkColor=rgb;
}
void CMyCheckBox::SetFontSize(int nSize)
{
m_FontSize=nSize;
}
void CMyCheckBox::SetFontName(CString strFontName)
{
m_strFontName=strFontName;
}
void CMyCheckBox::DrawBitmap(CDC *pDC,UINT nID,CRect &rect)
{
CDC memDC;
BITMAP bmpInfo;
CBitmap bmp;
bmp.LoadBitmap(nID);
bmp.GetBitmap(&bmpInfo);
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp=memDC.SelectObject(&bmp);

pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,
&memDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
pDC->SelectObject(pOldBmp);
bmp.DeleteObject();
}
...全文
332 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MYVision_ MY视界 2013-12-19
  • 打赏
  • 举报
回复
邮箱:feng871345432@163.com
MYVision_ MY视界 2013-12-19
  • 打赏
  • 举报
回复
楼主,我按你的重绘代码来试了一下,怎么不行啊?点着没反应?能给提供个完整的代码吗?谢谢了。
快乐鹦鹉 2012-11-21
  • 打赏
  • 举报
回复
是不是被void CMyCheckBox::OnClicked() 截掉了
lang14 2012-11-21
  • 打赏
  • 举报
回复
引用 1 楼 happyparrot 的回复:
是不是被void CMyCheckBox::OnClicked() 截掉了
果然是被这个截掉了,问题解决了,谢谢各位
lang14 2012-11-21
  • 打赏
  • 举报
回复
引用 3 楼 lgstudyvc 的回复:
OnCheck1是不是写到别的类了
没写到别的类
lang14 2012-11-21
  • 打赏
  • 举报
回复
引用 2 楼 tiger9991 的回复:
两件事情做了没有? 1.消息映射 ON_BN_CLICKED(check资源编号, OnCheck1()) 2.是否用了控件绑定 void XXXX::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Check(pDX, check资源编号, m_check1); }
这两个事件肯定做了啊
lgstudyvc 2012-11-21
  • 打赏
  • 举报
回复
OnCheck1是不是写到别的类了
看不见的裂痕 2012-11-21
  • 打赏
  • 举报
回复
两件事情做了没有? 1.消息映射 ON_BN_CLICKED(check资源编号, OnCheck1()) 2.是否用了控件绑定 void XXXX::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Check(pDX, check资源编号, m_check1); }

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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