使用多线程绘图(二)

类别:VC语言 点击:0 评论:0 推荐:

 

二.如何使用多线程
   1.demo界面设置:
   为了能很好的模拟测试多线程绘图显示程序,我们建立了一个简单的demo程序,
先使用mfc向导,建立一个对话框程序,并增加全局变量CDib m_dib,对话框上建立三
个按钮和一个进度条,按钮1的功能为将c:\test1.bmp读入m_dib,按钮2的功能为将
c:\test2.bmp读入m_dib,按钮3的功能为终止m_dib的读入(关于CDib将在以后详细
说明),进度条用于显示当前读入数据的进度,于是按钮中的代码如下:
   void CDemoDlg::OnButton1()
   {
      m_dib.LoadBmp ("c:\\test1.bmp");
   }
   void CDemoDlg::OnButton2()
   {
      m_dib.LoadBmp ("c:\\test2.bmp");
   }
   void CDemoDlg::OnButton3()
   {
 m_dib.DoStop();   //停止CDib的读入操作
   }
   但是,m_dib读入功能为多线程读取函数那有可能在读取test1.bmp时,程序要求读取test2.bmp,
所以按钮中的代码修改如下:
   void CDemoDlg::OnButton1()
   {
      m_dib.DoStop();       //这也可以直接加入LoadBmp中
      m_dib.LoadBmp ("c:\\test1.bmp");
   }
   void CDemoDlg::OnButton2()
   {
      m_dib.DoStop();
      m_dib.LoadBmp("c:\\test2.bmp");
   }

   当然我们还要显示m_Dib,为了显示m_Dib我们对OnPaint作如下修改:
   void CDemoDlg::OnPaint()
   {
 CPaintDC dc(this);
 CRect clientRc;
 GetClientRect(&clientRc);          //取得窗体大小

 CDC memDC1;                        //我们将读入的图像置于memDC1中
 CDC memDC2;                        //memDC2设置背景图像

 CBitmap m_bitmap;
 CBitmap * m_pOldBitmap;
 CBitmap * m_pOldBitmapA;

 memDC1.CreateCompatibleDC(&dc);
 memDC2.CreateCompatibleDC(&dc);

 m_bitmap.CreateCompatibleBitmap(&dc,clientRc.Width() , clientRc.Height());
        m_pOldBitmapA = memDC2.SelectObject(&m_bitmap);
 m_pOldBitmap  = memDC1.SelectObject(&m_Dib);  //m_Dib为全局变量

 memDC2.BitBlt(0,0, clientRc.Width(), clientRc.Height(),
              &memDC1,0,0, SRCCOPY);       //将读入的图像复制到背景图中

 dc.BitBlt(0,0, clientRc.Width(), clientRc.Height(),
              &memDC2,0,0, SRCCOPY);       //显示当前图像
 
        memDC2.SelectObject(m_pOldBitmapA );
        memDC1.SelectObject(m_pOldBitmap );
   }
   我们建立两个消息函数负责子线程向界面线程报告完成情况和状态,
   ON_MESSAGE(WM_SETPOS, ON_WM_SETPOS)            //负责子线程向主线程报告完成进度
 ON_MESSAGE(WM_INTERRUPT, ON_WM_INTERRUPT)      //负责子线程向主线程报告是否中断

           (待续...)

 

本文地址:http://com.8s8s.com/it/it537.htm