1 // Draw.cpp : CCanvas
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
3 #include "SeraphyScriptTools.h"
7 /////////////////////////////////////////////////////////////////////////////
10 void CCanvas::FinalRelease()
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;
18 //
\83\8c\83C
\83\84\81[
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\89ð
\95ú
20 for(i=0 ; i<MAXLAYER ; i++){
21 if(m_pComLayer[i] != NULL){
22 m_pComLayer[i]->Release();
23 m_pComLayer[i] = NULL;
28 STDMETHODIMP CCanvas::InterfaceSupportsErrorInfo(REFIID riid)
30 static const IID* arr[] =
34 for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
36 if (IsEqualGUID(*arr[i],riid))
42 STDMETHODIMP CCanvas::get_Layer(VARIANT varLay, VARIANT *pVal)
44 //
\83\8c\83C
\83\84\81[
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\8eó
\82¯
\93n
\82µ
47 if(vLay.ChangeType(VT_I2,&varLay) == S_OK){
50 if(!(nLayer >= 0 && nLayer < MAXLAYER) || m_pComLayer[nLayer] == NULL){
51 ErrorInfo(IDS_ERR_LAYERBOUND);
52 return DISP_E_EXCEPTION;
54 IUnknown* pUnk = NULL;
55 if(m_pComLayer[nLayer]->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
57 pVal->vt = VT_UNKNOWN;
63 /////////////////////////////////
64 //
\88ó
\8dü
\83\81\83\
\83b
\83h
\81E
\83v
\83\8d\83p
\83e
\83B
65 STDMETHODIMP CCanvas::PrintAs(VARIANT print,VARIANT* pRet)
67 CComVariant varRet,varPrint;
69 pdlg.lStructSize = sizeof(PRINTDLG);
70 pdlg.hwndOwner = m_hParent;
71 pdlg.Flags = PD_NOPAGENUMS | PD_RETURNDC;
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;
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);
89 GlobalFree(pdlg.hDevNames);
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;
98 dc.m_bPrinting = true;
109 STDMETHODIMP CCanvas::Print()
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¢
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);
121 dc.m_bPrinting = true;
128 BOOL CCanvas::PrintCore(CDC dc)
130 ::SetCursor(::LoadCursor(NULL,IDC_WAIT));
131 //
\83v
\83\8a\83\93\83^
\82Ì
\83I
\81[
\83v
\83\93
133 dinfo.cbSize = sizeof(DOCINFO);
134 dinfo.lpszDocName = "SeraphyScriptTools";
135 int nJob = StartDoc(dc.m_hDC,&dinfo);
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é
150 for(i=0;i<MAXLAYER;i++){
151 m_pComLayer[i]->Draw(dc);
156 ::SetCursor(::LoadCursor(NULL,IDC_ARROW));
160 STDMETHODIMP CCanvas::GetPrinterDefault(VARIANT name)
162 TCHAR szPrinterName[MAX_PATH];
163 DWORD namesz = MAX_PATH;
165 if(varName.ChangeType(VT_BSTR,&name) == S_OK){
166 WideCharToMultiByte(GetACP(),0,varName.bstrVal,-1,szPrinterName,MAX_PATH,NULL,NULL);
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;
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;
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);
184 //
\83v
\83\8a\83\93\83^
\96¼
\82Ì
\95Û
\91¶
185 lstrcpy(m_szPrinterName,szPrinterName);
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;
195 STDMETHODIMP CCanvas::get_MarginWidth(long *pVal)
197 *pVal = m_marginWidth;
201 STDMETHODIMP CCanvas::put_MarginWidth(long newVal)
203 m_marginWidth = newVal;
207 STDMETHODIMP CCanvas::get_MarginHeight(long *pVal)
209 *pVal = m_marginHeight;
213 STDMETHODIMP CCanvas::put_MarginHeight(long newVal)
215 m_marginHeight = newVal;
219 void CCanvas::Draw(HDC hdc,RECT& rt)
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é
230 dc.m_bPrinting = false;
233 for(i=0 ; i<MAXLAYER ; i++){
234 if(m_pComLayer[i] != NULL){
235 m_pComLayer[i]->Draw(dc);
238 SetWindowOrgEx(hdc,oldWindow.x,oldWindow.y,NULL);
239 SetViewportOrgEx(hdc,oldPort.x,oldPort.y,NULL);
243 void CCanvas::DetachOwner()
245 //
\83I
\81[
\83i
\81[
\83E
\83B
\83\93\83h
\83E
\82ª
\82È
\82
\82È
\82é
\81B
249 void CCanvas::AttachOwner(HWND hParent)
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
256 STDMETHODIMP CCanvas::LoadPicture(VARIANT file, VARIANT *punkVal)
258 ::VariantInit(punkVal);
260 if(varFile.ChangeType(VT_BSTR,&file) != S_OK){
261 return DISP_E_TYPEMISMATCH;
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;
268 punkVal->vt = VT_UNKNOWN;
269 punkVal->punkVal = pPicture; // (IUnknown*)