动态创建的按钮设置底色与文字颜色,效果出来了,但提示Debug出错?

abxialiang 2010-09-27 09:13:00
问题描述:
我想在MFC(Visual studio 2005 平台)的对话框工程中实现动态按钮能显示底色与文字颜色,之前用静态按钮可以正常实现了,用下面的代码处理动态按钮时编译通过,运行后却提示Debug错误,点击忽略后却仍然效果可以正常出来效果.在realese下不提示该错误,但是既然提示错误,肯定是代码有问题的,所以请教大家这个错误是出在什么地方的,核心实现代码如下.谢谢.


BOOL CMfc_button_colorDlg::OnInitDialog()//在初始化函数中
{
.....
.....
//创建按钮
CButton *plbtn=new CButton();
CString csTemp;
plbtn->Create(L"123",
WS_VISIBLE | WS_CHILD | BS_OWNERDRAW,
CRect(80,71,300,100),
this, 9528);//动态创建
GetDlgItem(9528)->ModifyStyle(0,BS_OWNERDRAW);//设置按钮的风格为自绘类型

.....
.....
}

//以下是为绘制按钮颜色与文字颜色的,对所有可绘制的按钮生效.
void CMfc_button_colorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//if(nIDCtl==IDC_BUTTON1) //checking for the button
//{
CDC dc;
RECT rect;
dc.Attach(lpDrawItemStruct ->hDC); // Get the Button DC to CDC

rect = lpDrawItemStruct->rcItem; //Store the Button rect to our local rect.

dc.Draw3dRect(&rect,RGB(0,0,0),RGB(255,0,0));

dc.FillSolidRect(&rect,RGB(100,100,255));//Here you can define the required color to appear on the Button.

UINT state=lpDrawItemStruct->itemState; //This defines the state of the Push button either pressed or not.

if((state & ODS_SELECTED))
{
dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

}
else
{
dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
}

dc.SetBkColor(RGB(100,100,255)); //Setting the Text Background color
dc.SetTextColor(RGB(255,0,0)); //Setting the Text Color


TCHAR buffer[MAX_PATH]; //To store the Caption of the button.
ZeroMemory(buffer,MAX_PATH ); //Intializing the buffer to zero
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH); //Get the Caption of Button Window

dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//Redraw the Caption of Button Window

dc.Detach(); // Detach the Button DC
//}

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
...全文
130 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
长尾巴的悟空 2010-09-28
  • 打赏
  • 举报
回复
虽然我们可以不释放空间,但做为程序员我们有理由delete!
abxialiang 2010-09-28
  • 打赏
  • 举报
回复
对的,如果定义一个成员变量或者全局变量的指针,是可以随时释放new创建的对象,这样要定义很多的成员变量,并且有时动态创建的对象数量是不可以事先确定的.有可能是随机创建的.这种情况下怎么处理呢.难道用new创建的对象在程序结束后也不会自动释放空间吗,如果我没有手动释放的话
stjay 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abxialiang 的回复:]
VisualEleven大哥提到一个对象释放问题,我想请教下,如果我在局部函数如一些按钮对应的函数里面用new创建了新的对象(如字体,可能还有其它自定的类),那么程序结束的时候怎么去释放它呢,那时已经失去它的指针了啊
[/Quote]

将该对象(指针)定义为成员变量或全局变量
abxialiang 2010-09-27
  • 打赏
  • 举报
回复
VisualEleven大哥提到一个对象释放问题,我想请教下,如果我在局部函数如一些按钮对应的函数里面用new创建了新的对象(如字体,可能还有其它自定的类),那么程序结束的时候怎么去释放它呢,那时已经失去它的指针了啊
abxialiang 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualeleven 的回复:]
提示什么错误啊?你在OnInitDialog中new CButton,最后有施放吗?
[/Quote]
我没有释放,如果释放了那按钮还有吗,错误提示是在程序退出前弹出的.
...
我刚刚用断点调试,把最后一行
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
注释掉以后就没有出现错误提示了,这样改对不对呢?
Eleven 2010-09-27
  • 打赏
  • 举报
回复
提示什么错误啊?你在OnInitDialog中new CButton,最后有施放吗?

15,980

社区成员

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

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