郁闷啊 ! 请问如何解决在对话框中的自画按钮上的画图时的图像保存问题。

马鸣风萧萧 2003-03-13 06:21:45
我做了一个在对话框上的一个按钮上画图的程序。
可是,为了在其上画的图形不在窗口重绘时被擦掉,我强制刷新该按钮,然后相应对话框的WM_DRAWITEM消息。在该消息处理函数中,绘制了按钮的背景图像。
可是,当我想在按钮上绘制其他的图形时,因为要面对不同的响应接口(比如:在一个菜单里加入在按钮上画直线的功能,而另一个菜单里加入在按钮上画圆的功能),不好都在WM_DRAWITEM的消息处理函数中加入他们的代码。于是,为了能不被其他窗口覆盖时,画的图形被擦掉,我想创建一个该按钮的设备描述表兼容的内存设备描述表,然后其他的接口都在内存中画,画完再刷新按钮。在WM_DRAWITEM的消息处理函数中仅加一个BitBlt()函数。
而刚开始按钮上的背景当然也是在内存中画的。于是我在OnInitDialog()中加入以下代码,想用这种方法,在初始化的时候,能在按钮上加上背景:BOOL CAnniuDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HBITMAP hBitmap;
CWnd *p_ButtonWnd=GetDlgItem(IDC_BUTTON2);
CDC *pdc=p_ButtonWnd->GetDC();
pmdc->CreateCompatibleDC(pdc);
CRect rect;
this->GetWindowRect(&rect);
HDC hdc=pdc->GetSafeHdc();
hBitmap=::CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
pmdc->SelectObject(CBitmap::FromHandle(hBitmap));
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
pmdc->SelectObject(&brush);
pmdc->PatBlt(0,0,rect.right,rect.bottom,PATCOPY);

return TRUE; // return TRUE unless you set the focus to a control
}

可是在执行的时候,这段代码却发生断言错误:ASSERT(m_hDC == NULL); // only attach once, detach on destroy
ASSERT(m_hAttribDC == NULL); // only attach to an empty DC

请问这是怎么回事???不能得到按钮的内存设备描述标指针吗???该如何得到??
还有没有其他解决重画的方法?
先谢了!!!
...全文
78 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
马鸣风萧萧 2003-03-13
  • 打赏
  • 举报
回复
我明白自画按钮的原理,可是对控件自画时的虚拟窗口的实现却出现了上述的问题,请问能否帮忙解决???
kingcom_xu 2003-03-13
  • 打赏
  • 举报
回复
拜托先看看自画按钮的原理.
kingcom_xu 2003-03-13
  • 打赏
  • 举报
回复
晕.

15,979

社区成员

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

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