///////////////////////////////////////////////////////////////////////
// \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; }
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;
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;
public CProxy_IOverlappedWindowEvents< COverlappedWindow >
{
public:
- COverlappedWindow();
+ COverlappedWindow() {};
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAPPEDWINDOW)
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);
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);
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);
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;
HWND m_hPopupWnd;
HWND m_hParentWnd;
HICON m_hIcon;
- map<int, CComBSTR> m_cMenuMap;
+ std::map<int, CComBSTR> m_cMenuMap;
};