GetDC()可以让区域有效吗?

parachutes30 2014-01-07 01:29:45
对话框程序的OnPaint()函数:
void CdiaDlg::OnPaint()
{
if (IsIconic())
{
.....
}
else
{
CDC *pDC=GetDC();
pDC->TextOut(0,0,_T("宝钢股份"));
ReleaseDC(pDC);
CDialog::OnPaint();
}
}

BeginPaint或者CPaintDC对象通过BeginPaint可以让整个客户区有效,这样就不会继续产生WM_PAINT消息。那么GetDC()有同样的功能吗?如果不是的话对话框程序是在哪里让区域有效的呢?
...全文
191 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
parachutes30 2014-01-08
  • 打赏
  • 举报
回复
搞清楚了了。GetDC不会让区域有效。但是后面的CDialog::OnPaint会调用CWnd::DefWindowProc采用类似BeginPaint的方法让区域有效。 如果把CDialog::OnPaint拿掉就会看到字在闪了。
zhuyf87 2014-01-08
  • 打赏
  • 举报
回复
可以用GetDCEx()来替代BeginPaint
HDC GetDCEx(
  HWND hWnd,      // handle to window
  HRGN hrgnClip,  // handle to clipping region
  DWORD flags     // creation options
);
parachutes30 2014-01-08
  • 打赏
  • 举报
回复
引用 6 楼 zhuyf87 的回复:
BeginPaint、EndPaint可以删除消息队列中的WM_PAINT消息,并使无效区域有效。 GetDC、ReleaseDC并不删除WM_PAINT消息,也不能使无效区域有效。当程序跳出 WM_PAINT 时,无效区域仍然存在。系统会不断发送WM_PAINT消息,于是程序不断处理WM_PAINT,造成闪烁。
为什么我看不到闪烁。显示器问题?
zhuyf87 2014-01-07
  • 打赏
  • 举报
回复
BeginPaint、EndPaint可以删除消息队列中的WM_PAINT消息,并使无效区域有效。 GetDC、ReleaseDC并不删除WM_PAINT消息,也不能使无效区域有效。当程序跳出 WM_PAINT 时,无效区域仍然存在。系统会不断发送WM_PAINT消息,于是程序不断处理WM_PAINT,造成闪烁。
parachutes30 2014-01-07
  • 打赏
  • 举报
回复
如果没有BeginPaint,感觉应该是CWnd::DefWindowProc最后接手了。
parachutes30 2014-01-07
  • 打赏
  • 举报
回复
引用 2 楼 Sandrer 的回复:
有效与无效都会发送一条 WM_PAINT 消息给窗口 区别就是在 PAINTSTRUCT 中 rcPaint 注明哪个区域需要重绘 窗口会在你的绘画代码完成后,剪接该区域 例如你一个 100*100 的窗口 现在需要重绘起点为10-10,大小为50-50的区域 那么你可以在 OnPaint 里面整个窗口重画,也可以单独只画这个区域(BeginPaint 或 CPaintDC 得到的 DC 都是相对于整个客户区,你可以整个客户区重绘,也可以单独重绘某个区域) 无论你绘画的是哪个区域,Windows 都会把 BeginPaint 或 CPaintDC 得到的 HDC 中相应需要重绘的区域在你绘画完毕后剪接出来画到窗口上(根据 PAINTSTRUCT 中的 rcPaint 成员来剪接) 意思就是其实我们得到的那个 HDC 是系统根据窗口分配给我们使用的临时 DC,在 ReleaseDC 或者 EndPaint 后系统才会把我们画的东西复制到真正的窗口上
有无效的区域时会产生WM_PAINT消息,在处理这个消息的时候BeginPaint会让整个客户区有效,所以就不再产生WM_PAINT消息了。如果仍旧有无效区域,系统会不断的送WM_PAINT消息过来的。
mlqxj35674 2014-01-07
  • 打赏
  • 举报
回复
概念糊涂到如此地步
Sandrer 2014-01-07
  • 打赏
  • 举报
回复
有效与无效都会发送一条 WM_PAINT 消息给窗口 区别就是在 PAINTSTRUCT 中 rcPaint 注明哪个区域需要重绘 窗口会在你的绘画代码完成后,剪接该区域 例如你一个 100*100 的窗口 现在需要重绘起点为10-10,大小为50-50的区域 那么你可以在 OnPaint 里面整个窗口重画,也可以单独只画这个区域(BeginPaint 或 CPaintDC 得到的 DC 都是相对于整个客户区,你可以整个客户区重绘,也可以单独重绘某个区域) 无论你绘画的是哪个区域,Windows 都会把 BeginPaint 或 CPaintDC 得到的 HDC 中相应需要重绘的区域在你绘画完毕后剪接出来画到窗口上(根据 PAINTSTRUCT 中的 rcPaint 成员来剪接) 意思就是其实我们得到的那个 HDC 是系统根据窗口分配给我们使用的临时 DC,在 ReleaseDC 或者 EndPaint 后系统才会把我们画的东西复制到真正的窗口上
gfm688 2014-01-07
  • 打赏
  • 举报
回复
有个函数叫: ValidateRect

16,548

社区成员

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

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

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