• 设置对话框背景图片 3种


    WM_PAINT添加消息处理函数

    void CDialog6::OnPaint()

    {

    CPaintDC dc(this);// device context for painting

    CRect rect;

    GetClientRect(&rect);

    CDC dcMem;

    dcMem.CreateCompatibleDC(&dc);

    CBitmap bmpBackground;

    bmpBackground.LoadBitmap(IDB_BITMAP2); //IDB_BITMAP是你自己的图对应的ID BITMAP bitmap;

    bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

    // Do not call CDialog::OnPaint() for painting messages

    }

    方法一:

    在OnPaint中StretchBlt

    具体是:注释掉CDialog::OnPaint()或放到结尾(原因何在呢?),并加入贴图代码

    1. void CqqqqqDlg::OnPaint()  
    2. {  
    3.     if (IsIconic())  
    4.     {  
    5.         CPaintDC dc(this); // device context for painting   
    6.   
    7.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
    8.   
    9.         // Center icon in client rectangle   
    10.         int cxIcon = GetSystemMetrics(SM_CXICON);  
    11.         int cyIcon = GetSystemMetrics(SM_CYICON);  
    12.         CRect rect;  
    13.         GetClientRect(&rect);  
    14.         int x = (rect.Width() - cxIcon + 1) / 2;  
    15.         int y = (rect.Height() - cyIcon + 1) / 2;  
    16.   
    17.         // Draw the icon   
    18.         dc.DrawIcon(x, y, m_hIcon);  
    19.     }  
    20.     else  
    21.     {  
    22.         //CDialog::OnPaint();//<span style="color:#6600cc;">注释此句,如果不注释的话,就放到结尾,原因何在呢?   
    23. </span>       //贴背景图片   
    24.         CPaintDC dc(this);  
    25.         CBitmap bmpBk;  
    26.         bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);  
    27.         //m_bmpBK.LoadBitmapW(IDB_BMPBK);   
    28.         BITMAP bmpSize;  
    29.         bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸   
    30.   
    31.         CRect rect;  
    32.         GetClientRect(&rect);//获取客户区尺寸   
    33.   
    34.         CDC dcMem;  
    35.         dcMem.CreateCompatibleDC(&dc);  
    36.         dcMem.SelectObject(&bmpBk);  
    37.         dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区   
    38.         //贴背景图片   
    39.     }  
    40. }  


    执行效果截图如下:

    方法二:

    在OnEraseBkgnd中StretchBlt

    具体是:注释掉return CDialog::OnEraseBkgnd(pDC);直接返回true(为什么不能返回这个要返回true呢?),代码如下:

    1. BOOL CqqqqqDlg::OnEraseBkgnd(CDC* pDC)  
    2. {  
    3.     // TODO: Add your message handler code here and/or call default   
    4.     //贴背景图片   
    5.     CBitmap bmpBk;  
    6.     bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);  
    7.     //m_bmpBK.LoadBitmapW(IDB_BMPBK);   
    8.     BITMAP bmpSize;  
    9.     bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸   
    10.   
    11.     CRect rect;  
    12.     GetClientRect(&rect);//获取客户区尺寸   
    13.   
    14.     CDC dcMem;  
    15.     dcMem.CreateCompatibleDC(pDC);  
    16.     dcMem.SelectObject(&bmpBk);  
    17.     pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区   
    18.     //贴背景图片   
    19.     return true;  
    20.     //return CDialog::OnEraseBkgnd(pDC);   
    21. }  


    效果与方法一相同,图片就不贴了,参见上图。

    而且这里还有一个很有意思的现象,若在OnEraseBkgnd贴图,在OnPaint()函数中不调用基类的OnPaint,即注释掉CDialog::OnPaint(),则将界面隐藏后再显示出来则控件全没了,只有对话框以及背景。如下图:

     原因见《在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次。

    方法三:

    在OnCtlColor中返回带有背景位图的画刷

     具体是:

    1、在头文件中定一个背景刷

    1. public:  
    2.     CBrush   m_brushBk;  


    2、在OnInitDialog中加入以下句

    1. // TODO: Add extra initialization here   
    2. CBitmap bmp;  
    3. bmp.LoadBitmap(IDB_BITMAP_tempbk);   
    4. m_brushBk.CreatePatternBrush(&bmp);   
    5. //m_brushBk.CreateSolidBrush(RGB(0,255,0)); //用纯色作为背景   
    6.    bmp.DeleteObject();      



     

    3、在OnCtlColor函数中返回背景画刷

    1. HBRUSH CXXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
    2. {  
    3.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
    4.   
    5.     // TODO:  Change any attributes of the DC here   
    6.   
    7.     // TODO:  Return a different brush if the default is not desired   
    8.     if(pWnd==this) //this代表当前对话框窗口   
    9.     {   
    10.         return   m_brushBk;   
    11.     }   
    12.   
    13.     return hbr;  
    14.   
    15. }  

    效果如下图所示:

    注意这个函数里面的if判断,这个pWnd参数很关键。

    我们看看,如果没有这个if判断,直接返回m_brushBk;会是什么结果呢,代码如下:

    1. HBRUSH CqqqqqDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
    2. {  
    3.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
    4.   
    5.     // TODO:  Change any attributes of the DC here   
    6.   
    7.     // TODO:  Return a different brush if the default is not desired   
    8.   
    9.     return  m_brushBk;  
    10.   
    11. }  


    截图如下:
     

    看图说话,不解释,你懂的。

     这种方法的缺点是不具备StretchBlt函数的图片自动适应对话框(目标矩形)大小的功能。

    出自http://www.cnblogs.com/lidabo/archive/2012/07/04/2576172.html

  • 相关阅读:
    phpcms列表页内容如何替换?
    如何用phpcms将静态网页生成动态网页?
    简单介绍phpcms以及phpcms如何安装?
    注册账号的验证
    js跳转页面
    流程审核处理
    关于XML(可扩展标记语言)的基础知识与写法
    php随机获取验证码
    流程管理
    HDU 5894 hannnnah_j’s Biological Test
  • 原文地址:https://www.cnblogs.com/chenshaogang/p/4312842.html
Copyright © 2020-2023  润新知