📄 2dcadview.cpp
字号:
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); // 释放设备环境指针
}
void CMy2DCADView::OnDllString()
{
// TODO: Add your command handler code here
CDC * pDC = GetDC(); // 获取设备环境指针
// 将转换之前的字符串输出
pDC->TextOut(20,20,"转换之前的字符串为:");
pDC->TextOut(40,60,MyString);
char* pString;
pString=(char*)MyString; // 将全局字符串作为线程函数参数
//////////////////////////////////////////////////////////////////////
// 下面使用显示连接的方式连接string.dll库,并使用其中的字符转换函数 //
//////////////////////////////////////////////////////////////////////
HINSTANCE hInstance; // 定义变量,存储动态连接库的指针
typedef UINT (STR_FUNC)(LPVOID); // 函数原型
STR_FUNC * pFunction; // 定义一个函数指针
//1、给定具体路径,通过LoadLibrary函数加载DLL,
VERIFY(hInstance=::LoadLibrary(
"E:\\VC讲座\\String\\debug\\string.dll"));//string.dll的完整路径
//2、通过GetProcAddress函数找到DLL中MyWorkThread函数的地址
VERIFY(pFunction = (STR_FUNC*)::GetProcAddress(hInstance,"TranslateStr"));
//3、使用TranslateStr函数的指针调用函数,转换字符串
(*pFunction)((LPVOID)pString);
//4、使用FreeLibrary函数卸载DLL
VERIFY(FreeLibrary(hInstance));
////////////////////////////////////////////////////////////////////
// 将转换之后的字符串输出
pDC->TextOut(20,100,"转换之后的字符串为:");
pDC->TextOut(40,140,MyString);
ReleaseDC (pDC); // 释放设备环境指针
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -