-
Notifications
You must be signed in to change notification settings - Fork 0
/
CREATEBLOCK.CPP
164 lines (142 loc) · 4.06 KB
/
CREATEBLOCK.CPP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "stdafx.h"
#include "math.h"
#include "VCad.h"
#include "VCadDoc.h"
#include "VCadView.h"
#include "MainFrm.h"
#include "Entity.h"
#include "Command.h"
#include "CreateCmd.h"
#include "TextInputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CCreateBlock::CCreateBlock()
: m_LeftTop(0,0), m_RightBottom(0,0)
{
m_nStep = 0; // 初始化操作步为 0
}
CCreateBlock::~CCreateBlock()
{
}
int CCreateBlock::GetType()
{
return ctCreateBlock;
}
int CCreateBlock::OnLButtonDblClk(UINT nFlags, const Position& pos)
{
/*
CTextInputDlg dlg;
dlg.m_text = m_Text;
dlg.DoModal();
m_Text = dlg.m_text;
*/
return 0;
}
int CCreateBlock::OnLButtonDown(UINT nFlags, const Position& pos)
{
m_nStep ++; // 每次单击鼠标左键时操作步加 1
switch(m_nStep) // 根据操作步执行相应的操作
{
case 1:
{
m_LeftTop = m_RightBottom = pos;
::Prompt("请输入文本的右下角点:") ;
break;
}
case 2:
{
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
// 擦除在拖动状态时显示的橡皮线
MRectangle* pTempRect = new MRectangle(m_LeftTop, m_RightBottom);
pTempRect->Draw(pDC, dmDrag);
delete pTempRect;
m_RightBottom = pos;
MBlock* pRect = new MBlock(m_LeftTop, m_RightBottom, (CBitmap*)NULL); // 根据两点创建文本
pRect->Draw(pDC, dmNormal);
g_pDoc->m_EntityList.AddTail(pRect); // 将指针添加到图元链表
g_pDoc->SetModifiedFlag(TRUE);// set modified flag ;
pRect->m_nOperationNum = g_pView->m_nCurrentOperation;
g_pView->ReleaseDC(pDC); // 释放设备环境指针
m_nStep = 0; // 将操作步重置为 0
::Prompt("请输入文本的左上角点:") ;
break;
}
}
return 0;
}
int CCreateBlock::OnMouseMove(UINT nFlags, const Position& pos)
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_DRAW_BLOCK));
// 用一静态变量nPreRefresh记录进入OnMouseMove状态时的刷新次数
static int nPreRefresh = g_nRefresh;
// 布尔变量bRefresh说明在OnMouseMove过程中视窗是否被刷新
BOOL bRefresh = FALSE;
// nCurRefresh用于记录当前的刷新次数
int nCurRefresh = g_nRefresh;
// 如果nCurRefresh和nPreRefresh不相等,说明视窗曾被刷新过
if(nCurRefresh != nPreRefresh){
bRefresh = TRUE;
nPreRefresh = nCurRefresh;
}
switch(m_nStep)
{
case 0:
::Prompt("请输入文本的左上角点:") ;
break;
case 1:
{
Position prePos, curPos;
prePos = m_RightBottom; // 获得鼠标所在的前一个位置
curPos = pos;
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
// 创建临时对象擦除上一条橡皮线
MRectangle* pTempRect = new MRectangle(m_LeftTop, prePos);
if(!bRefresh) // 当视窗没有被刷新时,重画原来的橡皮线使其被擦除
pTempRect->Draw(pDC, dmDrag);
delete pTempRect;
// 创建临时对象,根据当前位置绘制一条橡皮线
MRectangle* pTempRect2 = new MRectangle(m_LeftTop, curPos);
pTempRect2->Draw(pDC, dmDrag);
delete pTempRect2;
g_pView->ReleaseDC(pDC); // 释放设备环境指针
m_RightBottom = curPos; // 将当前位置设置为直线终点,以备下一次鼠标移动时用
break;
}
}
return 0;
}
// 单击鼠标右键取消当前的操作
int CCreateBlock::OnRButtonDown(UINT nFlags, const Position& pos)
{
// 如果当前的操作步为 1 ,那么要在结束本次操作前擦除上次鼠标移动时绘制的橡皮线
if(m_nStep == 1){
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
Position prePos = m_RightBottom; // 获得鼠标所在的前一个位置
MRectangle* pTempRect = new MRectangle(m_LeftTop, m_RightBottom);
pTempRect->Draw(pDC, dmDrag); // 擦除上一次绘制的橡皮线
delete pTempRect;
g_pView->ReleaseDC(pDC); // 释放设备环境指针
}
m_nStep = 0; // 将操作步重置为 0
::Prompt("请输入文本的左上角点:") ;
return 0;
}
// 调用Cancel 函数取消本次操作
int CCreateBlock::Cancel()
{
// 如果当前的操作步为 1 ,那么要在结束本次操作前擦除上次鼠标移动时绘制的橡皮线
if(m_nStep == 1){
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
Position prePos = m_RightBottom; // 获得鼠标所在的前一个位置
MRectangle* pTempRect = new MRectangle(m_LeftTop, m_RightBottom);
pTempRect->Draw(pDC, dmDrag); // 擦除上一次绘制的橡皮线
delete pTempRect;
g_pView->ReleaseDC(pDC); // 释放设备环境指针
}
m_nStep = 0; // 将操作步重置为 0
::Prompt("就绪"); // 等待提示新类型的命令操作
return 0 ;
}