2 // OverlappedWindow.h : Declaration of the COverlappedWindow
4 #ifndef __OverlappedWindow_H_
5 #define __OverlappedWindow_H_
7 #include "resource.h" //
\83\81\83C
\83\93 \83V
\83\93\83{
\83\8b
12 #include "seraphyscripttools.h"
14 #include "SeraphyScriptToolsCP.h"
18 #include "objectmap.h"
25 ///////////////////////////////////////////////////////////////////////
26 //
\83h
\83\8d\83b
\83v
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\82Ì
\95Û
\8e\9d
38 list<LPTSTR>::iterator p = m_lstPath.begin();
39 while(p != m_lstPath.end()){
41 p = m_lstPath.erase(p);
44 void DropFiles(HDROP hDrop)
47 int count = ::DragQueryFile(hDrop,-1,NULL,0);
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);
56 void GetPathArray(VARIANT *pvarPathName)
58 if(m_lstPath.empty()){
60 pvarPathName->vt = VT_EMPTY;
63 SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT,0,m_lstPath.size());
65 if(SafeArrayAccessData(pArray,(void**)&pvars) == S_OK){
67 list<LPTSTR>::iterator p = m_lstPath.begin();
68 while(p != m_lstPath.end()){
70 wbuf.Detach(&pvars[i]);
74 SafeArrayUnaccessData(pArray);
76 VariantInit(pvarPathName);
77 pvarPathName->vt = VT_ARRAY | VT_VARIANT;
78 pvarPathName->parray = pArray;
81 list<LPTSTR> m_lstPath;
84 /////////////////////////////////////////////////////////////////////////////
86 class CreateOverlappedWindow
89 CreateOverlappedWindow()
101 automessageloop = true;
102 ZeroMemory(szClassName,MAX_PATH);
103 posX = posY = width = height = 0;
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; }
115 inline void SetWindowPlacement(int x,int y,int w,int h)
122 inline void SetWindowClassName(LPCTSTR name)
124 lstrcpy(szClassName,name);
126 TCHAR szClassName[MAX_PATH];
142 BOOL automessageloop;
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 >
170 DECLARE_GET_CONTROLLING_UNKNOWN()
171 DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAPPEDWINDOW)
173 DECLARE_PROTECT_FINAL_CONSTRUCT()
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)
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)
206 // PROP_ENTRY("Property Description", dispid, clsid)
207 // PROP_PAGE(CLSID_StockColorPage)
210 BEGIN_CONNECTION_POINT_MAP(COverlappedWindow)
211 CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
212 CONNECTION_POINT_ENTRY(DIID__IOverlappedWindowEvents)
213 END_CONNECTION_POINT_MAP()
215 BEGIN_MSG_MAP(COverlappedWindow)
216 CHAIN_MSG_MAP(CComControl<COverlappedWindow>)
217 DEFAULT_REFLECTION_HANDLER()
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);
224 HRESULT FinalConstruct();
227 CComPtr<IUnknown> m_pUnkMarshaler;
229 // ISupportsErrorInfo
230 STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
232 static const IID* arr[] =
234 &IID_IOverlappedWindow,
236 for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
238 if (IsEqualGUID(*arr[i], riid))
245 DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
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);
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);
296 HRESULT OnDraw(ATL_DRAWINFO& di)
298 RECT& rc = *(RECT*)di.prcBounds;
299 Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
301 SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
302 LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow");
304 (rc.left + rc.right) / 2,
305 (rc.top + rc.bottom) / 2,
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;
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;
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);
377 IDispatch* m_pClassDisp;
380 int m_dModalExitCode;
383 HWND m_hLastFocusControl;
390 map<int, CComBSTR> m_cMenuMap;
393 #endif //__OverlappedWindow_H_