OSDN Git Service

CLSIDの変更
[seraphyscrtools/SeraphyScriptTools.git] / Draw.cpp
1 // Draw.cpp : CCanvas \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2 #include "stdafx.h"
3 #include "SeraphyScriptTools.h"
4 #include "Draw.h"
5 #include "generic.h"
6
7 /////////////////////////////////////////////////////////////////////////////
8 // CCanvas
9
10 HRESULT CCanvas::FinalConstruct()
11 {
12         // \94h\90\8c³\8aÖ\98A
13         m_hParent = NULL;
14
15         // \88ó\8dü\8aÖ\98A
16         m_pPrinterDeviceMode = NULL;
17         m_marginWidth = 150; // 1.5Cm\82Ì\83}\81[\83W\83\93
18         m_marginHeight = 150;
19
20         // \83\8c\83C\83\84\81[\82Ì\8f\89\8aú\89»
21         for (int i = 0; i < MAXLAYER; i++) {
22                 m_pComLayer[i] = NULL;
23         }
24         for (int i = 0; i < MAXLAYER; i++) {
25                 HRESULT hr = CComObject<CLayer>::CreateInstance(&m_pComLayer[i]);
26                 if (FAILED(hr)) {
27                         return hr;
28                 }
29                 m_pComLayer[i]->AddRef();
30         }
31
32         return S_OK;
33 }
34
35 void CCanvas::FinalRelease()
36 {
37         ATLTRACE("CCanvas::FinalRelease\r\n");
38         // \83v\83\8a\83\93\83^\83f\83o\83C\83X\82Ì\89ð\95ú
39         if (m_pPrinterDeviceMode) {
40                 delete m_pPrinterDeviceMode;
41                 m_pPrinterDeviceMode = NULL;
42         }
43
44         // \83\8c\83C\83\84\81[\83I\83u\83W\83F\83N\83g\82Ì\89ð\95ú
45         for (int i = 0; i < MAXLAYER; i++) {
46                 if (m_pComLayer[i] != NULL) {
47                         m_pComLayer[i]->Release();
48                         m_pComLayer[i] = NULL;
49                 }
50         }
51 }
52
53 STDMETHODIMP CCanvas::get_Layer(VARIANT varLay, VARIANT *pVal)
54 {
55         // \83\8c\83C\83\84\81[\83I\83u\83W\83F\83N\83g\82Ì\8eó\82¯\93n\82µ
56         CComVariant vLay;
57         int nLayer = 0;
58         if (SUCCEEDED(vLay.ChangeType(VT_I2, &varLay))) {
59                 nLayer = vLay.iVal;
60         }
61         if (!(nLayer >= 0 && nLayer < MAXLAYER) || m_pComLayer[nLayer] == NULL) {
62                 return Error(IDS_ERR_LAYERBOUND);
63         }
64
65         IUnknown* pUnk = NULL;
66         if (SUCCEEDED(m_pComLayer[nLayer]->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
67                 ::VariantInit(pVal);
68                 pVal->vt = VT_UNKNOWN;
69                 pVal->punkVal = pUnk;
70         }
71         return S_OK;
72 }
73
74 /////////////////////////////////
75 // \88ó\8dü\83\81\83\\83b\83h\81E\83v\83\8d\83p\83e\83B
76 STDMETHODIMP CCanvas::PrintAs(VARIANT print, VARIANT* pRet)
77 {
78         CComVariant varRet, varPrint;
79         PRINTDLG pdlg = {0};
80         pdlg.lStructSize = sizeof(PRINTDLG);
81         pdlg.hwndOwner = m_hParent;
82         pdlg.Flags = PD_NOPAGENUMS | PD_RETURNDC;
83         if (PrintDlg(&pdlg)) {
84                 if (pdlg.hDevMode) {
85                         // \83v\83\8a\83\93\83g\83f\83o\83C\83X\83p\83\89\83\81\81[\83^\81[\82ð\8eæ\93¾\82·\82é
86                         DWORD siz = GlobalSize(pdlg.hDevMode);
87                         if (m_pPrinterDeviceMode) {
88                                 delete m_pPrinterDeviceMode;
89                         }
90                         DEVMODE *pDevMode = (DEVMODE*)GlobalLock(pdlg.hDevMode);
91                         m_pPrinterDeviceMode = (DEVMODE*) new BYTE[siz + 1];
92                         CopyMemory(m_pPrinterDeviceMode, pDevMode, siz);
93                         // \83v\83\8a\83\93\83^\96¼\82ð\95Û\91
94                         StringCchCopy(m_szPrinterName, MAX_PATH, (LPCTSTR)pDevMode->dmDeviceName);
95                         varRet = pDevMode->dmDeviceName;
96                         GlobalUnlock(pdlg.hDevMode);
97                         GlobalFree(pdlg.hDevMode);
98                 }
99                 if (pdlg.hDevNames) {
100                         GlobalFree(pdlg.hDevNames);
101                 }
102                 // \83v\83\8a\83\93\83g\82·\82é\82©\90Ý\92è\82¾\82¯\82©?
103                 BOOL bPrintOut = true;
104                 if (print.vt != VT_EMPTY && print.vt != VT_NULL && print.vt != VT_ERROR
105                         && varPrint.ChangeType(VT_I2, &print) == S_OK) {
106                         bPrintOut = varPrint.iVal;
107                 }
108                 CDC dc;
109                 dc.m_bPrinting = true;
110                 dc.m_hDC = pdlg.hDC;
111                 if (bPrintOut) {
112                         PrintCore(dc);
113                 }
114                 DeleteDC(dc.m_hDC);
115         }
116         varRet.Detach(pRet);
117         return S_OK;
118 }
119
120 STDMETHODIMP CCanvas::Print()
121 {
122         if (!m_pPrinterDeviceMode) {
123                 // \82Ü\82¾\83v\83\8a\83\93\83^\83f\83o\83C\83X\82ð\83I\81[\83v\83\93\82µ\82Ä\82¢\82È\82¢
124                 CComVariant dmy;
125                 PrintAs(dmy, &dmy);
126         }
127         else {
128                 // \82·\82Å\82É\8eæ\93¾\82³\82ê\82½\83v\83\8a\83\93\83^\96¼\82Æ\83f\83o\83C\83X\83p\83\89\83\81\81[\83^\81[\82Å\88ó\8dü\82·\82é
129                 HDC hdc = CreateDC(NULL, m_szPrinterName, NULL, m_pPrinterDeviceMode);
130                 CDC dc;
131                 dc.m_hDC = hdc;
132                 dc.m_bPrinting = true;
133                 PrintCore(dc);
134                 DeleteDC(dc.m_hDC);
135         }
136         return S_OK;
137 }
138
139 BOOL CCanvas::PrintCore(CDC dc)
140 {
141         ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
142         // \83v\83\8a\83\93\83^\82Ì\83I\81[\83v\83\93
143         DOCINFO dinfo = {0};
144         dinfo.cbSize = sizeof(DOCINFO);
145         dinfo.lpszDocName = _TEXT("SeraphyScriptTools");
146         int nJob = StartDoc(dc.m_hDC, &dinfo);
147         StartPage(dc.m_hDC);
148         // \88ó\8dü\94Í\88Í\82Ì\90Ý\92è
149         SetMapMode(dc.m_hDC, MM_LOMETRIC);
150         int width = GetDeviceCaps(dc.m_hDC, PHYSICALWIDTH);
151         int height = GetDeviceCaps(dc.m_hDC, PHYSICALHEIGHT);
152         SetViewportOrgEx(dc.m_hDC, 0, height, NULL);
153         SetWindowOrgEx(dc.m_hDC, -m_marginWidth, -m_marginHeight, NULL);
154         // \94w\8ci\83\82\81[\83h\90Ý\92è
155         SetBkMode(dc.m_hDC, TRANSPARENT);
156         // \83\8c\83C\83\84\81[\82Ì\88ó\8dü
157         dc.m_rct.bottom = GetDeviceCaps(dc.m_hDC, VERTSIZE) * 10;
158         dc.m_rct.right = GetDeviceCaps(dc.m_hDC, HORZSIZE) * 10;
159         dc.m_rct.bottom += -(m_marginHeight * 2); // \83r\83\85\81[\83|\81[\83g\82Ì\90Ý\92è\82Å\8fc\97]\94\92\82³\82ê\82Ä\82¢\82é\82Ì\82ð\83L\83\83\83\93\83Z\83\8b\82·\82é
160         for (int i = 0; i < MAXLAYER; i++) {
161                 m_pComLayer[i]->Draw(dc);
162         }
163         // \8fI\97¹
164         EndPage(dc.m_hDC);
165         EndDoc(dc.m_hDC);
166         ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
167         return true;
168 }
169
170 STDMETHODIMP CCanvas::GetPrinterDefault(VARIANT name)
171 {
172         CComVariant varName;
173         ATL::CString szPrinterName(_TEXT(""));
174         if (SUCCEEDED(varName.ChangeType(VT_BSTR, &name))) {
175                 szPrinterName = varName.bstrVal;
176         }
177         else {
178                 DWORD namesz = MAX_PATH;
179                 LPTSTR pName = szPrinterName.GetBufferSetLength(namesz);
180                 if (!GetDefaultPrinter(pName, &namesz)) {
181                         // \8aù\92è\82Ì\83v\83\8a\83\93\83^\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½\8fê\8d\87
182                         return Error(IDS_ERR_NODEFPRINTER);
183                 }
184                 szPrinterName.ReleaseBuffer();
185         }
186
187         HANDLE hp;
188         if (OpenPrinter(szPrinterName.GetBuffer(), &hp, NULL)) {
189                 if (m_pPrinterDeviceMode) {
190                         // \8aù\91\82Ì\83o\83b\83t\83A\82ð\83N\83\8a\83A
191                         delete m_pPrinterDeviceMode;
192                 }
193
194                 // \95K\97v\82È\83p\83\89\83\81\81[\83^\81[\82Ì\95Û\8e\9d
195                 DWORD sz = (DWORD)DocumentProperties(
196                         m_hParent, hp, szPrinterName.GetBuffer(), NULL, NULL, 0);
197                 m_pPrinterDeviceMode = (DEVMODE*)new BYTE[sz + 1];
198
199                 DocumentProperties(m_hParent, hp, szPrinterName.GetBuffer(),
200                         m_pPrinterDeviceMode, NULL, DM_OUT_BUFFER);
201                 ClosePrinter(hp);
202
203                 // \83v\83\8a\83\93\83^\96¼\82Ì\95Û\91
204                 StringCchCopy(m_szPrinterName, MAX_PATH, szPrinterName);
205         }
206         else {
207                 // \83v\83\8a\83\93\83^\8fî\95ñ\82Ì\8eæ\93¾\82É\8e¸\94s\82µ\82½\8fê\8d\87
208                 return Error(IDS_ERR_PRINTERSETTING);
209         }
210         return S_OK;
211 }
212
213 STDMETHODIMP CCanvas::get_MarginWidth(long *pVal)
214 {
215         *pVal = m_marginWidth;
216         return S_OK;
217 }
218
219 STDMETHODIMP CCanvas::put_MarginWidth(long newVal)
220 {
221         m_marginWidth = newVal;
222         return S_OK;
223 }
224
225 STDMETHODIMP CCanvas::get_MarginHeight(long *pVal)
226 {
227         *pVal = m_marginHeight;
228         return S_OK;
229 }
230
231 STDMETHODIMP CCanvas::put_MarginHeight(long newVal)
232 {
233         m_marginHeight = newVal;
234         return S_OK;
235 }
236
237 void CCanvas::Draw(HDC hdc, RECT& rt)
238 {
239         // \83}\83b\83s\83\93\83O\83\82\81[\83h
240         int md = GetMapMode(hdc);
241         SetMapMode(hdc, MM_LOMETRIC);
242         POINT oldPort, oldWindow;
243         SetViewportOrgEx(hdc, 0, rt.bottom, &oldPort);
244         SetWindowOrgEx(hdc, 0, 0, &oldWindow);
245         // \83\8c\83C\83\84\81[\83I\83u\83W\83F\83N\83g\82É\95`\89æ\82ð\8ds\82í\82¹\82é
246         CDC dc;
247         dc.m_hDC = hdc;
248         dc.m_bPrinting = false;
249         dc.m_rct = rt;
250         int i;
251         for (i = 0; i < MAXLAYER; i++) {
252                 if (m_pComLayer[i] != NULL) {
253                         m_pComLayer[i]->Draw(dc);
254                 }
255         }
256         SetWindowOrgEx(hdc, oldWindow.x, oldWindow.y, NULL);
257         SetViewportOrgEx(hdc, oldPort.x, oldPort.y, NULL);
258         SetMapMode(hdc, md);
259 }
260
261 void CCanvas::DetachOwner()
262 {
263         // \83I\81[\83i\81[\83E\83B\83\93\83h\83E\82ª\82È\82­\82È\82é\81B
264         m_hParent = NULL;
265 }
266
267 void CCanvas::AttachOwner(HWND hParent)
268 {
269         // \82±\82Ì\83I\83u\83W\83F\83N\83g\82Í\8aî\96{\93I\82É\90e\83I\83u\83W\83F\83N\83g\82É\88Ë\91\82µ\82È\82¢\81B
270         // \82½\82¾\82µ\81A\83E\83B\83\93\83h\83E\82Ì\90e\8eq\8aÖ\8cW\82ð\82à\82Â\82½\82ß\82É\82Ì\82Ý\8ew\92è\82·\82é\81B
271         m_hParent = hParent;
272 }
273
274 STDMETHODIMP CCanvas::LoadPicture(VARIANT file, VARIANT *punkVal)
275 {
276         ::VariantInit(punkVal);
277         CComVariant varFile;
278         if (varFile.ChangeType(VT_BSTR, &file) != S_OK) {
279                 return DISP_E_TYPEMISMATCH;
280         }
281         IPicture* pPicture = NULL;
282         if (OleLoadPicturePath(varFile.bstrVal, NULL, 0, NULL, IID_IPicture, (void**)&pPicture) != S_OK) {
283                 return Error(IDS_ERR_PICTURELOADFAIL);
284         }
285         punkVal->vt = VT_UNKNOWN;
286         punkVal->punkVal = pPicture; // (IUnknown*)
287         return S_OK;
288 }