在按钮中画图不显示

赤勇玄心行天道 2019-01-09 03:03:22
我在一个按钮的响应函数里使用以下代码画出的图片无法显示,为什么?

void CTestDlg::OnBnClickedTest()
{
CImage img;
CPaintDC dc(this);
img.Load(_T("E:\\screen.png"));
if(!img.IsNull())
{
img.Draw(dc.m_hDC, 0, 0);
}
}
但是我将这段代码放在OnPaint()函数中就可以正常显示了,为什么?

void CTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CImage img;
CPaintDC dc(this);
img.Load(_T("E:\\screen.png"));
if(!img.IsNull())
{
img.Draw(dc.m_hDC, 0, 0);
}

CDialogEx::OnPaint();
}
}
...全文
50 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
win编程一般都要在OnPaint或者OnDraw里绘画(OnDraw实际也是在被OnPaint调用),win系统在认为必要时随时会发出WM_PAINT消息,你在OnBnClickedTest里绘画,可能在绘画完成时,可能系统发出WM_PAINT消息,这样你在OnBnClickedTest就会被刷新为空白


我所绘制的那片区域没有控件,所以不会被刷新为空白,是DC句柄用错了,要用GetDC 和 RelaseDC。
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
A CPaintDC object can only be used when responding to a WM_PAINT message, usually in your OnPaint message-handler member function.
用 GetDC 和 RelaseDC


正解呀!
zgl7903 2019-01-09
  • 打赏
  • 举报
回复
A CPaintDC object can only be used when responding to a WM_PAINT message, usually in your OnPaint message-handler member function.
用 GetDC 和 RelaseDC


worldy 2019-01-09
  • 打赏
  • 举报
回复
win编程一般都要在OnPaint或者OnDraw里绘画(OnDraw实际也是在被OnPaint调用),win系统在认为必要时随时会发出WM_PAINT消息,你在OnBnClickedTest里绘画,可能在绘画完成时,可能系统发出WM_PAINT消息,这样你在OnBnClickedTest就会被刷新为空白

15,979

社区成员

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

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