为基于对话框的应用程序添背景BitBlt()/双缓冲

目标OS:WinCE

IDE:VS 2005

--------------------------------------------------------------------------------------------

CDC  m_dcMem;

CBitmap m_bmpMem;//可放到对话框头文件类定义中

为对话框添加WM_PAINT消息

void CETimeDlg::OnPaint()

{

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

// TODO: Add your message handler code here

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

 m_dcMem.CreateCompatibleDC(&dc);//创建兼容DC

         CString filpath=L"";

         filpath+="//NAND//sk//GPS界面主菜单-1.BMP/0"; //图片路径

         m_bmpMem.m_hObject=SHLoadDIBitmap(filpath); //图片加载至m_bmpMem

           //或者图片作为资源 m_bmpMem.LoadBitmapW(IDB_BITMAP1);

        m_dcMem.SelectObject(&m_bmpMem);//位图选入兼容DC

        dc.BitBlt(0,0,800,480,&m_dcMem,0,0,SRCCOPY);//兼容DC的位图贴到当前DC

}

问题:1。不添加PAINT消息,将主要代码放到cpp文件的OnInitDialog()函数中,无法实现

   2。定义CWnd *m_pView;CDC *m_pDC;

    m_pView=GetDlgItem(IDD_ETIME_DIALOG);//IDD_ETIME_DIALOG为程序主对话框ID,获取对话框指针

    m_pDC=m_pView->GetDC();//获取对话框的DC指针

    //其他代码用m_pDC代替&dc

               无论在PAINT函数中还是OnInitDialog()中都无法实现

--------------------------------------------------------------------------------------------------------

按照别人的方法做的双缓冲,感觉与只用一个DC没区别。。。。

void CETimeDlg::OnPaint()

{

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

// TODO: Add your message handler code here

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

CDC dcMem;

        CBitmap bmpMem,*oldbmpMem;

        dcMem.CreateCompatibleDC(&dc);

bmpMem.CreateCompatibleBitmap(&dc,800,480);

oldbmpMem=dcMem.SelectObject(&bmpMem);

CDC dcMem2;

CBitmap bmpMem2,*oldbmpMem2;

CString filpath=L"";

filpath+="//NAND//sk//GPS界面主菜单-1.BMP/0";

bmpMem2.m_hObject=SHLoadDIBitmap(filpath);

dcMem2.CreateCompatibleDC(&dcMem);

oldbmpMem2=dcMem2.SelectObject(&bmpMem2);

TransparentImage(dcMem.m_hDC,0,0,800,480,dcMem2.m_hDC,0,0,800,480,RGB(255,0,255));

//难道是从兼容DC2复制图片到兼容DC1比较快,不闪屏?

// dcMem2.SelectObject(oldbmpMem2);

// bmpMem2.DeleteObject();

// dcMem2.DeleteDC();

dc.BitBlt(0,0,800,480,&dcMem,0,0,SRCCOPY);

dcMem2.SelectObject(oldbmpMem2);

bmpMem2.DeleteObject();

dcMem2.DeleteDC();

dcMem.SelectObject(oldbmpMem);

bmpMem.DeleteObject();

dcMem.DeleteDC();

}

原文地址:https://www.cnblogs.com/ezhong/p/2171498.html