OSDN Git Service

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