2 // OverlappedWindow.h : Declaration of the COverlappedWindow
6 #include "resource.h" //
\83\81\83C
\83\93 \83V
\83\93\83{
\83\8b
11 #include "seraphyscripttools.h"
13 #include "SeraphyScriptToolsCP.h"
17 #include "objectmap.h"
24 ///////////////////////////////////////////////////////////////////////
25 //
\83h
\83\8d\83b
\83v
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\82Ì
\95Û
\8e\9d
37 list<LPTSTR>::iterator p = m_lstPath.begin();
38 while (p != m_lstPath.end()) {
40 p = m_lstPath.erase(p);
43 void DropFiles(HDROP hDrop)
46 int count = ::DragQueryFile(hDrop, -1, NULL, 0);
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);
55 void GetPathArray(VARIANT *pvarPathName)
57 if (m_lstPath.empty()) {
59 pvarPathName->vt = VT_EMPTY;
62 SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, m_lstPath.size());
64 if (SafeArrayAccessData(pArray, (void**)&pvars) == S_OK) {
66 list<LPTSTR>::iterator p = m_lstPath.begin();
67 while (p != m_lstPath.end()) {
69 wbuf.Detach(&pvars[i]);
73 SafeArrayUnaccessData(pArray);
75 VariantInit(pvarPathName);
76 pvarPathName->vt = VT_ARRAY | VT_VARIANT;
77 pvarPathName->parray = pArray;
80 list<LPTSTR> m_lstPath;
83 /////////////////////////////////////////////////////////////////////////////
85 class CreateOverlappedWindow
88 CreateOverlappedWindow()
100 automessageloop = true;
101 ZeroMemory(szClassName, MAX_PATH);
102 posX = posY = width = height = 0;
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; }
114 inline void SetWindowPlacement(int x, int y, int w, int h)
121 inline void SetWindowClassName(LPCTSTR name)
123 StringCchCopy(szClassName, MAX_PATH, name);
125 TCHAR szClassName[MAX_PATH];
141 BOOL automessageloop;
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 >
169 DECLARE_GET_CONTROLLING_UNKNOWN()
170 DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAPPEDWINDOW)
172 DECLARE_PROTECT_FINAL_CONSTRUCT()
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)
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)
205 // PROP_ENTRY("Property Description", dispid, clsid)
206 // PROP_PAGE(CLSID_StockColorPage)
209 BEGIN_CONNECTION_POINT_MAP(COverlappedWindow)
210 CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
211 CONNECTION_POINT_ENTRY(DIID__IOverlappedWindowEvents)
212 END_CONNECTION_POINT_MAP()
214 BEGIN_MSG_MAP(COverlappedWindow)
215 CHAIN_MSG_MAP(CComControl<COverlappedWindow>)
216 DEFAULT_REFLECTION_HANDLER()
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);
223 HRESULT FinalConstruct();
226 CComPtr<IUnknown> m_pUnkMarshaler;
229 DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
232 HRESULT ClassObjectInvoke(LPCWSTR handler);
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);
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);
282 HRESULT OnDraw(ATL_DRAWINFO& di)
284 RECT& rc = *(RECT*)di.prcBounds;
285 Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
287 SetTextAlign(di.hdcDraw, TA_CENTER | TA_BASELINE);
288 LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow");
290 (rc.left + rc.right) / 2,
291 (rc.top + rc.bottom) / 2,
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;
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;
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);
363 IDispatch* m_pClassDisp;
366 int m_dModalExitCode;
369 HWND m_hLastFocusControl;
376 map<int, CComBSTR> m_cMenuMap;