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 HRESULT CCanvas::FinalConstruct()
12 //
\94h
\90¶
\8c³
\8aÖ
\98A
16 m_pPrinterDeviceMode = NULL;
17 m_marginWidth = 150; // 1.5Cm
\82Ì
\83}
\81[
\83W
\83\93
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;
24 for (int i = 0; i < MAXLAYER; i++) {
25 HRESULT hr = CComObject<CLayer>::CreateInstance(&m_pComLayer[i]);
29 m_pComLayer[i]->AddRef();
35 void CCanvas::FinalRelease()
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;
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;
53 STDMETHODIMP CCanvas::get_Layer(VARIANT varLay, VARIANT *pVal)
55 //
\83\8c\83C
\83\84\81[
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\8eó
\82¯
\93n
\82µ
58 if (SUCCEEDED(vLay.ChangeType(VT_I2, &varLay))) {
61 if (!(nLayer >= 0 && nLayer < MAXLAYER) || m_pComLayer[nLayer] == NULL) {
62 return Error(IDS_ERR_LAYERBOUND);
65 IUnknown* pUnk = NULL;
66 if (SUCCEEDED(m_pComLayer[nLayer]->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
68 pVal->vt = VT_UNKNOWN;
74 /////////////////////////////////
75 //
\88ó
\8dü
\83\81\83\
\83b
\83h
\81E
\83v
\83\8d\83p
\83e
\83B
76 STDMETHODIMP CCanvas::PrintAs(VARIANT print, VARIANT* pRet)
78 CComVariant varRet, varPrint;
80 pdlg.lStructSize = sizeof(PRINTDLG);
81 pdlg.hwndOwner = m_hParent;
82 pdlg.Flags = PD_NOPAGENUMS | PD_RETURNDC;
83 if (PrintDlg(&pdlg)) {
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;
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);
100 GlobalFree(pdlg.hDevNames);
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;
109 dc.m_bPrinting = true;
120 STDMETHODIMP CCanvas::Print()
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¢
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);
132 dc.m_bPrinting = true;
139 BOOL CCanvas::PrintCore(CDC dc)
141 ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
142 //
\83v
\83\8a\83\93\83^
\82Ì
\83I
\81[
\83v
\83\93
144 dinfo.cbSize = sizeof(DOCINFO);
145 dinfo.lpszDocName = _TEXT("SeraphyScriptTools");
146 int nJob = StartDoc(dc.m_hDC, &dinfo);
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);
166 ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
170 STDMETHODIMP CCanvas::GetPrinterDefault(VARIANT name)
173 ATL::CString szPrinterName(_TEXT(""));
174 if (SUCCEEDED(varName.ChangeType(VT_BSTR, &name))) {
175 szPrinterName = varName.bstrVal;
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);
184 szPrinterName.ReleaseBuffer();
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;
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];
199 DocumentProperties(m_hParent, hp, szPrinterName.GetBuffer(),
200 m_pPrinterDeviceMode, NULL, DM_OUT_BUFFER);
203 //
\83v
\83\8a\83\93\83^
\96¼
\82Ì
\95Û
\91¶
204 StringCchCopy(m_szPrinterName, MAX_PATH, szPrinterName);
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);
213 STDMETHODIMP CCanvas::get_MarginWidth(long *pVal)
215 *pVal = m_marginWidth;
219 STDMETHODIMP CCanvas::put_MarginWidth(long newVal)
221 m_marginWidth = newVal;
225 STDMETHODIMP CCanvas::get_MarginHeight(long *pVal)
227 *pVal = m_marginHeight;
231 STDMETHODIMP CCanvas::put_MarginHeight(long newVal)
233 m_marginHeight = newVal;
237 void CCanvas::Draw(HDC hdc, RECT& rt)
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é
248 dc.m_bPrinting = false;
251 for (i = 0; i < MAXLAYER; i++) {
252 if (m_pComLayer[i] != NULL) {
253 m_pComLayer[i]->Draw(dc);
256 SetWindowOrgEx(hdc, oldWindow.x, oldWindow.y, NULL);
257 SetViewportOrgEx(hdc, oldPort.x, oldPort.y, NULL);
261 void CCanvas::DetachOwner()
263 //
\83I
\81[
\83i
\81[
\83E
\83B
\83\93\83h
\83E
\82ª
\82È
\82
\82È
\82é
\81B
267 void CCanvas::AttachOwner(HWND hParent)
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
274 STDMETHODIMP CCanvas::LoadPicture(VARIANT file, VARIANT *punkVal)
276 ::VariantInit(punkVal);
278 if (varFile.ChangeType(VT_BSTR, &file) != S_OK) {
279 return DISP_E_TYPEMISMATCH;
281 IPicture* pPicture = NULL;
282 if (OleLoadPicturePath(varFile.bstrVal, NULL, 0, NULL, IID_IPicture, (void**)&pPicture) != S_OK) {
283 return Error(IDS_ERR_PICTURELOADFAIL);
285 punkVal->vt = VT_UNKNOWN;
286 punkVal->punkVal = pPicture; // (IUnknown*)