MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序

设置对话框背景颜色及背景图片可在OnCtlColor(),OnEraseBkgnd(),OnPaint()里设置,

若想改变对话框大小,比如全屏显示,

则用ShowWindow(SW_SHOWMAXIMIZED);UpdateWindow();

其中 ShowWindow会调用OnSize()->OnEraseBkgnd(),

      UpdateWindow()会调用OnPaint()->OnCtlColor(),

若对话框中没有设置消息响应OnEraseBkgnd(),则系统默认消息响应OnEraseBkgnd()会调用OnCtlColor()来设置对话框背景(即替代OnEraseBkgnd())

对话框的背景设置可在OnCtlColor()中进行,因为OnCtlColor()一般会被多次调用,所以要想设置的CFont,CBrush等应在OnInitDialog中初始化,若要在OnCtlColor()中设置,在设置前先调用Detach就可以了,如下示例


HBRUSH CDb3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{

if(pWnd->GetDlgCtrlID()==IDC_STATIC5)
   {
     
    m_font.CreatePointFont(300,"宋体");
    pDC->SelectObject(&m_font);
    m_font.Detach();            
    pDC->SetBkMode(TRANSPARENT);  
    return (HBRUSH)::GetStockObject(NULL_BRUSH);      
   }

}


但是如果在OnCtlColor()在设置背景图片,则图片不会随对话框大小按比例缩放

所以可调用StretchBlt()函数设置,如下示例:

void CDb3Dlg::OnPaint()
{

CClientDC cdc(this); CDC comdc;
comdc.CreateCompatibleDC(&cdc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
comdc.SelectObject(&bitmap);
CRect rect;
GetClientRect(rect);
BITMAP bit;
bitmap.GetBitmap(&bit);
cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);

}//全屏显示对话框背景图片(限bmp格式)


你可能感兴趣的:(MFC学习)