zoukankan      html  css  js  c++  java
  • IsIconic()和OnPaint()函数

    void CSetAddressDlg::OnPaint() 
    {
        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();
        }
    }

    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消息,从而执行那段代码。

    总之,一般情况下可以不要这段代码,它的特殊用途我也不是很了解,但是我们至少可以知道它是怎么样工作的。
    转处:http://blog.csdn.net/xs574924427/article/details/7355425

  • 相关阅读:
    关于程序出现 “因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫”
    循环物理依赖
    重新生成执行计划
    SQL SERVER 2008 存储过程传表参数
    关于operator void* 操作符
    关于C++编译时内链接和外链接
    低级键盘钩子,在WIN7以上版本的问题
    关于SendMessage和PostMessage的理解的例子
    一个简单代码
    GET 和 POST 比较整理
  • 原文地址:https://www.cnblogs.com/laohaozi/p/8266503.html
Copyright © 2011-2022 走看看