在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(); //设置图像头等操作
.
.
.
}