您的位置:首页 > 其它

MFC几种给对话框添加背景图的方法

2017-09-21 17:10 232 查看

1,目标

总结几种给MFC对话框添加背景图片的方法。

2,实现

方式一:(适用于多种格式)用CImage类可以加载多种格式的图片,在OnPaint中Draw即可。

void CBackgroundDlg::OnPaint()  
{  
    if (IsIconic())  
    {  
        CPaintDC dc(this); // 用于绘制的设备上下文  
  
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
  
        // 使图标在工作区矩形中居中  
        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;  
  
        // 绘制图标  
        dc.DrawIcon(x, y, m_hIcon);  
    }  
    else  
    {  
        CRect rc;  
        GetWindowRect(&rc);  
        CImage mImage;  
        if(mImage.Load(_T("1.jpg")) == S_OK)  
        {  
            //这里让图片绘制区域和窗口大小一致  
            mImage.Draw(GetDC()->GetSafeHdc(), CRect(0,0,rc.Width(),rc.Height()));  
        }  
    }  
}  

void CBackgroundDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CRect rc;
GetWindowRect(&rc);
CImage mImage;
if(mImage.Load(_T("1.jpg")) == S_OK)
{
//这里让图片绘制区域和窗口大小一致
mImage.Draw(GetDC()->GetSafeHdc(), CRect(0,0,rc.Width(),rc.Height()));
}
}
}


方式二:(bmp格式)用CDC的StretchBlt 方法绘制适用窗口大小的位图。

void CBackgroundDlg::OnPaint()  
{  
    if (IsIconic())  
    {  
        CPaintDC dc(this); // 用于绘制的设备上下文  
  
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
  
        // 使图标在工作区矩形中居中  
        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;  
  
        // 绘制图标  
        dc.DrawIcon(x, y, m_hIcon);  
    }  
    else  
    {  
        //加载位图  
        CBitmap bitmap;  
        bitmap.LoadBitmap(IDB_BITMAP1);  
  
        //选入DC  
        CClientDC cdc(this);   
        CDC comdc;  
        comdc.CreateCompatibleDC(&cdc);  
        comdc.SelectObject(&bitmap);  
  
        //生成BITMAP  
        BITMAP bit;  
        bitmap.GetBitmap(&bit);  
  
        //客户区域  
        CRect rect;  
        GetClientRect(rect);  
          
        //用客户区的DC绘制所生成的BITMAP,并适应为窗口大小  
        cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);  
    }  
}  

void CBackgroundDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//加载位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);

//选入DC
CClientDC cdc(this);
CDC comdc;
comdc.CreateCompatibleDC(&cdc);
comdc.SelectObject(&bitmap);

//生成BITMAP
BITMAP bit;
bitmap.GetBitmap(&bit);

//客户区域
CRect rect;
GetClientRect(rect);

//用客户区的DC绘制所生成的BITMAP,并适应为窗口大小
cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);
}
}


方式三:(bmp格式)用CDialog的OnCtlColor()消息响应处理背景画刷。

加载位图资源IDB_BITMAP1,在Dlg类头文件中加入:

CBrush m_brush;  

CBrush m_brush;
在OnInitDialog()中加入:

       CBitmap bmp;  
bmp.LoadBitmap(IDB_BITMAP1);   //IDB_BITMAP1是图片资源ID  
m_brush.CreatePatternBrush(&bmp);  

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);   //IDB_BITMAP1是图片资源ID
m_brush.CreatePatternBrush(&bmp);


给Dlg类添加WM_CTLCOLOR消息处理函数OnCtlColor,修改return 为我们的画刷:

HBRUSH CBackgroundDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
{  
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  
    return (HBRUSH)m_brush;  
}  

HBRUSH CBackgroundDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

return (HBRUSH)m_brush;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: