OSDN Git Service

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