您的位置:首页 > 其它

涡流系统测试之读文件画图模块

2010-09-13 22:54 267 查看
#include <afxwin.h>
#include <cstdio>
#include <process.h>

#define MAX 300
struct tag_point
{
	short int x;
	short int y;
};
tag_point points[MAX];
tag_point prev_points[MAX];

class CWindow : public CFrameWnd
{
public:
	CWindow()
	{
		this->Create(NULL,_T("Learning"));
		this->ShowWindow(SW_SHOW);
		this->UpdateWindow();

		//创建内存DC
		hdc = ::CreateCompatibleDC(NULL);
		//获取当前DC
		CDC *pDC = GetDC();
		HDC hDC = ::GetDC(NULL);
		//初始化位图
		hbmp = ::CreateCompatibleBitmap(hDC,1400,1000);

		ReleaseDC(pDC);
		::SelectObject(hdc,hbmp);

		RECT rc={0,0,1400,1000};
		::FillRect(hdc,&rc,(HBRUSH)(GetStockObject(BLACK_BRUSH)));
	}

	virtual ~CWindow()
	{
		::DeleteObject(hbmp);
		::DeleteDC(hdc);
	}

protected:
	afx_msg void OnPaint()
	{
		CPaintDC dc(this);
		RECT rc;
		GetClientRect(&rc);
		//贴图
		::BitBlt(dc.m_hDC,0,0,rc.right - rc.left,rc.bottom - rc.top,hdc,0,0,SRCCOPY);
	}
public:
	//内存位图.
	HBITMAP hbmp;
	HDC hdc;
protected:
	//生成消息映射函数
	DECLARE_MESSAGE_MAP();
};

BEGIN_MESSAGE_MAP(CWindow,CFrameWnd)
	//绘图消息映射函数~
	ON_WM_PAINT()
END_MESSAGE_MAP()

class CApp : public CWinApp
{
	virtual BOOL InitInstance()
	{
		//创建窗口
		this->m_pMainWnd = new CWindow();

		file = _tfopen(_T("D://1.dat"),_T("r+b"));

		if (file == NULL)
		{
			//打开文件失败
			AfxMessageBox(_T("文件打开失败"));
			return 0;
		}
		fseek(file,0,SEEK_END);
		posEnd = ftell(file);
		fclose(file);
		posCur = 0;
		sizeCur = 0;
		sizePrev = 0;

		hMutex = NULL;

		//创建读文件线程
		//this指针传递本对象给回调函数
		hThreadFile = ::CreateThread(NULL,NULL,&CApp::ThreadReadProc,this,0,NULL);
		//创建画图线程
		hThreadPaint = ::CreateThread(NULL,NULL,&CApp::ThreadPaintProc,this,0,NULL);

		return true;
	}

	virtual int ExitInstance()
	{

		::CloseHandle(hThreadFile);
		::CloseHandle(hThreadPaint);

		return CWinApp::ExitInstance();
	}

	//读文件回调函数,传给函数的参数,这个的使用很需要锻炼!
	//静态成员函数不会传递this指针
	static DWORD WINAPI ThreadReadProc(LPVOID lpParam)
	{
		CApp *pApp= (CApp*)lpParam;
		
		while (pApp->posCur < pApp->posEnd )
		{	

			//等待互斥对象的通知
			WaitForSingleObject(pApp->hMutex,INFINITE);

			FILE *file = _tfopen(_T("D://1.dat"),_T("r+b"));

			//静态成员函数不能修改对象的的数据,因为没有传递this指针
			//posCur = 0;非法!
			//通过传递给回调函数的指针,先转化成对象模型,再来修改对象的变量~~

			fseek(file,pApp->posCur,SEEK_SET);

			//fseek((FILE *)(pApp->file),pApp->posCur,SEEK_SET);

			pApp->sizeCur = fread(points,sizeof(tag_point),MAX,file);

			//pApp->sizeCur = fread(points,sizeof(tag_point),MAX,(FILE *)(pApp->file));

			pApp->posCur += pApp->sizeCur;

			//释放互斥对象
			ReleaseMutex(pApp->hMutex);

			fclose(file);
		}
		
		//fclose((FILE *)(pApp->file));
		return 0;
	}

	//画图线程回掉函数
	static DWORD WINAPI ThreadPaintProc(LPVOID lpParam)
	{
		CApp *pApp= (CApp*)lpParam;
		
		int i;
		while (pApp->posCur < pApp->posEnd)
		{
			//等待互斥对象通知
			WaitForSingleObject(pApp->hMutex,INFINITE);

			Sleep(200);

			
			//滚动~~
			//擦除上次话的点
			for(i = 0;i < pApp->sizePrev;i++)
					::SetPixel(((CWindow *)(pApp->m_pMainWnd))->hdc,prev_points[i].x + 400,prev_points[i].y + 200,RGB(0,0,0));
			//绘制本次的点
			for(i = 0;i < pApp->sizeCur; i++)
			{
				::SetPixel(((CWindow *)(pApp->m_pMainWnd))->hdc,points[i].x + 400,points[i].y + 200,RGB(255,10,0));
			}
			//本次记录作为下次记录的prev~~
			pApp->sizePrev = pApp->sizeCur;
			memcpy(prev_points,points,sizeof(points));
			

			////发送消息 调用OnPaint()函数 绘图
			((CWindow*)(pApp->m_pMainWnd))->Invalidate(FALSE);

			//释放互斥对象
			ReleaseMutex(pApp->hMutex);
		}
		AfxMessageBox(_T("画图完成!~~"));
		return 0;
	}

public:
	HANDLE hThreadFile;
	HANDLE hThreadPaint;
	FILE *file;
	long sizeCur;
	long sizePrev;
	long posCur;
	long posEnd;
	//线程同步~~使用临界区对象
	//CRITICAL_SECTION cs;

	//互斥对象
	HANDLE hMutex;
};

CApp theApp;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: