• 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消息,从而执行那段代码。    总之,一般情况下可以不要这段代码,它的特殊用途我也不是很了解,但是我们至少可以知道它是怎么样工作的。
  • 相关阅读:
    为什么WinCE中LoadBitmap加载位图后无法在其上DrawText?
    WinCE中加载位图的方法
    wince5+2440如何支持SDHC?
    WinCE中文字库占了这么多空间?
    【转】用MFC构造DIRECTX应用框架
    全局导出
    模板绑定
    筛选DOM元素
    获取当前所有的属性
    Canvas绘图(二)
  • 原文地址:https://www.cnblogs.com/cplusplus/p/2768329.html
Copyright © 2020-2023  润新知