OSDN Git Service

セットアップの追加、ヘルプの修正
[seraphyscrtools/SeraphyScriptTools.git] / OverlappedWindow.h
index 1288894..0f41abe 100644 (file)
 
 ///////////////////////////////////////////////////////////////////////
 // \83h\83\8d\83b\83v\82³\82ê\82½\83t\83@\83C\83\8b\82Ì\95Û\8e\9d
-class dropfiledata
+class CDropFileData
 {
 public:
-       dropfiledata()
+       CDropFileData()
        {
        }
-       ~dropfiledata(){
+
+       ~CDropFileData(){
                Clear();
        }
+
        void Clear()
        {
-               list<LPTSTR>::iterator p = m_lstPath.begin();
+               std::list<LPTSTR>::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()) {
                        // \8bó\82Å\82 \82é
                        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<LPTSTR>::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<LPTSTR>::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<LPTSTR> m_lstPath;
+       std::list<LPTSTR> 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
+       ///////////////////////////////
+       // \8eQ\8fÆ\83J\83E\83\93\83g\82Ì\92Ç\90Õ\83f\83o\83b\83O\97p
+
+       ULONG InternalAddRef()
+       {
+               ULONG ref = CComObjectRootEx<CComSingleThreadModel>::InternalAddRef();
+               ATLTRACE(_TEXT("* overlappedwindow: addref refcount=%d\n"), ref);
+               return ref;
+       }
+
+       ULONG InternalRelease()
+       {
+               ULONG ref = CComObjectRootEx<CComSingleThreadModel>::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<HWND>& 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<HWND>& 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<CCanvas>* m_pCanvas;
+
        CComObject<CForm>* m_pForm;
+
        CComObject<CEvent>* m_pEvent;
+
        CComObject<CObjectMap>* m_pObject;
-       list<CComObject<CEvent>*> m_lstEvent;
-       list<CComObject<COverlappedWindow>*> m_lstChild;
-       vector<CComVariant> m_vectorObject;
-       dropfiledata m_dropfiles;
+
+       std::list<CComObject<CEvent>*> m_lstEvent;
+
+       std::list<CComObject<COverlappedWindow>*> m_lstChild;
+
+       CDropFileData m_dropfiles;
+
        CRITICAL_SECTION m_objEventDataProtection;
+
        BOOL m_bAutoReleaseClassObject;
+
        BOOL m_bDefaultAction;
+
+       CComPtr<IDispatch> 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<int, CComBSTR> m_cMenuMap;
+       std::map<int, CComBSTR> m_cMenuMap;
 };