OSDN Git Service

20021009版ソース
[seraphyscrtools/SeraphyScriptTools.git] / Layer.h
1 // Layer.h : CLayer \82Ì\90é\8c¾
2
3 #ifndef __LAYER_H_
4 #define __LAYER_H_
5
6 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
7
8 #include <list>
9 using namespace std;
10
11
12 /////////////////////////////////////////////////////////////////////////////
13 // \95`\89æ\83I\83u\83W\83F\83N\83g\83N\83\89\83X
14
15 class CDC
16 {
17 public:
18         HDC m_hDC;
19         BOOL m_bPrinting;
20         RECT m_rct;
21 };
22
23 class drawdata
24 {
25 public:
26         drawdata()
27         {
28                 HWND hWnd = GetDesktopWindow();
29                 HDC hdc = GetDC(hWnd);
30                 m_height_mm = GetDeviceCaps(hdc,VERTSIZE) * 10;
31                 m_height_px = GetDeviceCaps(hdc,VERTRES);
32                 m_width_mm  = GetDeviceCaps(hdc,HORZSIZE) * 10;
33                 m_width_px = GetDeviceCaps(hdc,HORZRES);
34                 ReleaseDC(hWnd,hdc);
35         }
36         virtual void Destroy() = 0;
37         virtual void Draw(CDC hdc) = 0;
38         void DPtoLP(CDC& dc,POINT* pt,int cnt)
39         {
40                 long offsetY = 0;
41                 if(!dc.m_bPrinting){
42                         offsetY = MulDiv(dc.m_rct.bottom,m_height_mm,m_height_px);
43                 }
44                 else{
45                         offsetY = dc.m_rct.bottom;
46                 }
47                 int i;
48                 for(i=0;i<cnt;i++){
49                         pt[i].y = offsetY - MulDiv(pt[i].y,m_height_mm,m_height_px);
50                         pt[i].x = MulDiv(pt[i].x,m_width_mm ,m_width_px );
51                 }
52         }
53 protected:
54         int m_bTextMappingMode;
55         long m_height_mm;
56         long m_height_px;
57         long m_width_mm;
58         long m_width_px;
59 };
60
61 class textdata : public drawdata
62 {
63 public:
64         textdata(long x,long y,LPCSTR text,BOOL mapmode)
65         {
66                 pBuf = new TCHAR[lstrlen(text)+1];
67                 lstrcpy(pBuf,text);
68                 m_x = x;
69                 m_y = y;
70                 m_bTextMappingMode = mapmode;
71         }
72         virtual void Destroy()
73         {
74                 delete pBuf;
75                 delete this;
76         }
77         virtual void Draw(CDC dc)
78         {
79                 POINT pt = {m_x,m_y};
80                 if(m_bTextMappingMode){
81                         SetTextAlign(dc.m_hDC,TA_TOP);
82                         DPtoLP(dc,&pt,1);
83                 }
84                 else{
85                         SetTextAlign(dc.m_hDC,TA_BASELINE);
86                 }
87                 TextOut(dc.m_hDC,pt.x,pt.y,pBuf,lstrlen(pBuf));
88         }
89 protected:
90         long m_x;
91         long m_y;
92         LPTSTR pBuf;
93 };
94
95 class textboxdata : public drawdata
96 {
97 public:
98         textboxdata(long sx,long sy,long ex,long ey,LPCSTR text,UINT fmt,BOOL mapmode)
99         {
100                 pBuf = new TCHAR[lstrlen(text)+1];
101                 lstrcpy(pBuf,text);
102                 m_box.left   = sx;
103                 m_box.top    = sy;
104                 m_box.right  = ex;
105                 m_box.bottom = ey;
106                 m_fmt = fmt;
107                 m_bTextMappingMode = mapmode;
108         }
109         virtual void Destroy()
110         {
111                 delete pBuf;
112                 delete this;
113         }
114         virtual void Draw(CDC dc)
115         {
116                 RECT box = m_box;
117                 if(m_bTextMappingMode){
118                         DPtoLP(dc,(LPPOINT)&box,2);
119                         SetTextAlign(dc.m_hDC,TA_TOP);
120                 }
121                 else{
122                         SetTextAlign(dc.m_hDC,TA_BASELINE);
123                 }
124                 DrawText(dc.m_hDC,pBuf,lstrlen(pBuf),&box,m_fmt);
125         }
126 protected:
127         UINT m_fmt;
128         RECT m_box;
129         LPTSTR pBuf;
130 };
131
132 class linedata : public drawdata
133 {
134 public:
135         linedata(long sx,long sy,long ex,long ey,BOOL mapmode)
136         {
137                 m_sx = sx;
138                 m_sy = sy;
139                 m_ex = ex;
140                 m_ey = ey;
141                 m_bTextMappingMode = mapmode;
142         }
143         virtual void Destroy()
144         {
145                 delete this;
146         }
147         virtual void Draw(CDC dc)
148         {
149                 POINT pt[2] = {{m_sx,m_sy},{m_ex,m_ey}};
150                 if(m_bTextMappingMode){
151                         DPtoLP(dc,pt,2);
152                 }
153                 MoveToEx(dc.m_hDC,pt[0].x,pt[0].y,NULL);
154                 LineTo(dc.m_hDC,pt[1].x,pt[1].y);
155         }
156 protected:
157         long m_sx;
158         long m_sy;
159         long m_ex;
160         long m_ey;
161 };
162
163 class circledata : public drawdata
164 {
165 public:
166         circledata(long sx,long sy,long radius,BOOL mapmode)
167         {
168                 m_sx = sx;
169                 m_sy = sy;
170                 m_radius = radius;
171                 m_bTextMappingMode = mapmode;
172         }
173         virtual void Destroy()
174         {
175                 delete this;
176         }
177         virtual void Draw(CDC dc)
178         {
179                 POINT pt[2]   = {{m_sx ,m_sy},{m_radius ,m_radius}};
180                 if(m_bTextMappingMode){
181                         DPtoLP(dc,pt,2);
182                 }
183                 Arc(dc.m_hDC,(pt[0].x-pt[1].x),(pt[0].y-pt[1].x),(pt[0].x+pt[1].x),(pt[0].y+pt[1].x),0,0,0,0);
184         }
185 protected:
186         long m_sx;
187         long m_sy;
188         long m_radius;
189 };
190
191 class fillcircledata : public drawdata
192 {
193 public:
194         fillcircledata(long sx,long sy,long radius,BOOL mapmode)
195         {
196                 m_sx = sx;
197                 m_sy = sy;
198                 m_radius = radius;
199                 m_bTextMappingMode = mapmode;
200         }
201         virtual void Destroy()
202         {
203                 delete this;
204         }
205         virtual void Draw(CDC dc)
206         {
207                 long mid = m_radius / 2;
208                 POINT pt[2]   = {{m_sx ,m_sy},{m_radius ,m_radius}};
209                 if(m_bTextMappingMode){
210                         DPtoLP(dc,pt,2);
211                 }
212                 Ellipse(dc.m_hDC,(pt[0].x-pt[1].x),(pt[0].y-pt[1].x),(pt[0].x+pt[1].x),(pt[0].y+pt[1].x));
213         }
214 protected:
215         long m_sx;
216         long m_sy;
217         long m_radius;
218 };
219
220 class boxdata : public drawdata
221 {
222 public:
223         boxdata(long sx,long sy,long ex,long ey,BOOL mapmode)
224         {
225                 m_sx = sx;
226                 m_sy = sy;
227                 m_ex = ex;
228                 m_ey = ey;
229                 m_bTextMappingMode = mapmode;
230         }
231         virtual void Destroy()
232         {
233                 delete this;
234         }
235         virtual void Draw(CDC dc)
236         {
237                 POINT pt[2]   = {{m_sx ,m_sy},{m_ex,m_ey}};
238                 if(m_bTextMappingMode){
239                         DPtoLP(dc,pt,2);
240                 }
241                 MoveToEx(dc.m_hDC,pt[0].x,pt[0].y,NULL);
242                 LineTo  (dc.m_hDC,pt[1].x,pt[0].y);
243                 LineTo  (dc.m_hDC,pt[1].x,pt[1].y);
244                 LineTo  (dc.m_hDC,pt[0].x,pt[1].y);
245                 LineTo  (dc.m_hDC,pt[0].x,pt[0].y);
246         }
247 protected:
248         long m_sx;
249         long m_sy;
250         long m_ex;
251         long m_ey;
252 };
253
254 class fillboxdata : public drawdata
255 {
256 public:
257         fillboxdata(long sx,long sy,long ex,long ey,BOOL mapmode)
258         {
259                 m_sx = sx;
260                 m_sy = sy;
261                 m_ex = ex;
262                 m_ey = ey;
263                 m_bTextMappingMode = mapmode;
264         }
265         virtual void Destroy()
266         {
267                 delete this;
268         }
269         virtual void Draw(CDC dc)
270         {
271                 POINT pt[2]   = {{m_sx ,m_sy},{m_ex,m_ey}};
272                 if(m_bTextMappingMode){
273                         DPtoLP(dc,pt,2);
274                 }
275                 Rectangle(dc.m_hDC,pt[0].x,pt[0].y,pt[1].x,pt[1].y);
276         }
277 protected:
278         long m_sx;
279         long m_sy;
280         long m_ex;
281         long m_ey;
282 };
283
284 class fillrboxdata : public drawdata
285 {
286 public:
287         fillrboxdata(long sx,long sy,long ex,long ey,long w,long h,BOOL mapmode)
288         {
289                 m_sx = sx;
290                 m_sy = sy;
291                 m_ex = ex;
292                 m_ey = ey;
293                 m_w  = w;
294                 m_h  = h;
295                 m_bTextMappingMode = mapmode;
296         }
297         virtual void Destroy()
298         {
299                 delete this;
300         }
301         virtual void Draw(CDC dc)
302         {
303                 POINT pt[3]   = {{m_sx ,m_sy},{m_ex,m_ey},{m_w,m_h}};
304                 if(m_bTextMappingMode){
305                         DPtoLP(dc,pt,3);
306                 }
307                 RoundRect(dc.m_hDC,pt[0].x,pt[0].y,pt[1].x,pt[1].y,pt[2].x,pt[2].y);
308         }
309 protected:
310         long m_sx;
311         long m_sy;
312         long m_ex;
313         long m_ey;
314         long m_w;
315         long m_h;
316 };
317
318 class arcdata : public drawdata
319 {
320 public:
321         arcdata(long x1,long y1,long x2,long y2,long sx,long sy,long ex,long ey,BOOL mapmode)
322         {
323                 m_x1 = x1;
324                 m_y1 = y1;
325                 m_x2 = x2;
326                 m_y2 = y2;
327                 m_sx = sx;
328                 m_sy = sy;
329                 m_ex = ex;
330                 m_ey = ey;
331                 m_bTextMappingMode = mapmode;
332         }
333         virtual void Destroy()
334         {
335                 delete this;
336         }
337         virtual void Draw(CDC dc)
338         {
339                 POINT pt[4]   = {{m_x1,m_y1},{m_x2,m_y2},{m_sx ,m_sy},{m_ex,m_ey}};
340                 if(m_bTextMappingMode){
341                         DPtoLP(dc,pt,4);
342                 }
343                 Arc(dc.m_hDC,pt[0].x,pt[0].y,pt[1].x,pt[1].y,pt[2].x,pt[2].y,pt[3].x,pt[3].y);
344         }
345 protected:
346         long m_x1;
347         long m_y1;
348         long m_x2;
349         long m_y2;
350         long m_sx;
351         long m_sy;
352         long m_ex;
353         long m_ey;
354 };
355
356 class fillarcdata : public drawdata
357 {
358 public:
359         fillarcdata(long x1,long y1,long x2,long y2,long sx,long sy,long ex,long ey,BOOL mapmode)
360         {
361                 m_x1 = x1;
362                 m_y1 = y1;
363                 m_x2 = x2;
364                 m_y2 = y2;
365                 m_sx = sx;
366                 m_sy = sy;
367                 m_ex = ex;
368                 m_ey = ey;
369                 m_bTextMappingMode = mapmode;
370         }
371         virtual void Destroy()
372         {
373                 delete this;
374         }
375         virtual void Draw(CDC dc)
376         {
377                 POINT pt[4]   = {{m_x1,m_y1},{m_x2,m_y2},{m_sx ,m_sy},{m_ex,m_ey}};
378                 if(m_bTextMappingMode){
379                         DPtoLP(dc,pt,4);
380                 }
381                 Pie(dc.m_hDC,pt[0].x,pt[0].y,pt[1].x,pt[1].y,pt[2].x,pt[2].y,pt[3].x,pt[3].y);
382         }
383 protected:
384         long m_x1;
385         long m_y1;
386         long m_x2;
387         long m_y2;
388         long m_sx;
389         long m_sy;
390         long m_ex;
391         long m_ey;
392 };
393
394 class polygondata : public drawdata
395 {
396 public:
397         polygondata(POINT* pPt,int cnt,BOOL mapmode)
398         {
399                 m_cnt = cnt;
400                 m_pPt = pPt;
401                 m_bTextMappingMode = mapmode;
402         }
403         virtual void Destroy()
404         {
405                 delete[]m_pPt;
406                 delete this;
407         }
408         virtual void Draw(CDC dc)
409         {
410                 if(m_bTextMappingMode){
411                         POINT* pt = new POINT[m_cnt];
412                         int i;
413                         for(i=0;i<m_cnt;i++){
414                                 pt[i] = m_pPt[i];
415                         }
416                         DPtoLP (dc,pt,m_cnt);
417                         Polygon(dc.m_hDC,pt,m_cnt);
418                         delete[]pt;
419                 }
420                 else{
421                         Polygon(dc.m_hDC,m_pPt,m_cnt);
422                 }
423         }
424 protected:
425         POINT* m_pPt;
426         int m_cnt;
427 };
428
429 class picturedata : public drawdata
430 {
431 public:
432         picturedata(IPicture* pPicture,long x,long y,long w,long h,BOOL mapmode)
433         {
434                 m_x = x;
435                 m_y = y;
436                 m_h = h;
437                 m_w = w;
438                 m_pPicture = pPicture;
439                 m_bTextMappingMode = mapmode;
440                 if(m_pPicture){
441                         m_pPicture->AddRef();
442                 }
443         }
444         virtual void Destroy()
445         {
446                 if(m_pPicture){
447                         m_pPicture->Release();
448                         m_pPicture = NULL;
449                 }
450         }
451         virtual void Draw(CDC dc)
452         {
453                 if(!m_pPicture){
454                         // \83r\83N\83`\83\83\81[\83C\83\93\83^\81[\83t\83F\83C\83X\82ª\82È\82¢\82È\82ç\89½\82à\82µ\82È\82¢
455                         return;
456                 }
457                 // IPicture->Render\82ÍHIMETRIC\82Ì\8dÀ\95W\82ð\95K\97v\82Æ\82·\82é\82ª\81A\83X\83N\81[\83\93\82ÍLOMETRIC\82É\82µ\82Ä\82¢\82é\82½\82ß\81B
458                 // \81i\82½\82¾\82µ\81ARender\82Í\83}\83c\83s\83\93\83O\83\82\81[\83h\82ð\95Ï\8dX\82µ\82È\82¢\82Ì\82Å\81A\97^\82¦\82é\90\94\92l\82ÍLOMETRIC\81B\81j
459                 OLE_XPOS_HIMETRIC w = 0;
460                 OLE_XPOS_HIMETRIC h = 0;
461                 m_pPicture->get_Width(&w);
462                 m_pPicture->get_Height(&h);
463
464                 if(m_bTextMappingMode){
465                         POINT pt[2] = {{m_x,m_y},{m_x+m_w,m_y+m_h}};
466                         DPtoLP(dc,pt,2);
467                         if(m_w < 0){ pt[1].x = w/10; } else { pt[1].x = labs(pt[1].x - pt[0].x); }
468                         if(m_h < 0){ pt[1].y = h/10; } else { pt[1].y = labs(pt[1].y - pt[0].y); }
469                         m_pPicture->Render(dc.m_hDC
470                                 ,(pt[0].x)
471                                 ,(pt[0].y-pt[1].y)
472                                 ,(pt[1].x)
473                                 ,(pt[1].y)
474                                 ,0,0,w,h,NULL);
475                 }
476                 else{
477                         long dw = w / 10;
478                         long dh = h / 10;
479                         if(m_w > 0) dw = m_w;
480                         if(m_h > 0) dh = m_h;
481                         m_pPicture->Render(dc.m_hDC,m_x,m_y,dw,dh,0,0,w,h,NULL);
482                 }
483         }
484 protected:
485         IPicture* m_pPicture;
486         long m_x;
487         long m_y;
488         long m_h;
489         long m_w;
490 };
491
492 /////////////////////////////////////////////////////////////////////////////
493 // CLayer
494 class ATL_NO_VTABLE CLayer : 
495         public CComObjectRootEx<CComSingleThreadModel>,
496 //      public CComCoClass<CLayer, &CLSID_Layer>,
497         public ISupportErrorInfo,
498         public IConnectionPointContainerImpl<CLayer>,
499         public IDispatchImpl<ILayer, &IID_ILayer, &LIBID_SERAPHYSCRIPTTOOLSLib>
500 {
501 public:
502         CLayer()
503         {
504                 // \95`\89æ\83f\81[\83^\81[\95Û\8cì\82Ì\83N\83\8a\83e\83B\83J\83\8b\83Z\83b\83V\83\87\83\93
505                 InitializeCriticalSection(&m_objDrawingDataProtection);
506                 // \83\8c\83C\83\84\81[\8aî\96{\83f\81[\83^\82Ì\8f\89\8aú\89»
507                 m_bVisible = true;
508                 m_dwColor = 0;
509                 m_nFontSize = 0;
510                 m_dwFillColor = 0x808080;
511                 m_dwFontColor = ::GetSysColor(COLOR_WINDOWTEXT);
512                 ZeroMemory(m_szFontName,MAX_PATH);
513                 // \83}\83b\83s\83\93\83O\83\82\81[\83h
514                 m_bTextMappingMode = 0;
515                 m_bFontTextMappingMode = 0;
516         }
517         void FinalRelease();
518
519 //DECLARE_REGISTRY_RESOURCEID(IDR_LAYER)
520
521 DECLARE_PROTECT_FINAL_CONSTRUCT()
522
523 BEGIN_COM_MAP(CLayer)
524         COM_INTERFACE_ENTRY(ILayer)
525         COM_INTERFACE_ENTRY(IDispatch)
526         COM_INTERFACE_ENTRY(ISupportErrorInfo)
527         COM_INTERFACE_ENTRY(IConnectionPointContainer)
528 END_COM_MAP()
529 BEGIN_CONNECTION_POINT_MAP(CLayer)
530 END_CONNECTION_POINT_MAP()
531
532
533 // ISupportsErrorInfo
534         STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
535
536 // ILayer
537 public:
538         long GetMappedValue(VARIANT var,long def = 0);
539         STDMETHOD(SetMappingMode)(/*[in]*/VARIANT mode);
540         STDMETHOD(Picture)(/*[in]*/VARIANT punkVal,/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in,optional]*/VARIANT w,/*[in,optional]*/VARIANT h);
541         STDMETHOD(Clear)();
542         STDMETHOD(FillArc)(/*[in]*/VARIANT x1,/*[in]*/VARIANT y1,/*[in]*/VARIANT x2,/*[in]*/VARIANT y2,/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey);
543         STDMETHOD(FillCircle)(/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in]*/VARIANT radius);
544         STDMETHOD(FillBox)(/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey);
545         STDMETHOD(Arc)(/*[in]*/VARIANT x1,/*[in]*/VARIANT y1,/*[in]*/VARIANT x2,/*[in]*/VARIANT y2,/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey);
546         STDMETHOD(Box)(/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey);
547         STDMETHOD(Line)(/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey);
548         STDMETHOD(Circle)(/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in]*/VARIANT radius);
549         STDMETHOD(Text)(/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in]*/VARIANT text);
550         STDMETHOD(Polygon)(/*[in]*/VARIANT cx,/*[in]*/VARIANT cy,/*[in]*/VARIANT arrayPt);
551         STDMETHOD(FillRBox)(/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey,/*[in]*/VARIANT w,/*[in]*/VARIANT h);
552         STDMETHOD(get_FontSize)(/*[out, retval]*/ short *pVal);
553         STDMETHOD(put_FontSize)(/*[in]*/ short newVal);
554         STDMETHOD(get_FillColor)(/*[out, retval]*/ long *pVal);
555         STDMETHOD(put_FillColor)(/*[in]*/ long newVal);
556         STDMETHOD(get_FontName)(/*[out, retval]*/ BSTR *pVal);
557         STDMETHOD(put_FontName)(/*[in]*/ BSTR newVal);
558         STDMETHOD(get_Visible)(/*[out, retval]*/ BOOL *pVal);
559         STDMETHOD(put_Visible)(/*[in]*/ BOOL newVal);
560         STDMETHOD(get_FontColor)(/*[out, retval]*/ long *pVal);
561         STDMETHOD(put_FontColor)(/*[in]*/ long newVal);
562         STDMETHOD(get_Color)(/*[out, retval]*/ long *pVal);
563         STDMETHOD(put_Color)(/*[in]*/ long newVal);
564         STDMETHOD(TextBox)(/*[in]*/VARIANT sx,/*[in]*/VARIANT sy,/*[in]*/VARIANT ex,/*[in]*/VARIANT ey,/*[in]*/VARIANT text,/*[in,optional]*/VARIANT fmt);
565         void Draw(CDC dc);
566         void AddDrawData(drawdata* pDrawData);
567 protected:
568         CRITICAL_SECTION m_objDrawingDataProtection;
569         list<drawdata*> m_lstDraw;
570         DWORD m_dwFillColor;
571         DWORD m_dwFontColor;
572         DWORD m_dwColor;
573         int m_nFontSize;
574         BOOL m_bVisible;
575         CHAR m_szFontName[MAX_PATH];
576         int m_bTextMappingMode;
577         int m_bFontTextMappingMode;
578 };
579
580 #endif //__LAYER_H_