请问MFC的一个代码简单却功能奇怪的问题?

if(IsIconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKG... if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
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;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
上面这个代码是MCF向导自动生成的,我跟踪了一下在最小化,最大化的过程发现没有被执行到,去掉 发现出也没出现什么不同,为何MFC要默认的帮我们生产上面的代码,有哪位高手知道上面的代码正真的目的是什么?在什么情况下会被执行到?
展开
 我来答
百度网友dc23807
2008-04-06 · TA获得超过252个赞
知道小有建树答主
回答量:236
采纳率:0%
帮助的人:0
展开全部
这段代码是有用的,尽管通常情况下不会被调用。他的作用是在最小化状态下重绘窗口图标。

IsIconic()作用是判断窗口是否处于最小化状态(点击了最小化按钮之后)。

对于普通的对话框来说,如果你在if (IsIconic()) 下面加入AfxMessageBox("haha") ,你会发现消息框并不会弹出。

原因是,if (IsIconic()) 这段代码是在OnPaint()函数内,当你最小化了对话框之后,虽然IsIconic()的值是TRUE,但是OnPaint()函数并不会运行。因为OnPaint()响应的是WM_PAINT消息,而WM_PAINT消息是针对客户区的。一个最小化了的窗口不需要重绘客户区。

为了验证这一点,可以设置一定时器,在OnTimer()函数里写上
if(IsIconic()) MessageBeep(MB_OK);
当你点击最小化按钮后,你会听见嘟嘟声。

那么这段代码究竟有什么用?它是不是永远不会被执行呢?当然不是。举两个例子。
第一,如果你强行发送WM_PAINT消息,它会执行。
第二,特殊的对话框。比如一个ToolBox风格的对话框。这个对话框不显示在任务栏,在最小化之后它会变成一个很小的一条显示在桌面上。这时如果它被遮挡,就会出发WM_PAINT消息,从而执行那段代码。

总之,一般情况下可以不要这段代码,它的特殊用途我也不是很了解,但是我们至少可以知道它是怎么样工作的。
百度网友6cae6c6d0
2008-04-05
知道答主
回答量:9
采纳率:0%
帮助的人:4.5万
展开全部
可能就是没什么用吧,就别去管它了,把你的时间放在更值得你关注的地方,当细节的东西影响到你的项目时,再去研究它,我也用mfc,但不是高手:)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wawoo2007
2008-04-05 · TA获得超过626个赞
知道小有建树答主
回答量:465
采纳率:0%
帮助的人:637万
展开全部
随便拿个什么窗口把你的对话框遮住一下下,然后就会触发重绘了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
皇家救星1985
2008-04-05 · TA获得超过1131个赞
知道大有可为答主
回答量:1579
采纳率:0%
帮助的人:1668万
展开全部
你是指最小化状态下的那些代码没有调用吧

我想是这样的,代码是有调用 但是平时是用不到的 因为在最小化时程序需要重画的时候实在太少了,除非故意向它发送重绘消息

我想你是以为那些代码是在最小化的瞬间调用的吧

参考资料: 个人见解,也不知对错,大家一起研究

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
落寞深秋
2008-04-06 · 超过37用户采纳过TA的回答
知道答主
回答量:90
采纳率:0%
帮助的人:0
展开全部
有用的. 我看过文章提到过它. 我现在忘记是什么了..
那时候我看完说明 就觉得 : 平常的运行确实用不到.

好像是绘制什么小图标的时候.. 不是最小化. 貌似是你按alt + tab的时候,它传递给系统的 还是什么的,,或者是兼容以前的98的最小化 ??

我完全的记不起来了.但这段代码确实有意义的. 而且删除后运行基本没问题. 你可以在这段代码中加上AfxMessageBox("haha") 这样来调试,使用VC的调试 有时候关于界面的调试是无法进行的. 然后你不停的测试情况看能不能弄出haha来..
百度下IsIconic()肯定有..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式