X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=OverlappedWindow.h;h=0f41abece119ee281b88c483dcb787f757b08c56;hb=HEAD;hp=128889442b7f376be06330d9d22364073b952a6f;hpb=82de408e53d9aef7ad24c955f28641eb7facb08c;p=seraphyscrtools%2FSeraphyScriptTools.git diff --git a/OverlappedWindow.h b/OverlappedWindow.h index 1288894..0f41abe 100644 --- a/OverlappedWindow.h +++ b/OverlappedWindow.h @@ -23,85 +23,109 @@ /////////////////////////////////////////////////////////////////////// // ƒhƒƒbƒv‚³‚ꂽƒtƒ@ƒCƒ‹‚Ì•ÛŽ -class dropfiledata +class CDropFileData { public: - dropfiledata() + CDropFileData() { } - ~dropfiledata(){ + + ~CDropFileData(){ Clear(); } + void Clear() { - list::iterator p = m_lstPath.begin(); + std::list::iterator p = m_lstPath.begin(); while (p != m_lstPath.end()) { - delete[] * p; + delete[] *p; p = m_lstPath.erase(p); } } - void DropFiles(HDROP hDrop) + + void SetDropFiles(HDROP hDrop) { Clear(); int count = ::DragQueryFile(hDrop, -1, NULL, 0); - int i; - for (i = 0; i < count; i++) { + for (int i = 0; i < count; i++) { DWORD sz = ::DragQueryFile(hDrop, i, NULL, 0); LPTSTR pBuf = new TCHAR[sz + 1]; ::DragQueryFile(hDrop, i, pBuf, MAX_PATH); m_lstPath.push_back(pBuf); } } - void GetPathArray(VARIANT *pvarPathName) + + HRESULT GetPathArray(VARIANT *pvarPathName) { + if (!pvarPathName) { + return E_POINTER; + } + + VariantInit(pvarPathName); if (m_lstPath.empty()) { // ‹ó‚Å‚ ‚é pvarPathName->vt = VT_EMPTY; - return; + return S_FALSE; } + SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, m_lstPath.size()); + if (!pArray) { + return E_OUTOFMEMORY; + } + VARIANT* pvars; - if (SafeArrayAccessData(pArray, (void**)&pvars) == S_OK) { - int i = 0; - list::iterator p = m_lstPath.begin(); - while (p != m_lstPath.end()) { - CComVariant wbuf(*p); - wbuf.Detach(&pvars[i]); - p++; - i++; + HRESULT hr; + if (FAILED(hr = SafeArrayAccessData(pArray, (void**)&pvars))) { + return hr; + } + int i = 0; + std::list::iterator p = m_lstPath.begin(); + while (p != m_lstPath.end()) { + CComVariant wbuf(*p); + hr = wbuf.Detach(&pvars[i]); + if (FAILED(hr)) { + break; } - SafeArrayUnaccessData(pArray); + p++; + i++; } - VariantInit(pvarPathName); + SafeArrayUnaccessData(pArray); + + if (FAILED(hr)) { + SafeArrayDestroy(pArray); + return hr; + } + pvarPathName->vt = VT_ARRAY | VT_VARIANT; pvarPathName->parray = pArray; + return S_OK; } + protected: - list m_lstPath; + std::list m_lstPath; }; ///////////////////////////////////////////////////////////////////////////// // COverlappedWindow -class CreateOverlappedWindow +struct OverlappedWindowParam { -public: - CreateOverlappedWindow() + OverlappedWindowParam() + : exstyle(0) + , showMode(0) + , noclose(false) + , frametype(true) + , captionbar(true) + , systemmenu(true) + , minbox(true) + , maxbox(true) + , autoclose(true) + , automessageloop(true) { - style = 0; - exstyle = 0; - showMode = 0; - noclose = false; - frametype = true; - captionbar = true; - systemmenu = true; - minbox = true; - maxbox = true; - autoclose = true; - automessageloop = true; ZeroMemory(szClassName, MAX_PATH); posX = posY = width = height = 0; } - DWORD GetStyle() + + DWORD ComputeStyle() { DWORD style = WS_CLIPCHILDREN | WS_OVERLAPPED; if (captionbar) { style |= WS_CAPTION; } @@ -111,6 +135,7 @@ public: if (maxbox) { style |= WS_MAXIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME; } return style; } + inline void SetWindowPlacement(int x, int y, int w, int h) { posX = x; @@ -118,13 +143,14 @@ public: width = w; height = h; } + inline void SetWindowClassName(LPCTSTR name) { StringCchCopy(szClassName, MAX_PATH, name); } + TCHAR szClassName[MAX_PATH]; DWORD wndstyle; - DWORD style; DWORD exstyle; int posX; int posY; @@ -164,7 +190,7 @@ class ATL_NO_VTABLE COverlappedWindow : public CProxy_IOverlappedWindowEvents< COverlappedWindow > { public: - COverlappedWindow(); + COverlappedWindow() {}; DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAPPEDWINDOW) @@ -231,6 +257,29 @@ public: protected: HRESULT ClassObjectInvoke(LPCWSTR handler); +public: + +#pragma region TRACEREF +#ifdef _DEBUG + /////////////////////////////// + // ŽQÆƒJƒEƒ“ƒg‚̒ǐՃfƒoƒbƒO—p + + ULONG InternalAddRef() + { + ULONG ref = CComObjectRootEx::InternalAddRef(); + ATLTRACE(_TEXT("* overlappedwindow: addref refcount=%d\n"), ref); + return ref; + } + + ULONG InternalRelease() + { + ULONG ref = CComObjectRootEx::InternalRelease(); + ATLTRACE(_TEXT("* overlappedwindow:release refcount=%d\n"), ref); + return ref; + } +#endif +#pragma endregion + // IOverlappedWindow public: STDMETHOD(GetClipboardText)(/*[out]*/VARIANT* pVarText); @@ -252,17 +301,11 @@ public: STDMETHOD(get_ExitCode)(/*[out, retval]*/ short *pVal); STDMETHOD(put_ExitCode)(/*[in]*/ short newVal); STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal); - void MoveNextOverlapped(); - void CreateWindowList(list& lstWnd, BOOL bSearchRoot); STDMETHOD(get_AutoClose)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(put_AutoClose)(/*[in]*/ BOOL newVal); STDMETHOD(DoModal)(/*[out,retval]*/VARIANT* retcode); STDMETHOD(get_AutoMessageLoop)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(put_AutoMessageLoop)(/*[in]*/ BOOL newVal); - static DWORD MessageLoop(DWORD sleeptim, int count, HWND* hWnd, HANDLE* hEvent); - void SetWaitParam(int* count, HWND* phWnd, HANDLE* phWaitHandle); - HANDLE GetEventHandle(); - void SetParent(HWND hParent); STDMETHOD(CreateChild)(/*[out,retval]*/VARIANT* pvarUnk); STDMETHOD(SetWindowStyle)(/*[in]*/VARIANT frametype,/*[in,optional]*/VARIANT caption_system,/*[in,optional]*/VARIANT maxmin,/*[out,retval]*/VARIANT* pvarUnk); STDMETHOD(SetPlacement)(/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in,optional]*/VARIANT w,/*[in,optional]*/VARIANT h,/*[out,retval]*/VARIANT* pvarUnk); @@ -278,23 +321,6 @@ public: STDMETHOD(DoEvent)(/*[out,retval]*/VARIANT* varResult); STDMETHOD(get_IsEventEmpty)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(SetTimer)(/*[in]*/VARIANT tim,/*[out,retval]*/BOOL* pVal); - - HRESULT OnDraw(ATL_DRAWINFO& di) - { - RECT& rc = *(RECT*)di.prcBounds; - Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); - - SetTextAlign(di.hdcDraw, TA_CENTER | TA_BASELINE); - LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow"); - TextOut(di.hdcDraw, - (rc.left + rc.right) / 2, - (rc.top + rc.bottom) / 2, - pszText, - lstrlen(pszText)); - - return S_OK; - } - STDMETHOD(get_Caption)(/*[out, retval]*/ BSTR *pVal); STDMETHOD(put_Caption)(/*[in]*/ BSTR newVal); STDMETHOD(get_backColor)(/*[out, retval]*/ long *pVal); @@ -338,29 +364,69 @@ public: STDMETHOD(put_TopMost)(/*[in]*/ BOOL newVal); STDMETHOD(get_DoubleBuffer)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(put_DoubleBuffer)(/*[in]*/ BOOL newVal); + +public: + void MoveNextOverlapped(); + void CreateWindowList(std::list& lstWnd, BOOL bSearchRoot); + static DWORD MessageLoop(DWORD sleeptim, int count, HWND* hWnd, HANDLE* hEvent); + void SetWaitParam(int* count, HWND* phWnd, HANDLE* phWaitHandle); + HANDLE GetEventHandle(); + void SetParent(HWND hParent); + + HRESULT OnDraw(ATL_DRAWINFO& di) + { + RECT& rc = *(RECT*)di.prcBounds; + Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); + + SetTextAlign(di.hdcDraw, TA_CENTER | TA_BASELINE); + LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow"); + TextOut(di.hdcDraw, + (rc.left + rc.right) / 2, + (rc.top + rc.bottom) / 2, + pszText, + lstrlen(pszText)); + + return S_OK; + } + +public: CComBSTR m_bstrCaption; + protected: - HWND SafeCreateWnd(); - CreateOverlappedWindow windowParam; + OverlappedWindowParam windowParam; + CComObject* m_pCanvas; + CComObject* m_pForm; + CComObject* m_pEvent; + CComObject* m_pObject; - list*> m_lstEvent; - list*> m_lstChild; - vector m_vectorObject; - dropfiledata m_dropfiles; + + std::list*> m_lstEvent; + + std::list*> m_lstChild; + + CDropFileData m_dropfiles; + CRITICAL_SECTION m_objEventDataProtection; + BOOL m_bAutoReleaseClassObject; + BOOL m_bDefaultAction; + + CComPtr m_pClassDisp; + protected: + HWND SafeCreateWnd(); static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void AddEvent(int message, WPARAM wParam, LPARAM lParam); void AddEventSingle(int message, WPARAM wParam, LPARAM lParam); void CreateThisInterface(VARIANT* pvarUnk); void SetTitle(); + void PurgeUnusedWindows(); + protected: - IDispatch* m_pClassDisp; int m_dWaitCursor; BOOL m_bQuit; int m_dModalExitCode; @@ -373,5 +439,5 @@ protected: HWND m_hPopupWnd; HWND m_hParentWnd; HICON m_hIcon; - map m_cMenuMap; + std::map m_cMenuMap; };