zoukankan      html  css  js  c++  java
  • 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控件背景不透明,显得很难看。

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

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

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

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

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

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

  • 相关阅读:
    Abstract与Virtual
    List 常用方法
    控制数据采样分布 计算概念
    中期答辩感想
    软件开发之团队理解
    详细设计理解
    竞赛系统需求分析
    软件代码规范之理解
    AngularJS 整理资料
    AngularJS合集
  • 原文地址:https://www.cnblogs.com/renyuan/p/3475221.html
Copyright © 2011-2022 走看看