请问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要默认的帮我们生产上面的代码,有哪位高手知道上面的代码正真的目的是什么?在什么情况下会被执行到? 展开
{
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要默认的帮我们生产上面的代码,有哪位高手知道上面的代码正真的目的是什么?在什么情况下会被执行到? 展开
5个回答
展开全部
这段代码是有用的,尽管通常情况下不会被调用。他的作用是在最小化状态下重绘窗口图标。
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消息,从而执行那段代码。
总之,一般情况下可以不要这段代码,它的特殊用途我也不是很了解,但是我们至少可以知道它是怎么样工作的。
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消息,从而执行那段代码。
总之,一般情况下可以不要这段代码,它的特殊用途我也不是很了解,但是我们至少可以知道它是怎么样工作的。
展开全部
可能就是没什么用吧,就别去管它了,把你的时间放在更值得你关注的地方,当细节的东西影响到你的项目时,再去研究它,我也用mfc,但不是高手:)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
随便拿个什么窗口把你的对话框遮住一下下,然后就会触发重绘了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是指最小化状态下的那些代码没有调用吧
我想是这样的,代码是有调用 但是平时是用不到的 因为在最小化时程序需要重画的时候实在太少了,除非故意向它发送重绘消息
我想你是以为那些代码是在最小化的瞬间调用的吧
我想是这样的,代码是有调用 但是平时是用不到的 因为在最小化时程序需要重画的时候实在太少了,除非故意向它发送重绘消息
我想你是以为那些代码是在最小化的瞬间调用的吧
参考资料: 个人见解,也不知对错,大家一起研究
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有用的. 我看过文章提到过它. 我现在忘记是什么了..
那时候我看完说明 就觉得 : 平常的运行确实用不到.
好像是绘制什么小图标的时候.. 不是最小化. 貌似是你按alt + tab的时候,它传递给系统的 还是什么的,,或者是兼容以前的98的最小化 ??
我完全的记不起来了.但这段代码确实有意义的. 而且删除后运行基本没问题. 你可以在这段代码中加上AfxMessageBox("haha") 这样来调试,使用VC的调试 有时候关于界面的调试是无法进行的. 然后你不停的测试情况看能不能弄出haha来..
百度下IsIconic()肯定有..
那时候我看完说明 就觉得 : 平常的运行确实用不到.
好像是绘制什么小图标的时候.. 不是最小化. 貌似是你按alt + tab的时候,它传递给系统的 还是什么的,,或者是兼容以前的98的最小化 ??
我完全的记不起来了.但这段代码确实有意义的. 而且删除后运行基本没问题. 你可以在这段代码中加上AfxMessageBox("haha") 这样来调试,使用VC的调试 有时候关于界面的调试是无法进行的. 然后你不停的测试情况看能不能弄出haha来..
百度下IsIconic()肯定有..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询