⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2dcadview.cpp

📁 Visual c++程序设计培训教程
💻 CPP
📖 第 1 页 / 共 2 页
字号:

			::ReleaseCapture();//释放鼠标捕捉
		}
	}

	//绘图完毕后落选画笔
	dc.SelectObject(poldpen);

	CView::OnLButtonDown(nFlags, point);
}


BOOL CMy2DCADView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bIsPoint)
	{//如果处于画点状态,就使用自定义的IDC_POINTER光标
		HCURSOR   hCursor;

		hCursor = AfxGetApp()->LoadCursor(IDC_POINTER);//装载自定义光标
		SetCursor(hCursor);							   //设置光标

		return TRUE;//直接返回,不再调用CView::OnSetCursor
	}

	if(m_bIsLine) 
	{//如果处于画线状态,就使用Windows系统的IDC_CROSS十字光标
		HCURSOR   hCursor;

		hCursor = AfxGetApp()->LoadStandardCursor(IDC_CROSS);//装载自定义光标
		SetCursor(hCursor);									 //设置光标

		return TRUE;
	} 
	
	//其它情况下,由基类的OnSetCursor函数来设置缺省光标形状
	return CView::OnSetCursor(pWnd, nHitTest, message);
}

void CMy2DCADView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	//如果按下Esc键,则终止所有的绘图工作
	if(nChar == VK_ESCAPE)
	{
		//清除掉画点和画线状态
		m_bIsPoint = FALSE;
		m_bIsLine  = FALSE;

		//将一些成员变量恢复初始值
		m_nStep = 0;//操作步数归零
		m_nStartX = m_nStartY = 0;//记录起点坐标归零

		::ReleaseCapture();//释放鼠标捕捉
	}

	//将消息交给基类的OnKeyDown函数处理
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}


void CMy2DCADView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//获取设备环境

	/////////////////////////////////////////////////
	//          在画线段过程中拉出橡皮线           //
	/////////////////////////////////////////////////
	if(m_bIsLine)
	{
		if(m_nStep != 0)//如果不是起始点,拉出橡皮条
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nEndX !=0)
			{//如果不是第一次画线,则擦除上一条线
				dc.MoveTo(m_nStartX, m_nStartY);
				dc.LineTo(m_nEndX, m_nEndY);
			}

			//更新终点的坐标值
			m_nEndX = point.x;
			m_nEndY = point.y;
			//画出新的线段
			dc.MoveTo(m_nStartX, m_nStartY);
			dc.LineTo(m_nEndX, m_nEndY);
		}
	}
	
	//////////////////////////////////////////////////////////////////
	//            在状态栏的第二个窗格中输出鼠标当前位置            //
	//////////////////////////////////////////////////////////////////
	CString str;	//声明一个字符串
	CStatusBar* pStatus;

	pStatus = (CStatusBar*)AfxGetApp()->m_pMainWnd->
		GetDescendantWindow(AFX_IDW_STATUS_BAR);//获取状态栏窗口指针

	if (pStatus) //如果获取指针成功(不为空)
	{
		str.Format("x = %3d,y = %3d", point.x, point.y);//将坐标写入字符串
		pStatus->SetPaneText(1, str);//将字符串输出到第二个窗格
	}

	//调用基类的鼠标移动消息处理函数
	CView::OnMouseMove(nFlags, point);
}

void CMy2DCADView::OnSetLinewidth() 
{
	// TODO: Add your command handler code here
	CLineWidthDlg    dlg; // 声明一个对话框类对象
	dlg.m_nLineWidth = m_nLineWidth;//初始化对话框中的线宽成员变量

	if(dlg.DoModal() == IDOK)// 弹出设置线宽模式对话框
	{
		//如果点击OK之后返回,则将获取的数据保存在视图类成员变量中
		m_nLineWidth = dlg.m_nLineWidth;
	}
}

void CMy2DCADView::OnSetColor() 
{
	// TODO: Add your command handler code here
	CColorDialog	dlg; // 1、声明一个颜色对话框类对象

	if(dlg.DoModal() == IDOK) //2、使用DoModal成员函数弹出对话框
	{
		m_LineColor = dlg.GetColor(); //3、使用相应对话框函数获取数据
	}
/*
	CFileDialog	dlg(TRUE); // 1、声明一个文件对话框类对象

	if(dlg.DoModal() == IDOK) //2、使用DoModal成员函数弹出对话框
	{
		CString str = dlg. GetPathName (); //3、使用相应对话框函数获取数据
	}
*/
/*
	CFontDialog	dlg; // 1、声明一个字体对话框类对象

	if(dlg.DoModal() == IDOK) //2、使用DoModal成员函数弹出对话框
	{
		int size = dlg.GetSize(); //3、使用相应对话框函数获取数据
	}
*/
}


