OSDN Git Service

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