-
Notifications
You must be signed in to change notification settings - Fork 63
/
Copy pathDIPDemoDoc.cpp
309 lines (222 loc) · 5.53 KB
/
DIPDemoDoc.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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
// DIPDemoDoc.cpp : implementation of the CDIPDemoDoc class
//
#include "stdafx.h"
#include "DIPDemo.h"
#include "DIPDemoDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoDoc
IMPLEMENT_DYNCREATE(CDIPDemoDoc, CDocument)
BEGIN_MESSAGE_MAP(CDIPDemoDoc, CDocument)
//{{AFX_MSG_MAP(CDIPDemoDoc)
ON_COMMAND(ID_FILE_REOPEN, OnFileReopen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoDoc construction/destruction
CDIPDemoDoc::CDIPDemoDoc()
{
m_sizeDoc = CSize(1,1);
m_pPalette = NULL;
// 默认背景色,灰色
m_refColorBKG = 0x00808080;
}
CDIPDemoDoc::~CDIPDemoDoc()
{
// 判断调色板是否存在
if (m_pPalette != NULL)
{
// 清除调色板
delete m_pPalette;
}
}
BOOL CDIPDemoDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoDoc diagnostics
#ifdef _DEBUG
void CDIPDemoDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDIPDemoDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDIPDemoDoc commands
BOOL CDIPDemoDoc::CanCloseFrame(CFrameWnd* pFrame)
{
// TODO: Add your specialized code here and/or call the base class
return CDocument::CanCloseFrame(pFrame);
}
void CDIPDemoDoc::DeleteContents()
{
// TODO: Add your specialized code here and/or call the base class
if(m_pPalette != NULL)
m_pPalette->DeleteObject();
CDocument::DeleteContents();
}
void CDIPDemoDoc::Init()
{
// 初始化
// 如果图像无效,直接返回
if (!m_Image.IsValidate())
{
return;
}
// 设置文档大小
m_sizeDoc = CSize(m_Image.GetWidthPixel(), m_Image.GetHeight());
// 判断调色板是否为空
if (m_pPalette != NULL)
{
// 删除调色板对象
delete m_pPalette;
// 重置调色板为空
m_pPalette = NULL;
}
//不是调色板显示模式,则直接返回
CClientDC dc(NULL);
if((dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0)
return;
// 创建新调色板
m_pPalette = new CPalette;
int nEntries = m_Image.GetColorTableEntriesNum();
if (nEntries == 0)
return;
LOGPALETTE* lpPal = (LOGPALETTE*) new BYTE[sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY)*(nEntries-1))];
// 设置版本号
lpPal->palVersion = 0x300;
// 设置颜色数目
lpPal->palNumEntries = (WORD)nEntries;
RGBQUAD *pPal = (RGBQUAD*)(m_Image.GetColorTable());
int i;
// 创建调色板
for (i = 0; i < nEntries; i++)
{
// 读取红色分量
lpPal->palPalEntry[i].peRed = pPal[i].rgbRed;
// 读取绿色分量
lpPal->palPalEntry[i].peGreen = pPal[i].rgbGreen;
// 读取蓝色分量
lpPal->palPalEntry[i].peBlue = pPal[i].rgbBlue;
// 保留位
lpPal->palPalEntry[i].peFlags = 0;
}
// 按照逻辑调色板创建调色板,并返回指针
m_pPalette->CreatePalette(lpPal);
delete lpPal;
}
BOOL CDIPDemoDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
DeleteContents();
// 更改光标形状
BeginWaitCursor();
// 读取图像并附加到m_Image上
if(!m_Image.AttachFromFile(lpszPathName))
{
EndWaitCursor();
AfxMessageBox("打开文件时出错!请确保正确的位图(*.bmp)文件类型。");
return FALSE;
}
// 恢复光标形状
EndWaitCursor();
//nWidth = m_Image->->biWidth;
//nHeight = BIH->biHeight;
//nColorBits = BIH->biBitCount;
//nByteWidth = (nWidth*nColorBits + 31) / 32 * 4;
//nColor = (nColorBits > 8) ? 0 : (int)(pow(2.0, nColorBits));//
//lpBits = lpBitmap + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nColor;
// 判断读取成功否
if (!m_Image.m_lpData)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
return FALSE;
}
Init(); //对图像的尺寸和调色板信息进行初始化
// 设置文件名称
SetPathName(lpszPathName);
// 拷贝当前m_Image到m_OImage
m_OImage = m_Image;
// 初始化胀标记为FALSE
SetModifiedFlag(FALSE);
// 返回TRUE
return TRUE;
}
void CDIPDemoDoc::OnFileReopen()
{
// 重新打开图像,放弃所有修改
// 判断当前图像是否已经被改动
if (IsModified())
{
// 提示用户该操作将丢失所有当前的修改
if (MessageBox(NULL, "重新打开图像将丢失所有改动!是否继续?", "系统提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
{
// 用户取消操作,直接返回
return;
}
}
CString strPathName;
// 获取当前文件路径
strPathName = GetPathName();
// 更改光标形状
BeginWaitCursor();
if(!m_Image.AttachFromFile(strPathName))
{
EndWaitCursor();
AfxMessageBox("打开文件时出错!请确保正确的位图(*.bmp)文件类型。");
return;
}
// 判断读取成功否
if (!m_Image.m_lpData)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
Init(); //对图像的尺寸和调色板信息进行初始化
// 初始化脏标记为FALSE
SetModifiedFlag(FALSE);
// 刷新
UpdateAllViews(NULL);
// 恢复光标形状
EndWaitCursor();
// 返回
return;
}
BOOL CDIPDemoDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
if(!m_Image.SaveToFile(lpszPathName))
{
CString strMsg;
strMsg = "无法保存BMP图像!";
// 提示出错
MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
return FALSE;
}
// 恢复光标形状
EndWaitCursor();
// 重置胀标记为FALSE
SetModifiedFlag(FALSE);
return TRUE;
}