OSDN Git Service

20021009版ソース
[seraphyscrtools/SeraphyScriptTools.git] / OverlappedWindow.h
1         
2 // OverlappedWindow.h : Declaration of the COverlappedWindow
3
4 #ifndef __OverlappedWindow_H_
5 #define __OverlappedWindow_H_
6
7 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
8 #include <atlctl.h>
9 #include <list>
10 #include <vector>
11 #include <map>
12 #include "seraphyscripttools.h"
13
14 #include "SeraphyScriptToolsCP.h"
15 #include "form.h"
16 #include "event.h"
17 #include "control.h"
18 #include "objectmap.h"
19
20
21 #include "draw.h"
22
23
24
25 ///////////////////////////////////////////////////////////////////////
26 // \83h\83\8d\83b\83v\82³\82ê\82½\83t\83@\83C\83\8b\82Ì\95Û\8e\9d
27 class dropfiledata
28 {
29 public:
30         dropfiledata()
31         {
32         }
33         ~dropfiledata(){
34                 Clear();
35         }
36         void Clear()
37         {
38                 list<LPSTR>::iterator p = m_lstPath.begin();
39                 while(p != m_lstPath.end()){
40                         delete (*p);
41                         p = m_lstPath.erase(p);
42                 }
43         }
44         void DropFiles(HDROP hDrop)
45         {
46                 Clear();
47                 int count = ::DragQueryFile(hDrop,-1,NULL,0);
48                 int i;
49                 for(i=0;i<count;i++){
50                         DWORD sz = ::DragQueryFile(hDrop,i,NULL,0);
51                         LPSTR pBuf = new CHAR[sz+1];
52                         ::DragQueryFile(hDrop,i,pBuf,MAX_PATH);
53                         m_lstPath.push_back(pBuf);
54                 }
55         }
56         void GetPathArray(VARIANT *pvarPathName)
57         {
58                 if(m_lstPath.empty()){
59                         // \8bó\82Å\82 \82é
60                         pvarPathName->vt = VT_EMPTY;
61                         return;
62                 }
63                 SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT,0,m_lstPath.size());
64                 VARIANT* pvars;
65                 if(SafeArrayAccessData(pArray,(void**)&pvars) == S_OK){
66                         int i = 0;
67                         list<LPSTR>::iterator p = m_lstPath.begin();
68                         while(p != m_lstPath.end()){
69                                 WCHAR wbuf[MAX_PATH];
70                                 MultiByteToWideChar(GetACP(),0,*p,-1,wbuf,MAX_PATH);
71                                 VariantInit(&pvars[i]);
72                                 pvars[i].vt = VT_BSTR;
73                                 pvars[i].bstrVal = SysAllocString(wbuf);
74                                 p++;
75                                 i++;
76                         }
77                         SafeArrayUnaccessData(pArray);
78                 }
79                 VariantInit(pvarPathName);
80                 pvarPathName->vt = VT_ARRAY | VT_VARIANT;
81                 pvarPathName->parray = pArray;
82         }
83 protected:
84         list<LPSTR> m_lstPath;
85 };
86
87 /////////////////////////////////////////////////////////////////////////////
88 // COverlappedWindow
89 class CreateOverlappedWindow
90 {
91 public:
92         CreateOverlappedWindow()
93         {
94                 style      = 0;
95                 exstyle    = 0;
96                 showMode   = 0;
97                 noclose    = false;
98                 frametype  = true;
99                 captionbar = true;
100                 systemmenu = true;
101                 minbox     = true;
102                 maxbox     = true;
103                 autoclose  = true;
104                 automessageloop = true;
105                 ZeroMemory(szClassName,MAX_PATH);
106                 posX = posY = width = height = 0;
107         }
108         DWORD GetStyle()
109         {
110                 DWORD style = WS_CLIPCHILDREN | WS_OVERLAPPED;
111                 if(captionbar){ style |= WS_CAPTION;    }
112                 if(frametype ){ style |= WS_THICKFRAME; }
113                 if(systemmenu){ style |= WS_SYSMENU|WS_CAPTION;    }
114                 if(minbox    ){ style |= WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION; }
115                 if(maxbox    ){ style |= WS_MAXIMIZEBOX|WS_SYSMENU|WS_CAPTION|WS_THICKFRAME; }
116                 return style;
117         }
118         inline void SetWindowPlacement(int x,int y,int w,int h)
119         {
120                 posX   = x;
121                 posY   = y;
122                 width  = w;
123                 height = h;
124         }
125         inline void SetWindowClassName(LPCSTR name)
126         {
127                 lstrcpy(szClassName,name);
128         }
129         CHAR szClassName[MAX_PATH];
130         DWORD wndstyle;
131         DWORD style;
132         DWORD exstyle;
133         int posX;
134         int posY;
135         int width;
136         int height;
137         int showMode;
138         BOOL noclose;
139         BOOL doublebuffer;
140         BOOL frametype;
141         BOOL captionbar;
142         BOOL systemmenu;
143         BOOL minbox;
144         BOOL maxbox;
145         BOOL automessageloop;
146         BOOL autoclose;
147 };
148
149 class ATL_NO_VTABLE COverlappedWindow : 
150         public CComObjectRootEx<CComSingleThreadModel>,
151         public CStockPropImpl<COverlappedWindow, IOverlappedWindow, &IID_IOverlappedWindow, &LIBID_SERAPHYSCRIPTTOOLSLib>,
152         public CComControl<COverlappedWindow>,
153         public IPersistStreamInitImpl<COverlappedWindow>,
154         public IOleControlImpl<COverlappedWindow>,
155         public IOleObjectImpl<COverlappedWindow>,
156         public IOleInPlaceActiveObjectImpl<COverlappedWindow>,
157         public IViewObjectExImpl<COverlappedWindow>,
158         public IOleInPlaceObjectWindowlessImpl<COverlappedWindow>,
159         public ISupportErrorInfo,
160         public IConnectionPointContainerImpl<COverlappedWindow>,
161         public IPersistStorageImpl<COverlappedWindow>,
162         public ISpecifyPropertyPagesImpl<COverlappedWindow>,
163         public IQuickActivateImpl<COverlappedWindow>,
164         public IDataObjectImpl<COverlappedWindow>,
165         public IProvideClassInfo2Impl<&CLSID_OverlappedWindow, &DIID__IOverlappedWindowEvents, &LIBID_SERAPHYSCRIPTTOOLSLib>,
166         public IPropertyNotifySinkCP<COverlappedWindow>,
167         public CComCoClass<COverlappedWindow, &CLSID_OverlappedWindow>,
168         public CProxy_IOverlappedWindowEvents< COverlappedWindow >
169 {
170 public:
171         COverlappedWindow();
172
173 DECLARE_GET_CONTROLLING_UNKNOWN()
174 DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAPPEDWINDOW)
175
176 DECLARE_PROTECT_FINAL_CONSTRUCT()
177
178 BEGIN_COM_MAP(COverlappedWindow)
179         COM_INTERFACE_ENTRY(IOverlappedWindow)
180         COM_INTERFACE_ENTRY(IDispatch)
181         COM_INTERFACE_ENTRY(IViewObjectEx)
182         COM_INTERFACE_ENTRY(IViewObject2)
183         COM_INTERFACE_ENTRY(IViewObject)
184         COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
185         COM_INTERFACE_ENTRY(IOleInPlaceObject)
186         COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
187         COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
188         COM_INTERFACE_ENTRY(IOleControl)
189         COM_INTERFACE_ENTRY(IOleObject)
190         COM_INTERFACE_ENTRY(IPersistStreamInit)
191         COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
192         COM_INTERFACE_ENTRY(ISupportErrorInfo)
193         COM_INTERFACE_ENTRY(IConnectionPointContainer)
194         COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
195         COM_INTERFACE_ENTRY(IQuickActivate)
196         COM_INTERFACE_ENTRY(IPersistStorage)
197         COM_INTERFACE_ENTRY(IDataObject)
198         COM_INTERFACE_ENTRY(IProvideClassInfo)
199         COM_INTERFACE_ENTRY(IProvideClassInfo2)
200         COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
201         COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
202 END_COM_MAP()
203
204 BEGIN_PROP_MAP(COverlappedWindow)
205         PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
206         PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
207         PROP_ENTRY("Caption", DISPID_CAPTION, CLSID_NULL)
208         // Example entries
209         // PROP_ENTRY("Property Description", dispid, clsid)
210         // PROP_PAGE(CLSID_StockColorPage)
211 END_PROP_MAP()
212
213 BEGIN_CONNECTION_POINT_MAP(COverlappedWindow)
214         CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
215         CONNECTION_POINT_ENTRY(DIID__IOverlappedWindowEvents)
216 END_CONNECTION_POINT_MAP()
217
218 BEGIN_MSG_MAP(COverlappedWindow)
219         CHAIN_MSG_MAP(CComControl<COverlappedWindow>)
220         DEFAULT_REFLECTION_HANDLER()
221 END_MSG_MAP()
222 // Handler prototypes:
223 //  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
224 //  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
225 //  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
226
227         HRESULT FinalConstruct();
228         void FinalRelease();
229         
230         CComPtr<IUnknown> m_pUnkMarshaler;
231
232 // ISupportsErrorInfo
233         STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
234         {
235                 static const IID* arr[] = 
236                 {
237                         &IID_IOverlappedWindow,
238                 };
239                 for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
240                 {
241                         if (IsEqualGUID(*arr[i], riid))
242                                 return S_OK;
243                 }
244                 return S_FALSE;
245         }
246
247 // IViewObjectEx
248         DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
249
250 // IOverlappedWindow
251 public:
252         STDMETHOD(GetClipboardText)(/*[out]*/VARIANT* pVarText);
253         STDMETHOD(SetClipboardText)(/*[in]*/BSTR text);
254         STDMETHOD(get_DefaultAction)(/*[out, retval]*/ BOOL *pVal);
255         STDMETHOD(put_DefaultAction)(/*[in]*/ BOOL newVal);
256         STDMETHOD(get_AutoReleaseClassObject)(/*[out, retval]*/ BOOL *pVal);
257         STDMETHOD(put_AutoReleaseClassObject)(/*[in]*/ BOOL newVal);
258         STDMETHOD(get_innerHeight)(/*[out, retval]*/ double *pVal);
259         STDMETHOD(get_innerWidth)(/*[out, retval]*/ double *pVal);
260         STDMETHOD(get_ClientHeight)(/*[out, retval]*/ long *pVal);
261         STDMETHOD(get_ClientWidth)(/*[out, retval]*/ long *pVal);
262         void ClassObjectInvoke(LPCWSTR handler);
263         STDMETHOD(get_ClassObject)(/*[out, retval]*/ VARIANT *pVal);
264         STDMETHOD(put_ClassObject)(/*[in]*/ VARIANT newVal);
265         STDMETHOD(CenterWindow)();
266         STDMETHOD(LoadIcon)(/*[in]*/VARIANT text);
267         STDMETHOD(get_WaitCursor)(/*[out, retval]*/ short *pVal);
268         STDMETHOD(put_WaitCursor)(/*[in]*/ short newVal);
269         STDMETHOD(get_ExitCode)(/*[out, retval]*/ short *pVal);
270         STDMETHOD(put_ExitCode)(/*[in]*/ short newVal);
271         STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal);
272         void MoveNextOverlapped();
273         void CreateWindowList(list<HWND>& lstWnd,BOOL bSearchRoot);
274         STDMETHOD(get_AutoClose)(/*[out, retval]*/ BOOL *pVal);
275         STDMETHOD(put_AutoClose)(/*[in]*/ BOOL newVal);
276         STDMETHOD(DoModal)(/*[out,retval]*/VARIANT* retcode);
277         STDMETHOD(get_AutoMessageLoop)(/*[out, retval]*/ BOOL *pVal);
278         STDMETHOD(put_AutoMessageLoop)(/*[in]*/ BOOL newVal);
279         static DWORD MessageLoop(DWORD sleeptim,int count,HWND* hWnd,HANDLE* hEvent);
280         void SetWaitParam(int* count,HWND* phWnd,HANDLE* phWaitHandle);
281         HANDLE GetEventHandle();
282         void SetParent(HWND hParent);
283         STDMETHOD(CreateChild)(/*[out,retval]*/VARIANT* pvarUnk);
284         STDMETHOD(SetWindowStyle)(/*[in]*/VARIANT frametype,/*[in,optional]*/VARIANT caption_system,/*[in,optional]*/VARIANT maxmin,/*[out,retval]*/VARIANT* pvarUnk);
285         STDMETHOD(SetPlacement)(/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in,optional]*/VARIANT w,/*[in,optional]*/VARIANT h,/*[out,retval]*/VARIANT* pvarUnk);
286         STDMETHOD(Refresh)();
287         STDMETHOD(get_WindowClassName)(/*[out, retval]*/ BSTR *pVal);
288         STDMETHOD(get_Exstyle)(/*[out, retval]*/ long *pVal);
289         STDMETHOD(put_Exstyle)(/*[in]*/ long newVal);
290         STDMETHOD(get_Style)(/*[out, retval]*/ long *pVal);
291         STDMETHOD(put_Style)(/*[in]*/ long newVal);
292         STDMETHOD(Close)();
293         STDMETHOD(Draw)();
294         STDMETHOD(Open)(/*[in]*/VARIANT caption,/*[out,retval]*/VARIANT* pvarUnk);
295         STDMETHOD(DoEvent)(/*[out,retval]*/VARIANT* varResult);
296         STDMETHOD(get_IsEventEmpty)(/*[out, retval]*/ BOOL *pVal);
297         STDMETHOD(SetTimer)(/*[in]*/VARIANT tim,/*[out,retval]*/BOOL* pVal);
298
299         HRESULT OnDraw(ATL_DRAWINFO& di)
300         {
301                 RECT& rc = *(RECT*)di.prcBounds;
302                 Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
303
304                 SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
305                 LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow");
306                 TextOut(di.hdcDraw, 
307                         (rc.left + rc.right) / 2, 
308                         (rc.top + rc.bottom) / 2, 
309                         pszText, 
310                         lstrlen(pszText));
311
312                 return S_OK;
313         }
314
315         STDMETHOD(get_Caption)(/*[out, retval]*/ BSTR *pVal);
316         STDMETHOD(put_Caption)(/*[in]*/ BSTR newVal);
317         STDMETHOD(get_backColor)(/*[out, retval]*/ long *pVal);
318         STDMETHOD(put_backColor)(/*[in]*/ long newVal);
319         STDMETHOD(get_Form)(/*[out, retval]*/ VARIANT *pVal);
320         STDMETHOD(get_Quit)(/*[out, retval]*/ BOOL *pVal);
321         STDMETHOD(put_Quit)(/*[in]*/ BOOL newVal);
322         STDMETHOD(get_DropFiles)(/*[out, retval]*/ VARIANT *pVal);
323         STDMETHOD(get_Event)(/*[out, retval]*/ VARIANT *pVal);
324         STDMETHOD(get_Canvas)(/*[out, retval]*/ VARIANT *pVal);
325         STDMETHOD(get_CreateNoCloseWindow)(/*[out, retval]*/ BOOL *pVal);
326         STDMETHOD(put_CreateNoCloseWindow)(/*[in]*/ BOOL newVal);
327         STDMETHOD(EnableMenu)(/*[in]*/VARIANT cmd,/*[in]*/VARIANT mode);
328         STDMETHOD(CheckMenu)(/*[in]*/VARIANT cmd,/*[in]*/VARIANT mode);
329         STDMETHOD(GetSysColor)(/*[in]*/VARIANT typ,/*[out,retval]*/VARIANT* col);
330         STDMETHOD(get_HWND)(/*[out, retval]*/ long *pVal);
331         STDMETHOD(TrackPopupMenu)(/*[in]*/VARIANT text,/*[in,optional]*/VARIANT cmd,/*[out,retval]*/VARIANT* pRet);
332         STDMETHOD(SetMenu)(/*[in]*/VARIANT fmt);
333         STDMETHOD(WaitEvent)(/*[in,optional]*/VARIANT varTim,/*[out,retval]*/BOOL* pRet);
334         STDMETHOD(get_Visible)(/*[out, retval]*/ BOOL *pVal);
335         STDMETHOD(put_Visible)(/*[in]*/ BOOL newVal);
336         STDMETHOD(get_Zoomed)(/*[out, retval]*/ BOOL *pVal);
337         STDMETHOD(put_Zoomed)(/*[in]*/ BOOL newVal);
338         STDMETHOD(get_Iconic)(/*[out, retval]*/ BOOL *pVal);
339         STDMETHOD(put_Iconic)(/*[in]*/ BOOL newVal);
340         STDMETHOD(get_Enable)(/*[out, retval]*/ BOOL *pVal);
341         STDMETHOD(put_Enable)(/*[in]*/ BOOL newVal);
342         STDMETHOD(SetFocus)();
343         STDMETHOD(SetForegroundWindow)();
344         STDMETHOD(get_AcceptFiles)(/*[out, retval]*/ BOOL *pVal);
345         STDMETHOD(put_AcceptFiles)(/*[in]*/ BOOL newVal);
346         STDMETHOD(get_Height)(/*[out, retval]*/ short *pVal);
347         STDMETHOD(put_Height)(/*[in]*/ short newVal);
348         STDMETHOD(get_Width)(/*[out, retval]*/ short *pVal);
349         STDMETHOD(put_Width)(/*[in]*/ short newVal);
350         STDMETHOD(get_PosY)(/*[out, retval]*/ short *pVal);
351         STDMETHOD(put_PosY)(/*[in]*/ short newVal);
352         STDMETHOD(get_PosX)(/*[out, retval]*/ short *pVal);
353         STDMETHOD(put_PosX)(/*[in]*/ short newVal);
354         STDMETHOD(get_TopMost)(/*[out, retval]*/ BOOL *pVal);
355         STDMETHOD(put_TopMost)(/*[in]*/ BOOL newVal);
356         STDMETHOD(get_DoubleBuffer)(/*[out, retval]*/ BOOL *pVal);
357         STDMETHOD(put_DoubleBuffer)(/*[in]*/ BOOL newVal);
358         CComBSTR m_bstrCaption;
359 protected:
360         HWND SafeCreateWnd();
361         CreateOverlappedWindow windowParam;
362         CComObject<CCanvas>* m_pCanvas;
363         CComObject<CForm>* m_pForm;
364         CComObject<CEvent>* m_pEvent;
365         CComObject<CObjectMap>* m_pObject;
366         list<CComObject<CEvent>*> m_lstEvent;
367         list<CComObject<COverlappedWindow>*> m_lstChild;
368         vector<CComVariant> m_vectorObject;
369         dropfiledata m_dropfiles;
370         CRITICAL_SECTION m_objEventDataProtection;
371         BOOL m_bAutoReleaseClassObject;
372         BOOL m_bDefaultAction;
373 protected:
374         static LRESULT  CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
375         void AddEvent(int message,WPARAM wParam,LPARAM lParam);
376         void AddEventSingle(int message,WPARAM wParam,LPARAM lParam);
377         void CreateThisInterface(VARIANT* pvarUnk);
378         void SetTitle();
379 protected:
380         IDispatch* m_pClassDisp;
381         int m_dWaitCursor;
382         BOOL m_bQuit;
383         int m_dModalExitCode;
384         DWORD m_dwBackColor;
385         int m_dCaptureMode;
386         HWND m_hLastFocusControl;
387         HBRUSH m_hBkBrush;
388         HMENU m_hMenu;
389         HANDLE m_hWaitEvent;
390         HWND m_hPopupWnd;
391         HWND m_hParentWnd;
392         HICON m_hIcon;
393         map<int,_bstr_t> m_cMenuMap;
394 };
395
396 #endif //__OverlappedWindow_H_