/////////////////////////////////////////////////////////////
//                  工作线程函数                           //
/////////////////////////////////////////////////////////////
UINT  ThreadProc(LPVOID ThreadParam)
{
	CDC * pDC;
	CMy2DCADView * pView;

	//获取视图指针,注意包含头文件MainFrm.h
	CMainFrame * pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
	pView = (CMy2DCADView *)(pFrame->GetActiveView());

	pDC = pView->GetDC();  // 获取设备环境
	RECT rect;
	pView->GetClientRect(&rect);  // 获取客户区大小

	int  num = 0;//计数器

	CBrush  brush(HS_CROSS, RGB(0,255,0)); // 构造一支阴影模式画刷,填充矩形内部
	CBrush * poldbrush = pDC->SelectObject(&brush);
		
	do{// 使用循环画矩形,达到动画效果
		num ++;//计数器加1

		//画矩形。
		pDC->Rectangle(0,
						rect.bottom-(num/10),
						100,
						rect.bottom);

		//延迟
//		for(int i=0;i<300000;i++);
		
		Sleep(3); // 每画一个矩形延时3毫秒,也可使用上面被注释的空循环方式

	}while(num < 1000); // 循环1000次

	pDC->SelectObject(poldbrush); //落选画笔
	pView->ReleaseDC(pDC); // 释放设备环境

	return 1;
}


void CMy2DCADView::OnThreadSingle() 
{
	// TODO: Add your command handler code here
	ThreadProc(0); // 直接调用线程函数
}

void CMy2DCADView::OnThreadWorker() 
{
	// TODO: Add your command handler code here
	//使用AfxBeginThread函数创建工作线程,
	//并保存新线程对象的指针到m_pThread中
	m_pThread = AfxBeginThread(ThreadProc,   // 全局线程函数名字
								0            // 传入的参数
								);  

	//使用CreateThread函数创建工作线程
/*	DWORD  threadID;      // 记录线程ID
	//m_hThread为HANDLE类型变量,记录线程句柄
	m_hThread = CreateThread(0,0,
				(LPTHREAD_START_ROUTINE)ThreadProc,0,0,&threadID);
*/
}

void CMy2DCADView::OnThreadUi() 
{
	// TODO: Add your command handler code here
	//使用AfxBeginThread函数创建用户界面线程,
	//并保存新线程对象的指针到m_pUIThread中
	m_pUIThread = AfxBeginThread(RUNTIME_CLASS(CUIThread));   // 线程类的执行期类指针
}

///////////////////////////////////
//将线程挂起
void CMy2DCADView::OnThreadSuspend() 
{
	// TODO: Add your command handler code here
	if(m_pThread)       // 如果工作线程指针非空
		m_pThread->SuspendThread();// 将线程挂起数+1
}

///////////////////////////////////
//将线程唤醒
void CMy2DCADView::OnThreadResume() 
{
	// TODO: Add your command handler code here
	if(m_pThread)       // 如果工作线程指针非空
		m_pThread->ResumeThread();// 将线程挂起数-1
}

//////////////////////////////////////////
//定义一个全局变量,用来记录被转换的字符串
char MyString[]="software engineer garden!";

//包含使用线程同步对象说需要的头文件
#include "afxmt.h"

CEvent eventObj;   //构造一个自动事件对象

///////////////////////////////////////////////////////
//        会发生冲突的工作线程函数                   //
//    此函数将传入的字符串全部变成大写               //
///////////////////////////////////////////////////////
UINT MyWorkThread(LPVOID pParam)
{
	CWnd * pMainWnd = AfxGetMainWnd(); // 获取主窗口指针

	if (pParam == NULL)
	{ // 如果没有字符串被传入,弹出消息框显示错误
		::MessageBox(pMainWnd->m_hWnd, "参数传递出错。线程结束!",
			                "线程发生错误", MB_OK|MB_ICONERROR);
		
		AfxEndThread(2); // 使用AfxEndThread函数终止工作线程,退出码为2
	}

	char* pStr=(char*) pParam; // 从字符串第一个字符开始

	while(*pStr) // 使用while循环来转换字符串
	{
		if(*pStr>='a' && *pStr<='z')  // 如果字符为小写字母
			*pStr-=32;  //将小写字母转换成大写字母。

		pStr++;			//指向下一个字符。
	}

	// 字符串转换工作已经完成
	eventObj.SetEvent();  // 设置事件变成有信号状态

	return 0;
}



void CMy2DCADView::OnThreadEvent() 
{
	// TODO: Add your command handler code here
	CDC * pDC = GetDC();     // 获取设备环境指针

	// 将转换之前的字符串输出
	pDC->TextOut(20,20,"转换之前的字符串为:");
	pDC->TextOut(40,60,MyString);

	char* pString;
	pString=(char*)MyString;  // 将全局字符串作为线程函数参数

//	// 方法1:直接调用线程函数来转换字符串
	MyWorkThread((LPVOID)pString);

	// 方法2:产生一个工作线程来转换字符串
	AfxBeginThread(MyWorkThread,(LPVOID)pString);

	//锁住事件
    eventObj.Lock(2000);  // 等待事件有信号才返回。

	// 将转换之后的字符串输出
	pDC->TextOut(20,100,"转换之后的字符串为:");
	pDC->TextOut(40,140,MyString);

	ReleaseDC (pDC); // 释放设备环境指针
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -