在CDib中我们每次读入图像的一行,然后发送WM_SETPOS消息给界面线 程,界面则刷新当前图像和进度条,在ON_WM_SETPOS中,wParam为bmp总行 数,lParam为目前处理的行数,为了简化程序我们只处理自底向上(即bmp图 像高度>0)的图像. void CDemoDlg::ON_WM_SETPOS(WPARAM wParam, LPARAM lParam) { CRect clientRc; GetClientRect(&clientRc); //取得当前窗体大小
CProgressCtrl *cw; cw=(class CProgressCtrl *)GetDlgItem(IDC_PROGRESS1); cw->SetRange (0,100); //设置进度条
float l; if (wParam!=0) l=(float) lParam/(float)wParam*100; else l=0; cw->SetPos ((int)l); //更新进度条
CRect rc; rc.SetRect (0,wParam-lParam,clientRc.Width(),wParam-lParam+1); InvalidateRect(&rc,false); //刷新当前行 } 至此我们的界面程序基本完成.
2.CDib设置: 下面我们进行CDib的构建,为了方便图像的显示处理我们继承CBitmap构建CDib, 为了解说方便,我们只处理24位色图,这里我们给出CDib基本结构,其他部分读者可以 自由扩充.
class CDib : public CBitmap { public: CDib(); //构造函数 virtual ~CDib(); //析构函数 BYTE * m_lpBits; //数据指针,指向cbitmap的数据区 LPBITMAPINFOHEADER m_lpBmih;//图像头指针 HANDLE hMutex; //互斥变量 HANDLE hStopEvent; //线程读到此信号,立即退出现有的操作 CWnd * m_Wnd; //用于子线程发送消息界面指针 CWinThread *m_cAniThread; //多线程中,子线程对象 virtual void DoStop(); //用于界面线程中停止当前线程 BOOL LoadBmp(LPCTSTR lpszPathName, CDC* pDC = NULL); //由bmp读入图像 static UINT ThreadProcRead(LPVOID parm); //多线程函数读入图像 . . . protected: BOOL AttachDib(HGDIOBJ hObject); //Attach Object BOOL DeleteDib(); //delete object void Initialize(); //设置图像头等操作 . . . }

|