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++) {
35 if (IsEqualGUID(*arr[i], riid))
41 STDMETHODIMP CCanvas::get_Layer(VARIANT varLay, VARIANT *pVal)
43 //
\83\8c\83C
\83\84\81[
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\8eó
\82¯
\93n
\82µ
46 if (SUCCEEDED(vLay.ChangeType(VT_I2, &varLay))) {
49 if (!(nLayer >= 0 && nLayer < MAXLAYER) || m_pComLayer[nLayer] == NULL) {
50 return Error(IDS_ERR_LAYERBOUND);
53 IUnknown* pUnk = NULL;
54 if (SUCCEEDED(m_pComLayer[nLayer]->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
56 pVal->vt = VT_UNKNOWN;
62 /////////////////////////////////
63 //
\88ó
\8dü
\83\81\83\
\83b
\83h
\81E
\83v
\83\8d\83p
\83e
\83B
64 STDMETHODIMP CCanvas::PrintAs(VARIANT print, VARIANT* pRet)
66 CComVariant varRet, varPrint;
68 pdlg.lStructSize = sizeof(PRINTDLG);
69 pdlg.hwndOwner = m_hParent;
70 pdlg.Flags = PD_NOPAGENUMS | PD_RETURNDC;
71 if (PrintDlg(&pdlg)) {
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;
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);
88 GlobalFree(pdlg.hDevNames);
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;
97 dc.m_bPrinting = true;
108 STDMETHODIMP CCanvas::Print()
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¢
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);
120 dc.m_bPrinting = true;
127 BOOL CCanvas::PrintCore(CDC dc)
129 ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
130 //
\83v
\83\8a\83\93\83^
\82Ì
\83I
\81[
\83v
\83\93
132 dinfo.cbSize = sizeof(DOCINFO);
133 dinfo.lpszDocName = _TEXT("SeraphyScriptTools");
134 int nJob = StartDoc(dc.m_hDC, &dinfo);
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);
154 ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
158 STDMETHODIMP CCanvas::GetPrinterDefault(VARIANT name)
161 ATL::CString szPrinterName(_TEXT(""));
162 if (SUCCEEDED(varName.ChangeType(VT_BSTR, &name))) {
163 szPrinterName = varName.bstrVal;
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);
172 szPrinterName.ReleaseBuffer();
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;
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];
187 DocumentProperties(m_hParent, hp, szPrinterName.GetBuffer(),
188 m_pPrinterDeviceMode, NULL, DM_OUT_BUFFER);
191 //
\83v
\83\8a\83\93\83^
\96¼
\82Ì
\95Û
\91¶
192 StringCchCopy(m_szPrinterName, MAX_PATH, szPrinterName);
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);
201 STDMETHODIMP CCanvas::get_MarginWidth(long *pVal)
203 *pVal = m_marginWidth;
207 STDMETHODIMP CCanvas::put_MarginWidth(long newVal)
209 m_marginWidth = newVal;
213 STDMETHODIMP CCanvas::get_MarginHeight(long *pVal)
215 *pVal = m_marginHeight;
219 STDMETHODIMP CCanvas::put_MarginHeight(long newVal)
221 m_marginHeight = newVal;
225 void CCanvas::Draw(HDC hdc, RECT& rt)
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é
236 dc.m_bPrinting = false;
239 for (i = 0; i < MAXLAYER; i++) {
240 if (m_pComLayer[i] != NULL) {
241 m_pComLayer[i]->Draw(dc);
244 SetWindowOrgEx(hdc, oldWindow.x, oldWindow.y, NULL);
245 SetViewportOrgEx(hdc, oldPort.x, oldPort.y, NULL);
249 void CCanvas::DetachOwner()
251 //
\83I
\81[
\83i
\81[
\83E
\83B
\83\93\83h
\83E
\82ª
\82È
\82
\82È
\82é
\81B
255 void CCanvas::AttachOwner(HWND hParent)
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
262 STDMETHODIMP CCanvas::LoadPicture(VARIANT file, VARIANT *punkVal)
264 ::VariantInit(punkVal);
266 if (varFile.ChangeType(VT_BSTR, &file) != S_OK) {
267 return DISP_E_TYPEMISMATCH;
269 IPicture* pPicture = NULL;
270 if (OleLoadPicturePath(varFile.bstrVal, NULL, 0, NULL, IID_IPicture, (void**)&pPicture) != S_OK) {
271 return Error(IDS_ERR_PICTURELOADFAIL);
273 punkVal->vt = VT_UNKNOWN;
274 punkVal->punkVal = pPicture; // (IUnknown*)