OSDN Git Service

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