• VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)及对话框使用位图背景并透明


    1、首先,为了下面使用擦除背景的方便,先增加OnEraseBkgnd函数(WM_ERASEBKGND ),但好多新手都不知道对话框在那里找增加这个函数,来跟我来

    快捷键Ctrl+W打开ClassWizard对话框(菜单->view->ClassWizard):选择Class Info,找到左下角的Message filter,下拉列表至最底部,选中Window,OK保存

    2、我们再Ctrl+W 打开ClassWizard对话框,MessageMaps->Class Name:选择当前工程对话框->Object IDs:选择当前对话框->Messages:下拉找吧,WM_ERASEBKGND有了吧,双击或者Add Function,添加到下面的Member functions后,再双击就可以编辑此函数代码了

    3、当然除了以上的方法之外,如果对代码结构基本了解的话,还可以自己手动增加:

    a、工程的头文件中增加擦出背景函数定义

    afx_msg BOOL OnEraseBkgnd(CDC *pDC); 

    b、增加消息响应

    BEGIN_MESSAGE_MAP(C******Dlg, CDialog)  // C******Dlg是你自己对话框的工程类
       ……
    ON_WM_ERASEBKGND()
    END_MESSAGE_MAP()

    c、工程源文件cpp中增加此函数的操作部分

    BOOLCDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC   *pDC)  

          //在这里你想增加那些对图片背景处理的东西就随便填吧guohaiyang.blog.163.com

          return TRUE;

    }

    VC对话框使用OnEraseBkgnd函数位图背景并透明
    1、使用OnEraseBkgnd函数实现对话框位图背景

    BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC   *pDC)   //老婆:增加擦出背景函数
    {
     CRect rect;
     GetClientRect(&rect);


     CBitmap m_pBmp;
     BITMAP bm;
     CDC dcMem;


     m_pBmp.LoadBitmap(IDB_BITMAP1);
     m_pBmp.GetBitmap(&bm);//得到位图尺寸


     dcMem.CreateCompatibleDC(pDC);
     CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);

      pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
     pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
      &dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
     dcMem.SelectObject(pOldBitmap);

     return TRUE;
    }

    好多新手都不知道OnEraseBkgnd这个函数在对话框里是怎么添加的,有手工自己写和系统添加两种方式,具体使用方法见《VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)》

    到这里就可以实现位图了,但STATIC控件背景不透明,显得很难看。

    2、来我们让STATIC控件透明吧

    HBRUSH CDisplayBmpBackGroundDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
     if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor ==  CTLCOLOR_STATIC)
      
     {  
             pDC->SetBkMode(TRANSPARENT);    
     }  
     return   HBRUSH(GetStockObject(HOLLOW_BRUSH));
    }

    到这里其实就可以了,BMP的图片背景实现了,文本框的透明也实现了。

    3、补充说明:如果程序运行过程中,需要设置文本框的字体的话,会出现显示"字体重叠不刷新"的问题

     

    4、这就要对该控件或者对话框处理了,要刷出新字体来。

     CWnd* pWnd = GetDlgItem(IDC_STATIC1);
     pWnd->SetWindowText("guohaiyang.blog.163.com");//需要修改的控件标题

    //这里可以刷整个对话框,但如果较频繁的话,很明显能看出来,就选择刷显示字体的那块区域就可以了
    pWnd ->GetParent()->InvalidateRect(CRect(0,0,100,50),TRUE);

    好了,没有问题了,剩下随便你玩吧,这个解决方法不像网上说的,非要借用人家的自己写的函数,现在完全用VC提供的就可以了,免得加这个那个的头文件。

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    20190729
    [51Nod1623] 完美消除
    [WC2013] 糖果公园
    20190727
    在Java中调用带参数的存储过程
    Oracle 字符集的查看和修改
    查询oracle server端的字符集
    Mysql 数据库中文乱码问题
    错误:”未能加载文件或程序集“System.Web.Mvc, Version=2.0.0.0” 解决方法
    CSS背景图拉伸自适应尺寸,全浏览器兼容
  • 原文地址:https://www.cnblogs.com/jijm123/p/14911630.html
Copyright © 2020-2023  润新知