SeraphyScriptTools v1.1以降のソースコード管理
Revision | f0185382cb749542135c2d49145b95c97ff769d3 (tree) |
---|---|
Time | 2015-08-19 06:30:04 |
Author | seraphy <seraphy@sera...> |
Commiter | seraphy |
ObjectMap, ObjectVectorの値をByRef外しするようにした。他、ソースコード整形
@@ -2,6 +2,7 @@ | ||
2 | 2 | #include "stdafx.h" |
3 | 3 | #include "SeraphyScriptTools.h" |
4 | 4 | #include "ObjectMap.h" |
5 | +#include "generic.h" | |
5 | 6 | #include "profilesection.h" |
6 | 7 | #include "CComEnumDynaVARIANT.h" |
7 | 8 |
@@ -85,14 +86,20 @@ STDMETHODIMP CObjectMap::put_Value(VARIANT key, VARIANT newVal) | ||
85 | 86 | return hr; |
86 | 87 | } |
87 | 88 | |
89 | + // ByRefをByValに変換コピーする | |
90 | + CComVariant tmp; | |
91 | + if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) { | |
92 | + return hr; | |
93 | + } | |
94 | + | |
88 | 95 | VariantMap::iterator p = m_mapVariant.find(varName.bstrVal); |
89 | 96 | if (p != m_mapVariant.end()) { |
90 | 97 | // 既存 |
91 | - p->second = newVal; | |
98 | + p->second = tmp; | |
92 | 99 | } |
93 | 100 | else { |
94 | 101 | // 新規 |
95 | - m_mapVariant.insert(std::make_pair(varName.bstrVal, newVal)); | |
102 | + m_mapVariant.insert(std::make_pair(varName.bstrVal, tmp)); | |
96 | 103 | } |
97 | 104 | return S_OK; |
98 | 105 | } |
@@ -366,7 +373,7 @@ STDMETHODIMP CObjectMap::LoadProfile(IUnknown *punkVal) | ||
366 | 373 | long idx = 0; |
367 | 374 | while (idx <= mx) { |
368 | 375 | CComVariant varKey, varVal; |
369 | - if (SafeArrayGetElement(varArray.parray, &idx, &varKey) == S_OK) { | |
376 | + if (SUCCEEDED(SafeArrayGetElement(varArray.parray, &idx, &varKey))) { | |
370 | 377 | if (SUCCEEDED(pSection->get_Value(varKey, &varVal))) { |
371 | 378 | put_Value(varKey, varVal); |
372 | 379 | } |
@@ -21,7 +21,11 @@ STDMETHODIMP CObjectVector::CreateVector(IUnknown **punkVal) | ||
21 | 21 | return hr; |
22 | 22 | } |
23 | 23 | |
24 | - return pVct->QueryInterface(punkVal); | |
24 | + if (FAILED(hr = pVct->QueryInterface(punkVal))) { | |
25 | + delete pVct; | |
26 | + return hr; | |
27 | + } | |
28 | + return S_OK; | |
25 | 29 | } |
26 | 30 | |
27 | 31 | STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal) |
@@ -37,6 +41,7 @@ STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **pun | ||
37 | 41 | return hr; |
38 | 42 | } |
39 | 43 | if (FAILED(hr = pVct->QueryInterface(punkVal))) { |
44 | + delete pVct; | |
40 | 45 | return hr; |
41 | 46 | } |
42 | 47 |
@@ -111,8 +116,15 @@ STDMETHODIMP CObjectVector::Erase(VARIANT idx, VARIANT count) | ||
111 | 116 | |
112 | 117 | STDMETHODIMP CObjectVector::Push(VARIANT newVal) |
113 | 118 | { |
119 | + HRESULT hr; | |
120 | + | |
121 | + CComVariant tmp; | |
122 | + if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) { | |
123 | + return hr; | |
124 | + } | |
125 | + | |
114 | 126 | // 末尾に追加 |
115 | - m_vctVariant.push_back(newVal); | |
127 | + m_vctVariant.push_back(tmp); | |
116 | 128 | return S_OK; |
117 | 129 | } |
118 | 130 |
@@ -143,7 +155,14 @@ STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal) | ||
143 | 155 | return DISP_E_BADINDEX; |
144 | 156 | } |
145 | 157 | |
146 | - m_vctVariant.insert(m_vctVariant.begin() + nIdx, newVal); | |
158 | + HRESULT hr; | |
159 | + | |
160 | + CComVariant tmp; | |
161 | + if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) { | |
162 | + return hr; | |
163 | + } | |
164 | + | |
165 | + m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp); | |
147 | 166 | return S_OK; |
148 | 167 | } |
149 | 168 |
@@ -164,9 +183,9 @@ STDMETHODIMP CObjectVector::get_Value(VARIANT idx, VARIANT *pVal) | ||
164 | 183 | long mx = m_vctVariant.size(); |
165 | 184 | if (nIdx < mx) { |
166 | 185 | // ベクターの範囲内なら値を取得する |
167 | - ::VariantCopy(pVal, &m_vctVariant[nIdx]); | |
186 | + return ::VariantCopy(pVal, &m_vctVariant[nIdx]); | |
168 | 187 | } |
169 | - return S_OK; | |
188 | + return S_FALSE; | |
170 | 189 | } |
171 | 190 | |
172 | 191 | STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal) |
@@ -190,10 +209,20 @@ STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal) | ||
190 | 209 | mx++; |
191 | 210 | } |
192 | 211 | } |
212 | + | |
213 | + HRESULT hr; | |
214 | + | |
215 | + CComVariant tmp; | |
216 | + if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) { | |
217 | + return hr; | |
218 | + } | |
219 | + | |
193 | 220 | // ベクターの範囲内なら値を再設定する |
194 | - ::VariantClear(&m_vctVariant.at(nIdx)); | |
195 | - ::VariantCopy(&m_vctVariant.at(nIdx), &newVal); | |
196 | - return S_OK; | |
221 | + if (FAILED(hr = ::VariantClear(&m_vctVariant.at(nIdx)))) { | |
222 | + return hr; | |
223 | + } | |
224 | + | |
225 | + return ::VariantCopy(&m_vctVariant.at(nIdx), &tmp); | |
197 | 226 | } |
198 | 227 | |
199 | 228 | STDMETHODIMP CObjectVector::get_Count(long *pVal) |
@@ -216,17 +245,20 @@ STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal) | ||
216 | 245 | |
217 | 246 | STDMETHODIMP CObjectVector::Merge(VARIANT unkVal) |
218 | 247 | { |
219 | - HRESULT ret = DISP_E_TYPEMISMATCH; | |
248 | + HRESULT hr; | |
249 | + | |
220 | 250 | CComVariant varUnk; |
221 | 251 | if (SUCCEEDED(varUnk.ChangeType(VT_UNKNOWN, &unkVal))) { |
222 | 252 | // インターフェイスの場合 |
223 | - IObjectVector* pVect = NULL; | |
224 | - if (SUCCEEDED(varUnk.punkVal->QueryInterface(IID_IObjectVector, (void**)&pVect))) { | |
253 | + CComPtr<IObjectVector> pVect; | |
254 | + if (FAILED(hr = varUnk.punkVal->QueryInterface(&pVect))) { | |
225 | 255 | // 指定外のインターフェイスである |
226 | - return DISP_E_TYPEMISMATCH; | |
256 | + return hr; | |
227 | 257 | } |
258 | + | |
228 | 259 | long mx; |
229 | 260 | pVect->get_Count(&mx); |
261 | + | |
230 | 262 | long i; |
231 | 263 | for (i = 0; i < mx; i++) { |
232 | 264 | CComVariant idx((long)i); |
@@ -235,51 +267,60 @@ STDMETHODIMP CObjectVector::Merge(VARIANT unkVal) | ||
235 | 267 | pVect->get_Value(idx, &ret); |
236 | 268 | m_vctVariant.push_back(ret); |
237 | 269 | } |
238 | - pVect->Release(); | |
239 | - ret = S_OK; | |
240 | - } | |
241 | - else { | |
242 | - VARTYPE vt = VT_EMPTY; | |
243 | - SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt); | |
244 | - if (pArray && vt == VT_VARIANT) { | |
245 | - long lb = 0; | |
246 | - long ub = 0; | |
247 | - int dm = SafeArrayGetDim(pArray); | |
248 | - SafeArrayGetLBound(pArray, 1, &lb); // 左側の添え字 | |
249 | - SafeArrayGetUBound(pArray, 1, &ub); | |
250 | - if (dm == 1 && lb == 0 && vt == VT_VARIANT) { | |
251 | - // 1次元配列で、0ベースのバリアント配列である | |
252 | - int cnt; | |
253 | - long dim[1]; | |
254 | - for (cnt = 0; cnt <= ub; cnt++) { | |
255 | - // VARIANTの配列である | |
256 | - VARIANT tmp; | |
257 | - ::VariantInit(&tmp); | |
258 | - dim[0] = cnt; | |
259 | - SafeArrayGetElement(pArray, dim, &tmp); | |
260 | - m_vctVariant.push_back(tmp); | |
261 | - }//next(配列のループ) | |
262 | - ret = S_OK; | |
263 | - } | |
264 | - } | |
270 | + pVect.Release(); | |
271 | + return S_OK; | |
265 | 272 | } |
266 | - return ret; | |
267 | -} | |
268 | 273 | |
274 | + VARTYPE vt = VT_EMPTY; | |
275 | + SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt); | |
276 | + if (!pArray || vt != VT_VARIANT) { | |
277 | + return S_FALSE; | |
278 | + } | |
279 | + | |
280 | + long lb = 0; | |
281 | + long ub = 0; | |
282 | + int dm = SafeArrayGetDim(pArray); | |
283 | + SafeArrayGetLBound(pArray, 1, &lb); // 左側の添え字 | |
284 | + SafeArrayGetUBound(pArray, 1, &ub); | |
285 | + if (dm == 1 && lb == 0 && vt == VT_VARIANT) { | |
286 | + // 1次元配列で、0ベースのバリアント配列である | |
287 | + int cnt; | |
288 | + long dim[1]; | |
289 | + for (cnt = 0; cnt <= ub; cnt++) { | |
290 | + // VARIANTの配列である | |
291 | + VARIANT tmp; | |
292 | + ::VariantInit(&tmp); | |
293 | + dim[0] = cnt; | |
294 | + SafeArrayGetElement(pArray, dim, &tmp); | |
295 | + m_vctVariant.push_back(tmp); | |
296 | + }//next(配列のループ) | |
297 | + } | |
298 | + return S_OK; | |
299 | +} | |
269 | 300 | |
270 | 301 | STDMETHODIMP CObjectVector::MakeArray(VARIANT *pVal) |
271 | 302 | { |
272 | 303 | long mx = m_vctVariant.size(); |
273 | 304 | SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, mx); |
305 | + if (!pArray) { | |
306 | + return E_OUTOFMEMORY; | |
307 | + } | |
308 | + | |
309 | + HRESULT hr; | |
310 | + | |
274 | 311 | VARIANT* pvars; |
275 | - if (SUCCEEDED(SafeArrayAccessData(pArray, (void**)&pvars))) { | |
276 | - long cnt = 0; | |
277 | - for (cnt = 0; cnt < mx; cnt++) { | |
278 | - VariantInit(&pvars[cnt]); | |
279 | - VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt)); | |
280 | - } | |
281 | - SafeArrayUnaccessData(pArray); | |
312 | + if (FAILED(hr = SafeArrayAccessData(pArray, (void**)&pvars))) { | |
313 | + SafeArrayDestroy(pArray); | |
314 | + return hr; | |
282 | 315 | } |
316 | + | |
317 | + long cnt = 0; | |
318 | + for (cnt = 0; cnt < mx; cnt++) { | |
319 | + VariantInit(&pvars[cnt]); | |
320 | + VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt)); | |
321 | + } | |
322 | + SafeArrayUnaccessData(pArray); | |
323 | + | |
283 | 324 | pArray->fFeatures |= FADF_HAVEVARTYPE; |
284 | 325 | pVal->vt = VT_ARRAY | VT_VARIANT; |
285 | 326 | pVal->parray = pArray; |
@@ -18,7 +18,7 @@ class ATL_NO_VTABLE CObjectVector : | ||
18 | 18 | public: |
19 | 19 | CObjectVector() |
20 | 20 | { |
21 | - m_vctVariant.reserve(100); // 初期状態で100のバッファを確保する | |
21 | + m_vctVariant.reserve(256); // 初期状態で256のバッファを確保する | |
22 | 22 | } |
23 | 23 | void FinalRelease() |
24 | 24 | { |
@@ -66,7 +66,7 @@ HRESULT COverlappedWindow::FinalConstruct() | ||
66 | 66 | } |
67 | 67 | m_pForm->AddRef(); |
68 | 68 | m_pForm->SetWindowSize(windowParam.width, windowParam.height, |
69 | - windowParam.GetStyle(), windowParam.exstyle); | |
69 | + windowParam.ComputeStyle(), windowParam.exstyle); | |
70 | 70 | |
71 | 71 | // 描画オブジェクトの生成 |
72 | 72 | m_pCanvas = NULL; |
@@ -98,8 +98,7 @@ void COverlappedWindow::FinalRelease() | ||
98 | 98 | |
99 | 99 | // クラスオブジェクトの放棄 |
100 | 100 | if (m_pClassDisp) { |
101 | - m_pClassDisp->Release(); | |
102 | - m_pClassDisp = NULL; | |
101 | + m_pClassDisp.Release(); | |
103 | 102 | } |
104 | 103 | |
105 | 104 | // アイコンの破棄 |
@@ -225,7 +224,7 @@ HWND COverlappedWindow::SafeCreateWnd() | ||
225 | 224 | windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; |
226 | 225 | } |
227 | 226 | |
228 | - WNDCLASSEX wcex = {0}; | |
227 | + WNDCLASSEX wcex = { 0 }; | |
229 | 228 | wcex.cbSize = sizeof(WNDCLASSEX); |
230 | 229 | wcex.lpfnWndProc = (WNDPROC)WindowProc; |
231 | 230 | wcex.cbClsExtra = 0; |
@@ -244,7 +243,7 @@ HWND COverlappedWindow::SafeCreateWnd() | ||
244 | 243 | WS_EX_CONTROLPARENT, |
245 | 244 | windowParam.szClassName, |
246 | 245 | _TEXT(""), // ダミー |
247 | - windowParam.GetStyle(), | |
246 | + windowParam.ComputeStyle(), | |
248 | 247 | CW_USEDEFAULT, |
249 | 248 | CW_USEDEFAULT, |
250 | 249 | windowParam.width, |
@@ -254,13 +253,13 @@ HWND COverlappedWindow::SafeCreateWnd() | ||
254 | 253 | ::SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) this); // クラスと関連付ける |
255 | 254 | m_hPopupWnd = hWnd; |
256 | 255 | // ウィンドウスタイルの再設定 |
257 | - ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.GetStyle()); | |
256 | + ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.ComputeStyle()); | |
258 | 257 | Refresh(); |
259 | 258 | |
260 | 259 | // システムメニューにフレーム移動メニューをつける |
261 | 260 | HMENU hMenu = ::GetSystemMenu(m_hPopupWnd, false); |
262 | 261 | int cnt = ::GetMenuItemCount(hMenu); |
263 | - MENUITEMINFO minfo = {0}; | |
262 | + MENUITEMINFO minfo = { 0 }; | |
264 | 263 | minfo.cbSize = sizeof(MENUITEMINFO); |
265 | 264 | minfo.fMask = MIIM_TYPE | MIIM_ID; |
266 | 265 | minfo.fType = MFT_STRING; |
@@ -293,327 +292,325 @@ LRESULT CALLBACK COverlappedWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wPar | ||
293 | 292 | } |
294 | 293 | |
295 | 294 | switch (uMsg) { |
296 | - case WM_MOVENEXT_OVERLAPPED: | |
297 | - { | |
298 | - me->MoveNextOverlapped(); | |
299 | - return 0; | |
295 | + case WM_MOVENEXT_OVERLAPPED: | |
296 | + { | |
297 | + me->MoveNextOverlapped(); | |
298 | + return 0; | |
299 | + } | |
300 | + case WM_CREATE: | |
301 | + { | |
302 | + // ディフォルトの動作を行う | |
303 | + break; | |
304 | + } | |
305 | + case WM_PAINT: | |
306 | + { | |
307 | + PAINTSTRUCT ps; | |
308 | + RECT rt; | |
309 | + ::GetClientRect(hWnd, &rt); | |
310 | + HDC hdc = ::BeginPaint(hWnd, &ps); | |
311 | + HDC hdc2 = hdc; | |
312 | + HBITMAP bmp; | |
313 | + BOOL bDblBuf = me->windowParam.doublebuffer; | |
314 | + if (bDblBuf) { | |
315 | + // ちらつきを無くするためにバブルバッファ風にするか? | |
316 | + hdc2 = ::CreateCompatibleDC(NULL); | |
317 | + bmp = ::CreateCompatibleBitmap(hdc, rt.right, rt.bottom); | |
318 | + ::SelectObject(hdc2, bmp); | |
300 | 319 | } |
301 | - case WM_CREATE: | |
302 | - { | |
303 | - // ディフォルトの動作を行う | |
304 | - break; | |
320 | + // 背景を塗りつぶす | |
321 | + ::SetBkColor(hdc2, COLORREF(me->m_dwBackColor)); | |
322 | + ::SetBkMode(hdc2, TRANSPARENT); | |
323 | + ::SetPolyFillMode(hdc2, ALTERNATE); | |
324 | + FillRect(hdc2, &rt, me->m_hBkBrush); | |
325 | + | |
326 | + // ドローイングデーターの描画 | |
327 | + if (me->m_pCanvas) { | |
328 | + me->m_pCanvas->Draw(hdc2, rt); | |
305 | 329 | } |
306 | - case WM_PAINT: | |
307 | - { | |
308 | - PAINTSTRUCT ps; | |
309 | - RECT rt; | |
310 | - ::GetClientRect(hWnd, &rt); | |
311 | - HDC hdc = ::BeginPaint(hWnd, &ps); | |
312 | - HDC hdc2 = hdc; | |
313 | - HBITMAP bmp; | |
314 | - BOOL bDblBuf = me->windowParam.doublebuffer; | |
315 | - if (bDblBuf) { | |
316 | - // ちらつきを無くするためにバブルバッファ風にするか? | |
317 | - hdc2 = ::CreateCompatibleDC(NULL); | |
318 | - bmp = ::CreateCompatibleBitmap(hdc, rt.right, rt.bottom); | |
319 | - ::SelectObject(hdc2, bmp); | |
320 | - } | |
321 | - // 背景を塗りつぶす | |
322 | - ::SetBkColor(hdc2, COLORREF(me->m_dwBackColor)); | |
323 | - ::SetBkMode(hdc2, TRANSPARENT); | |
324 | - ::SetPolyFillMode(hdc2, ALTERNATE); | |
325 | - FillRect(hdc2, &rt, me->m_hBkBrush); | |
326 | - | |
327 | - // ドローイングデーターの描画 | |
328 | - if (me->m_pCanvas) { | |
329 | - me->m_pCanvas->Draw(hdc2, rt); | |
330 | - } | |
331 | 330 | |
332 | - if (bDblBuf) { | |
333 | - // ダブルバッファの転送 | |
334 | - ::BitBlt(hdc, 0, 0, rt.right, rt.bottom, hdc2, 0, 0, SRCCOPY); | |
335 | - DeleteDC(hdc2); | |
336 | - DeleteObject(bmp); | |
337 | - } | |
338 | - ::EndPaint(hWnd, &ps); | |
339 | - break; | |
331 | + if (bDblBuf) { | |
332 | + // ダブルバッファの転送 | |
333 | + ::BitBlt(hdc, 0, 0, rt.right, rt.bottom, hdc2, 0, 0, SRCCOPY); | |
334 | + DeleteDC(hdc2); | |
335 | + DeleteObject(bmp); | |
340 | 336 | } |
341 | - case WM_SYSCOMMAND: | |
342 | - { | |
343 | - if (wParam == SC_CLOSE) { | |
344 | - if (me->windowParam.autoclose) { | |
345 | - me->Close(); | |
346 | - } | |
347 | - me->m_bQuit = true; | |
348 | - me->m_dModalExitCode = IDABORT; | |
349 | - me->AddEventSingle(WM_COMMAND, IDABORT, 0); | |
350 | - return false; | |
337 | + ::EndPaint(hWnd, &ps); | |
338 | + break; | |
339 | + } | |
340 | + case WM_SYSCOMMAND: | |
341 | + { | |
342 | + if (wParam == SC_CLOSE) { | |
343 | + if (me->windowParam.autoclose) { | |
344 | + me->Close(); | |
351 | 345 | } |
352 | - else if (wParam == WM_MOVENEXT_OVERLAPPED) { | |
353 | - SendMessage(hWnd, WM_MOVENEXT_OVERLAPPED, 0, 0); | |
354 | - return 0; | |
355 | - } | |
356 | - break; | |
346 | + me->m_bQuit = true; | |
347 | + me->m_dModalExitCode = IDABORT; | |
348 | + me->AddEventSingle(WM_COMMAND, IDABORT, 0); | |
349 | + return false; | |
357 | 350 | } |
358 | - case WM_MOUSEMOVE: | |
359 | - { | |
360 | - me->AddEventSingle(WM_MOUSEMOVE, 0, 0); | |
361 | - break; | |
351 | + else if (wParam == WM_MOVENEXT_OVERLAPPED) { | |
352 | + SendMessage(hWnd, WM_MOVENEXT_OVERLAPPED, 0, 0); | |
353 | + return 0; | |
362 | 354 | } |
363 | - case WM_LBUTTONDBLCLK: | |
364 | - { | |
365 | - me->AddEvent(WM_LBUTTONDBLCLK, 0, 0); | |
366 | - break; | |
355 | + break; | |
356 | + } | |
357 | + case WM_MOUSEMOVE: | |
358 | + { | |
359 | + me->AddEventSingle(WM_MOUSEMOVE, 0, 0); | |
360 | + break; | |
361 | + } | |
362 | + case WM_LBUTTONDBLCLK: | |
363 | + { | |
364 | + me->AddEvent(WM_LBUTTONDBLCLK, 0, 0); | |
365 | + break; | |
366 | + } | |
367 | + case WM_RBUTTONDBLCLK: | |
368 | + { | |
369 | + me->AddEvent(WM_RBUTTONDBLCLK, 0, 0); | |
370 | + break; | |
371 | + } | |
372 | + case WM_LBUTTONDOWN: | |
373 | + { | |
374 | + if (me->m_dCaptureMode == 0) { | |
375 | + me->AddEvent(WM_LBUTTONDOWN, 0, 0); | |
376 | + ::SetCapture(hWnd); | |
377 | + me->m_dCaptureMode |= 0x01; | |
367 | 378 | } |
368 | - case WM_RBUTTONDBLCLK: | |
369 | - { | |
370 | - me->AddEvent(WM_RBUTTONDBLCLK, 0, 0); | |
371 | - break; | |
379 | + else { | |
380 | + ReleaseCapture(); | |
372 | 381 | } |
373 | - case WM_LBUTTONDOWN: | |
374 | - { | |
375 | - if (me->m_dCaptureMode == 0) { | |
376 | - me->AddEvent(WM_LBUTTONDOWN, 0, 0); | |
377 | - ::SetCapture(hWnd); | |
378 | - me->m_dCaptureMode |= 0x01; | |
379 | - } | |
380 | - else { | |
381 | - ReleaseCapture(); | |
382 | - } | |
383 | - break; | |
382 | + break; | |
383 | + } | |
384 | + case WM_LBUTTONUP: | |
385 | + { | |
386 | + if (me->m_dCaptureMode & 0x01) { | |
387 | + me->AddEvent(WM_LBUTTONUP, 0, 0); | |
388 | + me->m_dCaptureMode &= ~0x01; | |
389 | + ReleaseCapture(); | |
384 | 390 | } |
385 | - case WM_LBUTTONUP: | |
386 | - { | |
387 | - if (me->m_dCaptureMode & 0x01) { | |
388 | - me->AddEvent(WM_LBUTTONUP, 0, 0); | |
389 | - me->m_dCaptureMode &= ~0x01; | |
390 | - ReleaseCapture(); | |
391 | - } | |
392 | - break; | |
391 | + break; | |
392 | + } | |
393 | + case WM_RBUTTONDOWN: | |
394 | + { | |
395 | + if (me->m_dCaptureMode == 0) { | |
396 | + me->AddEvent(WM_RBUTTONDOWN, 0, 0); | |
397 | + ::SetCapture(hWnd); | |
398 | + me->m_dCaptureMode |= 0x02; | |
393 | 399 | } |
394 | - case WM_RBUTTONDOWN: | |
395 | - { | |
396 | - if (me->m_dCaptureMode == 0) { | |
397 | - me->AddEvent(WM_RBUTTONDOWN, 0, 0); | |
398 | - ::SetCapture(hWnd); | |
399 | - me->m_dCaptureMode |= 0x02; | |
400 | - } | |
401 | - else { | |
402 | - ReleaseCapture(); | |
403 | - } | |
404 | - break; | |
400 | + else { | |
401 | + ReleaseCapture(); | |
405 | 402 | } |
406 | - case WM_RBUTTONUP: | |
407 | - { | |
408 | - if (me->m_dCaptureMode & 0x02) { | |
409 | - me->AddEvent(WM_RBUTTONUP, 0, 0); | |
410 | - me->m_dCaptureMode &= ~0x02; | |
411 | - ReleaseCapture(); | |
412 | - } | |
413 | - break; | |
403 | + break; | |
404 | + } | |
405 | + case WM_RBUTTONUP: | |
406 | + { | |
407 | + if (me->m_dCaptureMode & 0x02) { | |
408 | + me->AddEvent(WM_RBUTTONUP, 0, 0); | |
409 | + me->m_dCaptureMode &= ~0x02; | |
410 | + ReleaseCapture(); | |
414 | 411 | } |
415 | - case WM_CAPTURECHANGED: | |
416 | - { | |
417 | - if (me->m_dCaptureMode & 0x01) { | |
418 | - me->AddEvent(WM_CAPTURECHANGED, 1, 0); | |
419 | - } | |
420 | - if (me->m_dCaptureMode & 0x02) { | |
421 | - me->AddEvent(WM_CAPTURECHANGED, 2, 0); | |
422 | - } | |
423 | - me->m_dCaptureMode = 0; | |
424 | - break; | |
412 | + break; | |
413 | + } | |
414 | + case WM_CAPTURECHANGED: | |
415 | + { | |
416 | + if (me->m_dCaptureMode & 0x01) { | |
417 | + me->AddEvent(WM_CAPTURECHANGED, 1, 0); | |
425 | 418 | } |
426 | - case WM_SIZE: | |
427 | - { | |
428 | - me->AddEventSingle(WM_SIZE, 0, 0); | |
429 | - break; | |
419 | + if (me->m_dCaptureMode & 0x02) { | |
420 | + me->AddEvent(WM_CAPTURECHANGED, 2, 0); | |
430 | 421 | } |
431 | - case WM_TIMER: | |
432 | - { | |
433 | - if (wParam == 1) { | |
434 | - me->AddEventSingle(WM_TIMER, 0, 0); | |
422 | + me->m_dCaptureMode = 0; | |
423 | + break; | |
424 | + } | |
425 | + case WM_SIZE: | |
426 | + { | |
427 | + me->AddEventSingle(WM_SIZE, 0, 0); | |
428 | + break; | |
429 | + } | |
430 | + case WM_TIMER: | |
431 | + { | |
432 | + if (wParam == 1) { | |
433 | + me->AddEventSingle(WM_TIMER, 0, 0); | |
434 | + } | |
435 | + break; | |
436 | + } | |
437 | + case WM_DROPFILES: | |
438 | + { | |
439 | + HDROP hDrop = (HDROP)wParam; | |
440 | + me->m_dropfiles.SetDropFiles(hDrop); | |
441 | + me->AddEvent(WM_DROPFILES, 0, 0); | |
442 | + break; | |
443 | + } | |
444 | + case WM_KEYDOWN: | |
445 | + { | |
446 | + DWORD st = 0; | |
447 | + if (GetKeyState(VK_SHIFT) & 0x8000) st |= 0x01; | |
448 | + if (GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02; | |
449 | + if (GetKeyState(VK_MENU) & 0x8000) st |= 0x04; | |
450 | + me->AddEventSingle(WM_KEYDOWN, wParam, st); | |
451 | + return 0; | |
452 | + } | |
453 | + case WM_KEYDOWN_EX: | |
454 | + { | |
455 | + DWORD st = 0; | |
456 | + if (GetKeyState(VK_SHIFT) & 0x8000) st |= 0x01; | |
457 | + if (GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02; | |
458 | + if (GetKeyState(VK_MENU) & 0x8000) st |= 0x04; | |
459 | + me->AddEventSingle(WM_KEYDOWN_EX, wParam, st); | |
460 | + return 0; | |
461 | + } | |
462 | + case WM_COMMAND: | |
463 | + { | |
464 | +#ifdef _DEBUG | |
465 | + ATLTRACE(_TEXT("command=%d:%d\n"), HIWORD(wParam), LOWORD(wParam)); | |
466 | +#endif | |
467 | + HWND hControl = (HWND)lParam; | |
468 | + int nID = LOWORD(wParam); | |
469 | + int notify = HIWORD(wParam); | |
470 | + if (!notify) { | |
471 | + if (nID == IDABORT) { | |
472 | + // IDABORTと同一ならquitを立てる | |
473 | + me->m_bQuit = true; | |
474 | + } | |
475 | + me->AddEventSingle(WM_COMMAND, nID, 0); | |
476 | + } | |
477 | + else { | |
478 | + // コントロール通知 | |
479 | + switch (notify) { | |
480 | + case CBN_SETFOCUS: | |
481 | + case LBN_SETFOCUS: | |
482 | + case EN_SETFOCUS: | |
483 | + case BN_SETFOCUS: | |
484 | + // TreeView - ListView以外のコントロールがフォーカスを受け取ったことを通知する | |
485 | + me->m_hLastFocusControl = hControl; | |
486 | + break; | |
487 | + case LBN_DBLCLK: | |
488 | + // LISTBOXがダブルクリックされた | |
489 | + me->AddEvent(WM_COMMAND, nID, 0); | |
490 | + default: | |
491 | + break; | |
435 | 492 | } |
436 | - break; | |
437 | 493 | } |
438 | - case WM_DROPFILES: | |
494 | + break; | |
495 | + } | |
496 | + case WM_NOTIFY: | |
497 | + { | |
498 | + NMHDR* notify = (NMHDR*)lParam; | |
499 | + switch (notify->code) { | |
500 | + case NM_SETFOCUS: | |
439 | 501 | { |
440 | - HDROP hDrop = (HDROP)wParam; | |
441 | - me->m_dropfiles.DropFiles(hDrop); | |
442 | - me->AddEvent(WM_DROPFILES, 0, 0); | |
443 | - break; | |
502 | + // TreeView - ListViewがフォーカスを受け取ったことを通知する | |
503 | + me->m_hLastFocusControl = notify->hwndFrom; | |
504 | + return 0; | |
444 | 505 | } |
445 | - case WM_KEYDOWN: | |
506 | + case TVN_SELCHANGED: | |
446 | 507 | { |
447 | - DWORD st = 0; | |
448 | - if (GetKeyState(VK_SHIFT) & 0x8000) st |= 0x01; | |
449 | - if (GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02; | |
450 | - if (GetKeyState(VK_MENU) & 0x8000) st |= 0x04; | |
451 | - me->AddEventSingle(WM_KEYDOWN, wParam, st); | |
508 | + // TreeViewの選択が変更されたことを通知される | |
509 | + LPNMTREEVIEW pnmTv = (LPNMTREEVIEW)lParam; | |
510 | + me->AddEvent(WM_COMMAND, pnmTv->hdr.idFrom, 0); | |
452 | 511 | return 0; |
453 | 512 | } |
454 | - case WM_KEYDOWN_EX: | |
513 | + case NM_DBLCLK: | |
455 | 514 | { |
456 | - DWORD st = 0; | |
457 | - if (GetKeyState(VK_SHIFT) & 0x8000) st |= 0x01; | |
458 | - if (GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02; | |
459 | - if (GetKeyState(VK_MENU) & 0x8000) st |= 0x04; | |
460 | - me->AddEventSingle(WM_KEYDOWN_EX, wParam, st); | |
515 | + // ListView - TreeViewでダブルクリックされたことを通知された | |
516 | + LPNMITEMACTIVATE pnmLv = (LPNMITEMACTIVATE)lParam; | |
517 | + me->AddEvent(WM_COMMAND, pnmLv->hdr.idFrom, 0); | |
461 | 518 | return 0; |
462 | 519 | } |
463 | - case WM_COMMAND: | |
520 | + case LVN_COLUMNCLICK: | |
464 | 521 | { |
465 | -#ifdef _DEBUG | |
466 | - TCHAR mes[MAX_PATH]; | |
467 | - wsprintf(mes, _TEXT("command=%d:%d\n"), HIWORD(wParam), LOWORD(wParam)); | |
468 | - OutputDebugString(mes); | |
469 | -#endif | |
470 | - HWND hControl = (HWND)lParam; | |
471 | - int nID = LOWORD(wParam); | |
472 | - int notify = HIWORD(wParam); | |
473 | - if (!notify) { | |
474 | - if (nID == IDABORT) { | |
475 | - // IDABORTと同一ならquitを立てる | |
476 | - me->m_bQuit = true; | |
477 | - } | |
478 | - me->AddEventSingle(WM_COMMAND, nID, 0); | |
479 | - } | |
480 | - else { | |
481 | - // コントロール通知 | |
482 | - switch (notify) { | |
483 | - case CBN_SETFOCUS: | |
484 | - case LBN_SETFOCUS: | |
485 | - case EN_SETFOCUS: | |
486 | - case BN_SETFOCUS: | |
487 | - // TreeView - ListView以外のコントロールがフォーカスを受け取ったことを通知する | |
488 | - me->m_hLastFocusControl = hControl; | |
489 | - break; | |
490 | - case LBN_DBLCLK: | |
491 | - // LISTBOXがダブルクリックされた | |
492 | - me->AddEvent(WM_COMMAND, nID, 0); | |
493 | - default: | |
494 | - break; | |
495 | - } | |
522 | + // ListViewでカラムがクリックされたことを通知する | |
523 | + LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam; | |
524 | + LONG_PTR addr = ::GetWindowLongPtr(pnmv->hdr.hwndFrom, GWLP_USERDATA); | |
525 | + if (addr) { | |
526 | + // カラムクリックによるソーティングを行う | |
527 | + CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr; | |
528 | + pCtrl->ListSort(pnmv->iSubItem); | |
496 | 529 | } |
497 | - break; | |
530 | + return 0; | |
498 | 531 | } |
499 | - case WM_NOTIFY: | |
532 | + case LVN_ENDLABELEDIT: | |
500 | 533 | { |
501 | - NMHDR* notify = (NMHDR*)lParam; | |
502 | - switch (notify->code) { | |
503 | - case NM_SETFOCUS: | |
504 | - { | |
505 | - // TreeView - ListViewがフォーカスを受け取ったことを通知する | |
506 | - me->m_hLastFocusControl = notify->hwndFrom; | |
507 | - return 0; | |
508 | - } | |
509 | - case TVN_SELCHANGED: | |
510 | - { | |
511 | - // TreeViewの選択が変更されたことを通知される | |
512 | - LPNMTREEVIEW pnmTv = (LPNMTREEVIEW)lParam; | |
513 | - me->AddEvent(WM_COMMAND, pnmTv->hdr.idFrom, 0); | |
514 | - return 0; | |
515 | - } | |
516 | - case NM_DBLCLK: | |
517 | - { | |
518 | - // ListView - TreeViewでダブルクリックされたことを通知された | |
519 | - LPNMITEMACTIVATE pnmLv = (LPNMITEMACTIVATE)lParam; | |
520 | - me->AddEvent(WM_COMMAND, pnmLv->hdr.idFrom, 0); | |
521 | - return 0; | |
522 | - } | |
523 | - case LVN_COLUMNCLICK: | |
524 | - { | |
525 | - // ListViewでカラムがクリックされたことを通知する | |
526 | - LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam; | |
527 | - LONG_PTR addr = ::GetWindowLongPtr(pnmv->hdr.hwndFrom, GWLP_USERDATA); | |
528 | - if (addr) { | |
529 | - // カラムクリックによるソーティングを行う | |
530 | - CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr; | |
531 | - pCtrl->ListSort(pnmv->iSubItem); | |
532 | - } | |
533 | - return 0; | |
534 | - } | |
535 | - case LVN_ENDLABELEDIT: | |
536 | - { | |
537 | - // ListViewで項目が編集されたことを通知する | |
538 | - NMLVDISPINFO* pdi = (NMLVDISPINFO*)lParam; | |
539 | - if (pdi->item.mask & LVIF_TEXT) { | |
540 | - ListView_SetItemText(pdi->hdr.hwndFrom, pdi->item.iItem, 0, pdi->item.pszText); | |
541 | - } | |
542 | - return 0; | |
543 | - } | |
544 | - case LVN_KEYDOWN: | |
545 | - { | |
546 | - // ListViewでキーボードが押されたことを通知する | |
547 | - LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam; | |
548 | - if (pnkd->wVKey == VK_SPACE) { | |
549 | - // スペースキーでダブルクリックと同じ効果を持たせる | |
550 | - me->AddEvent(WM_COMMAND, pnkd->hdr.idFrom, 0); | |
551 | - } | |
552 | - else if (pnkd->wVKey == VK_DELETE) { | |
553 | - // デリート | |
554 | - me->AddEvent(WM_NOTIFY, pnkd->hdr.idFrom, VK_DELETE); | |
555 | - } | |
556 | - else if (pnkd->wVKey == VK_F2) { | |
557 | - // ラベル編集開始 | |
558 | - int idx = ListView_GetNextItem(pnkd->hdr.hwndFrom, -1, LVNI_FOCUSED); | |
559 | - ListView_EditLabel(pnkd->hdr.hwndFrom, idx); | |
560 | - } | |
561 | - return 0; | |
562 | - } | |
563 | - case TVN_KEYDOWN: | |
564 | - { | |
565 | - LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)lParam; | |
566 | - if (ptvkd->wVKey == VK_DELETE) { | |
567 | - // デリート | |
568 | - me->AddEvent(WM_NOTIFY, ptvkd->hdr.idFrom, VK_DELETE); | |
569 | - } | |
570 | - return 0; | |
571 | - } | |
572 | - case NM_RCLICK: | |
573 | - { | |
574 | - // ListView - TreeView で右クリックされたことを通知する | |
575 | - LPNMHDR lpnmh = (LPNMHDR)lParam; | |
576 | - LONG_PTR addr = ::GetWindowLongPtr(lpnmh->hwndFrom, GWLP_USERDATA); | |
577 | - if (addr) { | |
578 | - CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr; | |
579 | - pCtrl->OnRClick(); // コントロールに右クリックを通知し前処理を行わせる | |
580 | - } | |
581 | - me->AddEvent(WM_NOTIFY, lpnmh->idFrom, VK_RBUTTON); | |
582 | - return 0; | |
583 | - } | |
584 | - default: | |
585 | - break; | |
534 | + // ListViewで項目が編集されたことを通知する | |
535 | + NMLVDISPINFO* pdi = (NMLVDISPINFO*)lParam; | |
536 | + if (pdi->item.mask & LVIF_TEXT) { | |
537 | + ListView_SetItemText(pdi->hdr.hwndFrom, pdi->item.iItem, 0, pdi->item.pszText); | |
586 | 538 | } |
587 | - break; | |
539 | + return 0; | |
588 | 540 | } |
589 | - case WM_CTLCOLORSTATIC: | |
541 | + case LVN_KEYDOWN: | |
590 | 542 | { |
591 | - HDC hdc = (HDC)wParam; | |
592 | - ::SetBkColor(hdc, me->m_dwBackColor); | |
593 | - ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); | |
594 | - return (LPARAM)me->m_hBkBrush; | |
543 | + // ListViewでキーボードが押されたことを通知する | |
544 | + LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam; | |
545 | + if (pnkd->wVKey == VK_SPACE) { | |
546 | + // スペースキーでダブルクリックと同じ効果を持たせる | |
547 | + me->AddEvent(WM_COMMAND, pnkd->hdr.idFrom, 0); | |
548 | + } | |
549 | + else if (pnkd->wVKey == VK_DELETE) { | |
550 | + // デリート | |
551 | + me->AddEvent(WM_NOTIFY, pnkd->hdr.idFrom, VK_DELETE); | |
552 | + } | |
553 | + else if (pnkd->wVKey == VK_F2) { | |
554 | + // ラベル編集開始 | |
555 | + int idx = ListView_GetNextItem(pnkd->hdr.hwndFrom, -1, LVNI_FOCUSED); | |
556 | + ListView_EditLabel(pnkd->hdr.hwndFrom, idx); | |
557 | + } | |
558 | + return 0; | |
595 | 559 | } |
596 | - case WM_CTLCOLOREDIT: | |
597 | - case WM_CTLCOLORLISTBOX: | |
598 | - case WM_CTLCOLORMSGBOX: | |
560 | + case TVN_KEYDOWN: | |
599 | 561 | { |
600 | - if (me->m_pForm) { | |
601 | - // フォームで指定されたコントロール背景ブラシを取得する | |
602 | - HDC hdc = (HDC)wParam; | |
603 | - ::SetBkColor(hdc, me->m_pForm->GetControlColor()); | |
604 | - ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); | |
605 | - return (LPARAM)me->m_pForm->GetControlColorBrush(); | |
562 | + LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)lParam; | |
563 | + if (ptvkd->wVKey == VK_DELETE) { | |
564 | + // デリート | |
565 | + me->AddEvent(WM_NOTIFY, ptvkd->hdr.idFrom, VK_DELETE); | |
606 | 566 | } |
607 | - break; | |
567 | + return 0; | |
608 | 568 | } |
609 | - case WM_SETCURSOR: | |
569 | + case NM_RCLICK: | |
610 | 570 | { |
611 | - if (me->m_dWaitCursor > 0) { | |
612 | - ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); | |
613 | - return true; | |
571 | + // ListView - TreeView で右クリックされたことを通知する | |
572 | + LPNMHDR lpnmh = (LPNMHDR)lParam; | |
573 | + LONG_PTR addr = ::GetWindowLongPtr(lpnmh->hwndFrom, GWLP_USERDATA); | |
574 | + if (addr) { | |
575 | + CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr; | |
576 | + pCtrl->OnRClick(); // コントロールに右クリックを通知し前処理を行わせる | |
614 | 577 | } |
578 | + me->AddEvent(WM_NOTIFY, lpnmh->idFrom, VK_RBUTTON); | |
579 | + return 0; | |
580 | + } | |
581 | + default: | |
615 | 582 | break; |
616 | 583 | } |
584 | + break; | |
585 | + } | |
586 | + case WM_CTLCOLORSTATIC: | |
587 | + { | |
588 | + HDC hdc = (HDC)wParam; | |
589 | + ::SetBkColor(hdc, me->m_dwBackColor); | |
590 | + ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); | |
591 | + return (LPARAM)me->m_hBkBrush; | |
592 | + } | |
593 | + case WM_CTLCOLOREDIT: | |
594 | + case WM_CTLCOLORLISTBOX: | |
595 | + case WM_CTLCOLORMSGBOX: | |
596 | + { | |
597 | + if (me->m_pForm) { | |
598 | + // フォームで指定されたコントロール背景ブラシを取得する | |
599 | + HDC hdc = (HDC)wParam; | |
600 | + ::SetBkColor(hdc, me->m_pForm->GetControlColor()); | |
601 | + ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); | |
602 | + return (LPARAM)me->m_pForm->GetControlColorBrush(); | |
603 | + } | |
604 | + break; | |
605 | + } | |
606 | + case WM_SETCURSOR: | |
607 | + { | |
608 | + if (me->m_dWaitCursor > 0) { | |
609 | + ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); | |
610 | + return true; | |
611 | + } | |
612 | + break; | |
613 | + } | |
617 | 614 | } |
618 | 615 | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
619 | 616 | } |
@@ -667,173 +664,173 @@ STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult) | ||
667 | 664 | // このオブジェクトを引数として渡すためにインターフェイスを生成する |
668 | 665 | CComPtr<IUnknown> pUnk; |
669 | 666 | HRESULT hr; |
670 | - if (FAILED(hr = QueryInterface(IID_IUnknown, (void**) &pUnk))) { | |
667 | + if (FAILED(hr = QueryInterface(IID_IUnknown, (void**)&pUnk))) { | |
671 | 668 | return hr; |
672 | 669 | } |
673 | 670 | |
674 | 671 | // イベントに対するライズ |
675 | 672 | switch (pEv->GetMessage()) { |
676 | - case WM_KEYDOWN: | |
677 | - { | |
678 | - Fire_OnKeydown(); | |
679 | - Fire_OnKeydownEx(pUnk); | |
680 | - ClassObjectInvoke(L"OnKeydown"); | |
681 | - break; | |
682 | - } | |
683 | - case WM_KEYDOWN_EX: | |
684 | - { | |
685 | - Fire_OnKeydown2(); | |
686 | - Fire_OnKeydown2Ex(pUnk); | |
687 | - ClassObjectInvoke(L"OnKeydown2"); | |
688 | - break; | |
689 | - } | |
690 | - case WM_MOUSEMOVE: | |
691 | - { | |
692 | - Fire_OnMouseMove(); | |
693 | - Fire_OnMouseMoveEx(pUnk); | |
694 | - ClassObjectInvoke(L"OnMouseMove"); | |
695 | - break; | |
696 | - } | |
697 | - case WM_LBUTTONDBLCLK: | |
698 | - { | |
699 | - Fire_OnDblClick(); | |
700 | - Fire_OnDblClickEx(pUnk); | |
701 | - ClassObjectInvoke(L"OnDblClick"); | |
702 | - break; | |
703 | - } | |
704 | - case WM_LBUTTONDOWN: | |
705 | - { | |
706 | - Fire_OnClick(); | |
707 | - Fire_OnClickEx(pUnk); | |
708 | - ClassObjectInvoke(L"OnClick"); | |
709 | - break; | |
710 | - } | |
711 | - case WM_RBUTTONDBLCLK: | |
712 | - { | |
713 | - Fire_OnRDblClick(); | |
714 | - Fire_OnRDblClickEx(pUnk); | |
715 | - ClassObjectInvoke(L"OnRDblClick"); | |
716 | - break; | |
717 | - } | |
718 | - case WM_RBUTTONDOWN: | |
719 | - { | |
720 | - Fire_OnRClick(); | |
721 | - Fire_OnRClickEx(pUnk); | |
722 | - ClassObjectInvoke(L"OnRClick"); | |
723 | - break; | |
724 | - } | |
725 | - case WM_LBUTTONUP: | |
726 | - { | |
727 | - Fire_OnClickOut(); | |
728 | - Fire_OnClickOutEx(pUnk); | |
729 | - ClassObjectInvoke(L"OnClickOut"); | |
730 | - break; | |
673 | + case WM_KEYDOWN: | |
674 | + { | |
675 | + Fire_OnKeydown(); | |
676 | + Fire_OnKeydownEx(pUnk); | |
677 | + ClassObjectInvoke(L"OnKeydown"); | |
678 | + break; | |
679 | + } | |
680 | + case WM_KEYDOWN_EX: | |
681 | + { | |
682 | + Fire_OnKeydown2(); | |
683 | + Fire_OnKeydown2Ex(pUnk); | |
684 | + ClassObjectInvoke(L"OnKeydown2"); | |
685 | + break; | |
686 | + } | |
687 | + case WM_MOUSEMOVE: | |
688 | + { | |
689 | + Fire_OnMouseMove(); | |
690 | + Fire_OnMouseMoveEx(pUnk); | |
691 | + ClassObjectInvoke(L"OnMouseMove"); | |
692 | + break; | |
693 | + } | |
694 | + case WM_LBUTTONDBLCLK: | |
695 | + { | |
696 | + Fire_OnDblClick(); | |
697 | + Fire_OnDblClickEx(pUnk); | |
698 | + ClassObjectInvoke(L"OnDblClick"); | |
699 | + break; | |
700 | + } | |
701 | + case WM_LBUTTONDOWN: | |
702 | + { | |
703 | + Fire_OnClick(); | |
704 | + Fire_OnClickEx(pUnk); | |
705 | + ClassObjectInvoke(L"OnClick"); | |
706 | + break; | |
707 | + } | |
708 | + case WM_RBUTTONDBLCLK: | |
709 | + { | |
710 | + Fire_OnRDblClick(); | |
711 | + Fire_OnRDblClickEx(pUnk); | |
712 | + ClassObjectInvoke(L"OnRDblClick"); | |
713 | + break; | |
714 | + } | |
715 | + case WM_RBUTTONDOWN: | |
716 | + { | |
717 | + Fire_OnRClick(); | |
718 | + Fire_OnRClickEx(pUnk); | |
719 | + ClassObjectInvoke(L"OnRClick"); | |
720 | + break; | |
721 | + } | |
722 | + case WM_LBUTTONUP: | |
723 | + { | |
724 | + Fire_OnClickOut(); | |
725 | + Fire_OnClickOutEx(pUnk); | |
726 | + ClassObjectInvoke(L"OnClickOut"); | |
727 | + break; | |
728 | + } | |
729 | + case WM_RBUTTONUP: | |
730 | + { | |
731 | + Fire_OnRClickOut(); | |
732 | + Fire_OnRClickOutEx(pUnk); | |
733 | + ClassObjectInvoke(L"OnRClickOut"); | |
734 | + break; | |
735 | + } | |
736 | + case WM_CAPTURECHANGED: | |
737 | + { | |
738 | + if (pEv->GetParam() == 1) { | |
739 | + Fire_OnClickCancel(); | |
740 | + Fire_OnClickCancelEx(pUnk); | |
741 | + ClassObjectInvoke(L"OnClickCancel"); | |
731 | 742 | } |
732 | - case WM_RBUTTONUP: | |
733 | - { | |
734 | - Fire_OnRClickOut(); | |
735 | - Fire_OnRClickOutEx(pUnk); | |
736 | - ClassObjectInvoke(L"OnRClickOut"); | |
737 | - break; | |
743 | + else { | |
744 | + Fire_OnRClickCancel(); | |
745 | + Fire_OnRClickCancelEx(pUnk); | |
746 | + ClassObjectInvoke(L"OnRClickCancel"); | |
738 | 747 | } |
739 | - case WM_CAPTURECHANGED: | |
740 | - { | |
741 | - if (pEv->GetParam() == 1) { | |
742 | - Fire_OnClickCancel(); | |
743 | - Fire_OnClickCancelEx(pUnk); | |
744 | - ClassObjectInvoke(L"OnClickCancel"); | |
748 | + break; | |
749 | + } | |
750 | + case WM_SIZE: | |
751 | + { | |
752 | + Fire_OnSize(); | |
753 | + Fire_OnSizeEx(pUnk); | |
754 | + ClassObjectInvoke(L"OnSize"); | |
755 | + break; | |
756 | + } | |
757 | + case WM_COMMAND: | |
758 | + { | |
759 | + int nID = pEv->GetParam(); | |
760 | + switch (nID) { | |
761 | + case IDOK: | |
762 | + if (m_bDefaultAction) { | |
763 | + m_bQuit = true; | |
745 | 764 | } |
746 | - else { | |
747 | - Fire_OnRClickCancel(); | |
748 | - Fire_OnRClickCancelEx(pUnk); | |
749 | - ClassObjectInvoke(L"OnRClickCancel"); | |
765 | + m_dModalExitCode = IDOK; | |
766 | + Fire_OnOK(); | |
767 | + Fire_OnOKEx(pUnk); | |
768 | + ClassObjectInvoke(L"OnOK"); | |
769 | + break; | |
770 | + case IDCANCEL: | |
771 | + if (m_bDefaultAction) { | |
772 | + m_bQuit = true; | |
750 | 773 | } |
774 | + m_dModalExitCode = IDCANCEL; | |
775 | + Fire_OnCancel(); | |
776 | + Fire_OnCancelEx(pUnk); | |
777 | + ClassObjectInvoke(L"OnCancel"); | |
751 | 778 | break; |
752 | - } | |
753 | - case WM_SIZE: | |
754 | - { | |
755 | - Fire_OnSize(); | |
756 | - Fire_OnSizeEx(pUnk); | |
757 | - ClassObjectInvoke(L"OnSize"); | |
779 | + case IDABORT: | |
780 | + m_bQuit = true; | |
781 | + m_dModalExitCode = IDABORT; | |
782 | + Fire_OnExit(); | |
783 | + Fire_OnExitEx(pUnk); | |
784 | + ClassObjectInvoke(L"OnExit"); | |
758 | 785 | break; |
786 | + default: | |
787 | + Fire_OnCommand(); | |
788 | + Fire_OnCommandEx(pUnk); | |
789 | + ClassObjectInvoke(L"OnCommand"); | |
759 | 790 | } |
760 | - case WM_COMMAND: | |
761 | - { | |
762 | - int nID = pEv->GetParam(); | |
763 | - switch (nID) { | |
764 | - case IDOK: | |
765 | - if (m_bDefaultAction) { | |
766 | - m_bQuit = true; | |
767 | - } | |
768 | - m_dModalExitCode = IDOK; | |
769 | - Fire_OnOK(); | |
770 | - Fire_OnOKEx(pUnk); | |
771 | - ClassObjectInvoke(L"OnOK"); | |
772 | - break; | |
773 | - case IDCANCEL: | |
774 | - if (m_bDefaultAction) { | |
775 | - m_bQuit = true; | |
776 | - } | |
777 | - m_dModalExitCode = IDCANCEL; | |
778 | - Fire_OnCancel(); | |
779 | - Fire_OnCancelEx(pUnk); | |
780 | - ClassObjectInvoke(L"OnCancel"); | |
781 | - break; | |
782 | - case IDABORT: | |
783 | - m_bQuit = true; | |
784 | - m_dModalExitCode = IDABORT; | |
785 | - Fire_OnExit(); | |
786 | - Fire_OnExitEx(pUnk); | |
787 | - ClassObjectInvoke(L"OnExit"); | |
788 | - break; | |
789 | - default: | |
790 | - Fire_OnCommand(); | |
791 | - Fire_OnCommandEx(pUnk); | |
792 | - ClassObjectInvoke(L"OnCommand"); | |
793 | - } | |
794 | - // 関連づけられたコントロールがあるのか? | |
795 | - if (m_pForm) { | |
796 | - BSTR eventname = NULL; | |
797 | - if (m_pForm->FindControlEventName(nID, &eventname)) { | |
798 | - if (SysStringLen(eventname) > 0) { | |
799 | - ClassObjectInvoke(eventname); | |
800 | - } | |
801 | - SysFreeString(eventname); | |
791 | + // 関連づけられたコントロールがあるのか? | |
792 | + if (m_pForm) { | |
793 | + BSTR eventname = NULL; | |
794 | + if (m_pForm->FindControlEventName(nID, &eventname)) { | |
795 | + if (SysStringLen(eventname) > 0) { | |
796 | + ClassObjectInvoke(eventname); | |
802 | 797 | } |
798 | + SysFreeString(eventname); | |
803 | 799 | } |
804 | - // メニューの検索 | |
805 | - if (m_hMenu && nID >= 100) { | |
806 | - std::map<int, CComBSTR>::iterator p = m_cMenuMap.find(nID); | |
807 | - if (p != m_cMenuMap.end()) { | |
808 | - // 発見された | |
809 | - ClassObjectInvoke(p->second); | |
810 | - } | |
800 | + } | |
801 | + // メニューの検索 | |
802 | + if (m_hMenu && nID >= 100) { | |
803 | + std::map<int, CComBSTR>::iterator p = m_cMenuMap.find(nID); | |
804 | + if (p != m_cMenuMap.end()) { | |
805 | + // 発見された | |
806 | + ClassObjectInvoke(p->second); | |
811 | 807 | } |
812 | - break; | |
813 | 808 | } |
814 | - case WM_DROPFILES: | |
815 | - { | |
816 | - Fire_OnDropFiles(); | |
817 | - Fire_OnDropFilesEx(pUnk); | |
818 | - ClassObjectInvoke(L"OnDropFiles"); | |
809 | + break; | |
810 | + } | |
811 | + case WM_DROPFILES: | |
812 | + { | |
813 | + Fire_OnDropFiles(); | |
814 | + Fire_OnDropFilesEx(pUnk); | |
815 | + ClassObjectInvoke(L"OnDropFiles"); | |
816 | + break; | |
817 | + } | |
818 | + case WM_NOTIFY: | |
819 | + { | |
820 | + switch (pEv->GetLParam()) { | |
821 | + case VK_DELETE: | |
822 | + Fire_OnContextDelete(); | |
823 | + Fire_OnContextDeleteEx(pUnk); | |
824 | + ClassObjectInvoke(L"OnContextDelete"); | |
819 | 825 | break; |
820 | - } | |
821 | - case WM_NOTIFY: | |
822 | - { | |
823 | - switch (pEv->GetLParam()) { | |
824 | - case VK_DELETE: | |
825 | - Fire_OnContextDelete(); | |
826 | - Fire_OnContextDeleteEx(pUnk); | |
827 | - ClassObjectInvoke(L"OnContextDelete"); | |
828 | - break; | |
829 | - case VK_RBUTTON: | |
830 | - Fire_OnContextMenu(); | |
831 | - Fire_OnContextMenuEx(pUnk); | |
832 | - ClassObjectInvoke(L"OnContextMenu"); | |
833 | - break; | |
834 | - } | |
826 | + case VK_RBUTTON: | |
827 | + Fire_OnContextMenu(); | |
828 | + Fire_OnContextMenuEx(pUnk); | |
829 | + ClassObjectInvoke(L"OnContextMenu"); | |
835 | 830 | break; |
836 | 831 | } |
832 | + break; | |
833 | + } | |
837 | 834 | } |
838 | 835 | // この引数として渡したインターフェイスを解放する |
839 | 836 | if (pUnk) { |
@@ -972,8 +969,7 @@ STDMETHODIMP COverlappedWindow::Close() | ||
972 | 969 | |
973 | 970 | // クラスオブジェクトの放棄 |
974 | 971 | if (m_pClassDisp && m_bAutoReleaseClassObject) { |
975 | - m_pClassDisp->Release(); | |
976 | - m_pClassDisp = NULL; | |
972 | + m_pClassDisp.Release(); | |
977 | 973 | } |
978 | 974 | |
979 | 975 | // フォーカスを移動する |
@@ -989,7 +985,12 @@ STDMETHODIMP COverlappedWindow::Close() | ||
989 | 985 | |
990 | 986 | STDMETHODIMP COverlappedWindow::get_DoubleBuffer(BOOL *pVal) |
991 | 987 | { |
988 | + if (!pVal) { | |
989 | + return E_POINTER; | |
990 | + } | |
991 | + | |
992 | 992 | *pVal = windowParam.doublebuffer ? VB_TRUE : VB_FALSE; |
993 | + | |
993 | 994 | return S_OK; |
994 | 995 | } |
995 | 996 |
@@ -1002,9 +1003,15 @@ STDMETHODIMP COverlappedWindow::put_DoubleBuffer(BOOL newVal) | ||
1002 | 1003 | |
1003 | 1004 | STDMETHODIMP COverlappedWindow::get_TopMost(BOOL *pVal) |
1004 | 1005 | { |
1006 | + if (!pVal) { | |
1007 | + return E_POINTER; | |
1008 | + } | |
1009 | + | |
1005 | 1010 | SafeCreateWnd(); |
1011 | + | |
1006 | 1012 | DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE); |
1007 | 1013 | *pVal = (exstyle & WS_EX_TOPMOST) ? VB_TRUE : VB_FALSE; |
1014 | + | |
1008 | 1015 | return S_OK; |
1009 | 1016 | } |
1010 | 1017 |
@@ -1017,13 +1024,19 @@ STDMETHODIMP COverlappedWindow::put_TopMost(BOOL newVal) | ||
1017 | 1024 | |
1018 | 1025 | STDMETHODIMP COverlappedWindow::get_PosX(short *pVal) |
1019 | 1026 | { |
1027 | + if (!pVal) { | |
1028 | + return E_POINTER; | |
1029 | + } | |
1030 | + | |
1020 | 1031 | if (m_hPopupWnd) { |
1021 | - WINDOWPLACEMENT pls = {0}; | |
1032 | + WINDOWPLACEMENT pls = { 0 }; | |
1022 | 1033 | pls.length = sizeof(WINDOWPLACEMENT); |
1023 | 1034 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1024 | 1035 | windowParam.posX = (int)pls.rcNormalPosition.left; |
1025 | 1036 | } |
1037 | + | |
1026 | 1038 | *pVal = windowParam.posX; |
1039 | + | |
1027 | 1040 | return S_OK; |
1028 | 1041 | } |
1029 | 1042 |
@@ -1031,7 +1044,7 @@ STDMETHODIMP COverlappedWindow::put_PosX(short newVal) | ||
1031 | 1044 | { |
1032 | 1045 | windowParam.posX = newVal; |
1033 | 1046 | if (m_hPopupWnd) { |
1034 | - WINDOWPLACEMENT pls = {0}; | |
1047 | + WINDOWPLACEMENT pls = { 0 }; | |
1035 | 1048 | pls.length = sizeof(WINDOWPLACEMENT); |
1036 | 1049 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1037 | 1050 | ::SetWindowPos(m_hPopupWnd, NULL, |
@@ -1044,13 +1057,19 @@ STDMETHODIMP COverlappedWindow::put_PosX(short newVal) | ||
1044 | 1057 | |
1045 | 1058 | STDMETHODIMP COverlappedWindow::get_PosY(short *pVal) |
1046 | 1059 | { |
1060 | + if (!pVal) { | |
1061 | + return E_POINTER; | |
1062 | + } | |
1063 | + | |
1047 | 1064 | if (m_hPopupWnd) { |
1048 | - WINDOWPLACEMENT pls = {0}; | |
1065 | + WINDOWPLACEMENT pls = { 0 }; | |
1049 | 1066 | pls.length = sizeof(WINDOWPLACEMENT); |
1050 | 1067 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1051 | 1068 | windowParam.posY = (int)pls.rcNormalPosition.top; |
1052 | 1069 | } |
1070 | + | |
1053 | 1071 | *pVal = windowParam.posY; |
1072 | + | |
1054 | 1073 | return S_OK; |
1055 | 1074 | } |
1056 | 1075 |
@@ -1058,7 +1077,7 @@ STDMETHODIMP COverlappedWindow::put_PosY(short newVal) | ||
1058 | 1077 | { |
1059 | 1078 | windowParam.posY = newVal; |
1060 | 1079 | if (m_hPopupWnd) { |
1061 | - WINDOWPLACEMENT pls = {0}; | |
1080 | + WINDOWPLACEMENT pls = { 0 }; | |
1062 | 1081 | pls.length = sizeof(WINDOWPLACEMENT); |
1063 | 1082 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1064 | 1083 | ::SetWindowPos(m_hPopupWnd, NULL, |
@@ -1071,21 +1090,28 @@ STDMETHODIMP COverlappedWindow::put_PosY(short newVal) | ||
1071 | 1090 | |
1072 | 1091 | STDMETHODIMP COverlappedWindow::get_Width(short *pVal) |
1073 | 1092 | { |
1093 | + if (!pVal) { | |
1094 | + return E_POINTER; | |
1095 | + } | |
1096 | + | |
1074 | 1097 | if (m_hPopupWnd) { |
1075 | - WINDOWPLACEMENT pls = {0}; | |
1098 | + WINDOWPLACEMENT pls = { 0 }; | |
1076 | 1099 | pls.length = sizeof(WINDOWPLACEMENT); |
1077 | 1100 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1078 | 1101 | windowParam.width = (int)(pls.rcNormalPosition.right - pls.rcNormalPosition.left); |
1079 | 1102 | } |
1103 | + | |
1080 | 1104 | *pVal = windowParam.width; |
1105 | + | |
1081 | 1106 | return S_OK; |
1082 | 1107 | } |
1083 | 1108 | |
1084 | 1109 | STDMETHODIMP COverlappedWindow::put_Width(short newVal) |
1085 | 1110 | { |
1086 | 1111 | windowParam.width = newVal; |
1112 | + | |
1087 | 1113 | if (m_hPopupWnd) { |
1088 | - WINDOWPLACEMENT pls = {0}; | |
1114 | + WINDOWPLACEMENT pls = { 0 }; | |
1089 | 1115 | pls.length = sizeof(WINDOWPLACEMENT); |
1090 | 1116 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1091 | 1117 | ::SetWindowPos(m_hPopupWnd, NULL, |
@@ -1093,31 +1119,39 @@ STDMETHODIMP COverlappedWindow::put_Width(short newVal) | ||
1093 | 1119 | windowParam.width, |
1094 | 1120 | pls.rcNormalPosition.bottom - pls.rcNormalPosition.top, SWP_NOZORDER | SWP_NOMOVE); |
1095 | 1121 | } |
1122 | + | |
1096 | 1123 | if (m_pForm) { |
1097 | 1124 | // フォームのサイズを変更する |
1098 | 1125 | m_pForm->SetWindowSize(windowParam.width, windowParam.height, |
1099 | - windowParam.GetStyle(), windowParam.exstyle); | |
1126 | + windowParam.ComputeStyle(), windowParam.exstyle); | |
1100 | 1127 | } |
1101 | 1128 | return S_OK; |
1102 | 1129 | } |
1103 | 1130 | |
1104 | 1131 | STDMETHODIMP COverlappedWindow::get_Height(short *pVal) |
1105 | 1132 | { |
1133 | + if (!pVal) { | |
1134 | + return E_POINTER; | |
1135 | + } | |
1136 | + | |
1106 | 1137 | if (m_hPopupWnd) { |
1107 | - WINDOWPLACEMENT pls = {0}; | |
1138 | + WINDOWPLACEMENT pls = { 0 }; | |
1108 | 1139 | pls.length = sizeof(WINDOWPLACEMENT); |
1109 | 1140 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1110 | 1141 | windowParam.height = (short)(pls.rcNormalPosition.right - pls.rcNormalPosition.left); |
1111 | 1142 | } |
1143 | + | |
1112 | 1144 | *pVal = windowParam.height; |
1145 | + | |
1113 | 1146 | return S_OK; |
1114 | 1147 | } |
1115 | 1148 | |
1116 | 1149 | STDMETHODIMP COverlappedWindow::put_Height(short newVal) |
1117 | 1150 | { |
1118 | 1151 | windowParam.height = newVal; |
1152 | + | |
1119 | 1153 | if (m_hPopupWnd) { |
1120 | - WINDOWPLACEMENT pls = {0}; | |
1154 | + WINDOWPLACEMENT pls = { 0 }; | |
1121 | 1155 | pls.length = sizeof(WINDOWPLACEMENT); |
1122 | 1156 | ::GetWindowPlacement(m_hPopupWnd, &pls); |
1123 | 1157 | ::SetWindowPos(m_hPopupWnd, NULL, 0, 0, |
@@ -1125,19 +1159,26 @@ STDMETHODIMP COverlappedWindow::put_Height(short newVal) | ||
1125 | 1159 | windowParam.height, |
1126 | 1160 | SWP_NOZORDER | SWP_NOMOVE); |
1127 | 1161 | } |
1162 | + | |
1128 | 1163 | if (m_pForm) { |
1129 | 1164 | // フォームのサイズを変更する |
1130 | 1165 | m_pForm->SetWindowSize(windowParam.width, windowParam.height, |
1131 | - windowParam.GetStyle(), windowParam.exstyle); | |
1166 | + windowParam.ComputeStyle(), windowParam.exstyle); | |
1132 | 1167 | } |
1133 | 1168 | return S_OK; |
1134 | 1169 | } |
1135 | 1170 | |
1136 | 1171 | STDMETHODIMP COverlappedWindow::get_AcceptFiles(BOOL *pVal) |
1137 | 1172 | { |
1173 | + if (!pVal) { | |
1174 | + return E_POINTER; | |
1175 | + } | |
1176 | + | |
1138 | 1177 | SafeCreateWnd(); |
1178 | + | |
1139 | 1179 | DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE); |
1140 | 1180 | *pVal = (exstyle & WS_EX_ACCEPTFILES) ? VB_TRUE : VB_FALSE; |
1181 | + | |
1141 | 1182 | return S_OK; |
1142 | 1183 | } |
1143 | 1184 |
@@ -1167,15 +1208,22 @@ STDMETHODIMP COverlappedWindow::SetFocus() | ||
1167 | 1208 | |
1168 | 1209 | STDMETHODIMP COverlappedWindow::get_Enable(BOOL *pVal) |
1169 | 1210 | { |
1211 | + if (!pVal) { | |
1212 | + return E_POINTER; | |
1213 | + } | |
1170 | 1214 | SafeCreateWnd(); |
1215 | + | |
1171 | 1216 | *pVal = ::IsWindowEnabled(m_hPopupWnd) ? VB_TRUE : VB_FALSE; |
1217 | + | |
1172 | 1218 | return S_OK; |
1173 | 1219 | } |
1174 | 1220 | |
1175 | 1221 | STDMETHODIMP COverlappedWindow::put_Enable(BOOL newVal) |
1176 | 1222 | { |
1177 | 1223 | SafeCreateWnd(); |
1224 | + | |
1178 | 1225 | ::EnableWindow(m_hPopupWnd, newVal); |
1226 | + | |
1179 | 1227 | if (m_pForm) { |
1180 | 1228 | m_pForm->EnableAllControl(newVal); |
1181 | 1229 | ::SetActiveWindow(m_hPopupWnd); |
@@ -1186,8 +1234,14 @@ STDMETHODIMP COverlappedWindow::put_Enable(BOOL newVal) | ||
1186 | 1234 | |
1187 | 1235 | STDMETHODIMP COverlappedWindow::get_Iconic(BOOL *pVal) |
1188 | 1236 | { |
1237 | + if (!pVal) { | |
1238 | + return E_POINTER; | |
1239 | + } | |
1240 | + | |
1189 | 1241 | SafeCreateWnd(); |
1242 | + | |
1190 | 1243 | *pVal = ::IsIconic(m_hPopupWnd) ? VB_TRUE : VB_FALSE; |
1244 | + | |
1191 | 1245 | return S_OK; |
1192 | 1246 | } |
1193 | 1247 |
@@ -1201,8 +1255,14 @@ STDMETHODIMP COverlappedWindow::put_Iconic(BOOL newVal) | ||
1201 | 1255 | |
1202 | 1256 | STDMETHODIMP COverlappedWindow::get_Zoomed(BOOL *pVal) |
1203 | 1257 | { |
1258 | + if (!pVal) { | |
1259 | + return E_POINTER; | |
1260 | + } | |
1261 | + | |
1204 | 1262 | SafeCreateWnd(); |
1263 | + | |
1205 | 1264 | *pVal = ::IsZoomed(m_hPopupWnd) ? VB_TRUE : VB_FALSE; |
1265 | + | |
1206 | 1266 | return S_OK; |
1207 | 1267 | } |
1208 | 1268 |
@@ -1215,12 +1275,18 @@ STDMETHODIMP COverlappedWindow::put_Zoomed(BOOL newVal) | ||
1215 | 1275 | |
1216 | 1276 | STDMETHODIMP COverlappedWindow::get_Visible(BOOL *pVal) |
1217 | 1277 | { |
1278 | + if (!pVal) { | |
1279 | + return E_POINTER; | |
1280 | + } | |
1281 | + | |
1218 | 1282 | *pVal = VB_FALSE; |
1283 | + | |
1219 | 1284 | if (::IsWindow(m_hPopupWnd)) { |
1220 | 1285 | // ウィンドウが作成済みであれば調査する |
1221 | 1286 | DWORD style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE); |
1222 | 1287 | *pVal = (style & WS_VISIBLE) ? VB_TRUE : VB_FALSE; |
1223 | 1288 | } |
1289 | + | |
1224 | 1290 | return S_OK; |
1225 | 1291 | } |
1226 | 1292 |
@@ -1230,16 +1296,23 @@ STDMETHODIMP COverlappedWindow::put_Visible(BOOL newVal) | ||
1230 | 1296 | // FALSEなら、あえて作成は試みない |
1231 | 1297 | return S_OK; |
1232 | 1298 | } |
1299 | + | |
1233 | 1300 | SafeCreateWnd(); |
1301 | + | |
1234 | 1302 | ::ShowWindow(m_hPopupWnd, newVal ? SW_SHOWNORMAL : SW_HIDE); |
1235 | 1303 | ::SetActiveWindow(m_hPopupWnd); |
1304 | + | |
1236 | 1305 | return S_OK; |
1237 | 1306 | } |
1238 | 1307 | |
1239 | 1308 | STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim, BOOL* pRet) |
1240 | 1309 | { |
1310 | + if (!pRet) { | |
1311 | + return E_POINTER; | |
1312 | + } | |
1313 | + | |
1241 | 1314 | SafeCreateWnd(); |
1242 | - *pRet = false; | |
1315 | + *pRet = VB_FALSE; | |
1243 | 1316 | |
1244 | 1317 | // 待機時間の取得 |
1245 | 1318 | DWORD sleeptim = 1000; |
@@ -1251,8 +1324,8 @@ STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim, BOOL* pRet) | ||
1251 | 1324 | sleeptim = INFINITE; |
1252 | 1325 | } |
1253 | 1326 | |
1254 | - HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = {NULL}; | |
1255 | - HWND hWnd[MAXIMUM_WAIT_OBJECTS] = {NULL}; | |
1327 | + HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = { NULL }; | |
1328 | + HWND hWnd[MAXIMUM_WAIT_OBJECTS] = { NULL }; | |
1256 | 1329 | int cnt = 0; |
1257 | 1330 | SetWaitParam(&cnt, hWnd, hEvent); |
1258 | 1331 | *pRet = MessageLoop(sleeptim, cnt, hWnd, hEvent) ? VB_TRUE : VB_FALSE; |
@@ -1263,137 +1336,147 @@ STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim, BOOL* pRet) | ||
1263 | 1336 | STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt) |
1264 | 1337 | { |
1265 | 1338 | SafeCreateWnd(); |
1266 | - HRESULT hRet = S_OK; | |
1339 | + | |
1340 | + HRESULT hr; | |
1341 | + | |
1267 | 1342 | CComVariant tmp; |
1268 | - if (tmp.ChangeType(VT_BSTR, &fmt) == S_OK) { | |
1269 | - ATL::CString buf(tmp.bstrVal); | |
1270 | - | |
1271 | - // 古いメニューを破棄する | |
1272 | - if (m_hMenu) { | |
1273 | - m_cMenuMap.clear(); | |
1274 | - ::SetMenu(m_hPopupWnd, NULL); | |
1275 | - DestroyMenu(m_hMenu); | |
1276 | - m_hMenu = NULL; | |
1277 | - } | |
1343 | + if (FAILED(hr = tmp.ChangeType(VT_BSTR, &fmt))) { | |
1344 | + return hr; | |
1345 | + } | |
1278 | 1346 | |
1279 | - if (buf.GetLength() > 0) { | |
1280 | - // 項目があればメニュー名をパースする | |
1281 | - m_hMenu = CreateMenu(); | |
1282 | - TCHAR menuname[MAX_PATH]; | |
1283 | - TCHAR szSubmenu[MAX_PATH]; | |
1284 | - HMENU hPopupMenu = NULL; | |
1285 | - int lv1 = 0; | |
1286 | - int lv2 = 0; | |
1287 | - int cmd = 0; | |
1288 | - | |
1289 | - LPTSTR p = buf.GetBuffer(); | |
1290 | - while (*p) { | |
1291 | - while (*p == ' ' || *p == '\t') p++; // ブランクスキップ | |
1292 | - if (*p == '/') { | |
1293 | - p++; | |
1294 | - // ポップアップメニューの作成 | |
1295 | - if (hPopupMenu) { | |
1296 | - // 既存のポップアップを埋め込む | |
1297 | - MENUITEMINFO inf = {0}; | |
1298 | - inf.cbSize = sizeof(MENUITEMINFO); | |
1299 | - inf.fMask = MIIM_SUBMENU | MIIM_TYPE; | |
1300 | - inf.fType = MFT_STRING; | |
1301 | - inf.dwTypeData = szSubmenu; | |
1302 | - inf.hSubMenu = hPopupMenu; | |
1303 | - InsertMenuItem(m_hMenu, lv1, true, &inf); | |
1304 | - } | |
1305 | - lv1++; | |
1306 | - lv2 = 0; | |
1307 | - cmd = 0; | |
1347 | + ATL::CString buf(tmp.bstrVal); | |
1308 | 1348 | |
1309 | - hPopupMenu = CreatePopupMenu(); | |
1349 | + // 古いメニューを破棄する | |
1350 | + if (m_hMenu) { | |
1351 | + m_cMenuMap.clear(); | |
1352 | + ::SetMenu(m_hPopupWnd, NULL); | |
1353 | + DestroyMenu(m_hMenu); | |
1354 | + m_hMenu = NULL; | |
1355 | + } | |
1356 | + | |
1357 | + if (buf.GetLength() > 0) { | |
1358 | + // 項目があればメニュー名をパースする | |
1359 | + m_hMenu = CreateMenu(); | |
1360 | + TCHAR menuname[MAX_PATH]; | |
1361 | + TCHAR szSubmenu[MAX_PATH]; | |
1362 | + HMENU hPopupMenu = NULL; | |
1363 | + int lv1 = 0; | |
1364 | + int lv2 = 0; | |
1365 | + int cmd = 0; | |
1366 | + | |
1367 | + LPTSTR p = buf.GetBuffer(); | |
1368 | + while (*p) { | |
1369 | + while (*p == ' ' || *p == '\t') p++; // ブランクスキップ | |
1370 | + if (*p == '/') { | |
1371 | + p++; | |
1372 | + // ポップアップメニューの作成 | |
1373 | + if (hPopupMenu) { | |
1374 | + // 既存のポップアップを埋め込む | |
1375 | + MENUITEMINFO inf = { 0 }; | |
1376 | + inf.cbSize = sizeof(MENUITEMINFO); | |
1377 | + inf.fMask = MIIM_SUBMENU | MIIM_TYPE; | |
1378 | + inf.fType = MFT_STRING; | |
1379 | + inf.dwTypeData = szSubmenu; | |
1380 | + inf.hSubMenu = hPopupMenu; | |
1381 | + InsertMenuItem(m_hMenu, lv1, true, &inf); | |
1382 | + } | |
1383 | + lv1++; | |
1384 | + lv2 = 0; | |
1385 | + cmd = 0; | |
1386 | + | |
1387 | + hPopupMenu = CreatePopupMenu(); | |
1388 | + LPTSTR st = p; | |
1389 | + while (*p && *p != ',' && *p != '/' && *p != ':') { | |
1390 | + p = CharNext(p); | |
1391 | + } | |
1392 | + ZeroMemory(szSubmenu, MAX_PATH); | |
1393 | + int submenuLen = p - st; | |
1394 | + if (submenuLen > 0) { | |
1395 | + _tcsncpy_s(szSubmenu, MAX_PATH, st, submenuLen); | |
1396 | + } | |
1397 | + if (*p == ',' || *p == ':') { | |
1398 | + p++; | |
1399 | + } | |
1400 | + } | |
1401 | + else { | |
1402 | + // メニューの作成 | |
1403 | + if (hPopupMenu) { | |
1310 | 1404 | LPTSTR st = p; |
1311 | 1405 | while (*p && *p != ',' && *p != '/' && *p != ':') { |
1312 | 1406 | p = CharNext(p); |
1313 | 1407 | } |
1314 | - ZeroMemory(szSubmenu, MAX_PATH); | |
1315 | - int submenuLen = p - st; | |
1316 | - if (submenuLen > 0) { | |
1317 | - _tcsncpy_s(szSubmenu, MAX_PATH, st, submenuLen); | |
1318 | - } | |
1319 | - if (*p == ',' || *p == ':') { | |
1320 | - p++; | |
1408 | + | |
1409 | + ZeroMemory(menuname, MAX_PATH); | |
1410 | + int menunameLen = p - st; | |
1411 | + if (menunameLen > 0) { | |
1412 | + _tcsncpy_s(menuname, MAX_PATH, st, menunameLen); | |
1321 | 1413 | } |
1322 | - } | |
1323 | - else { | |
1324 | - // メニューの作成 | |
1325 | - if (hPopupMenu) { | |
1326 | - LPTSTR st = p; | |
1327 | - while (*p && *p != ',' && *p != '/' && *p != ':') { | |
1328 | - p = CharNext(p); | |
1329 | - } | |
1330 | 1414 | |
1331 | - ZeroMemory(menuname, MAX_PATH); | |
1332 | - int menunameLen = p - st; | |
1333 | - if (menunameLen > 0) { | |
1334 | - _tcsncpy_s(menuname, MAX_PATH, st, menunameLen); | |
1335 | - } | |
1415 | + // コマンドセパレーターを検査する | |
1416 | + CComBSTR eventname; | |
1417 | + LPTSTR findcmd = _tcschr(menuname, _TEXT('@')); | |
1418 | + if (findcmd) { | |
1419 | + *findcmd = 0; | |
1420 | + eventname = findcmd + 1; | |
1336 | 1421 | |
1337 | - // コマンドセパレーターを検査する | |
1338 | - CComBSTR eventname; | |
1339 | - LPTSTR findcmd = _tcschr(menuname, _TEXT('@')); | |
1340 | - if (findcmd) { | |
1341 | - *findcmd = 0; | |
1342 | - eventname = findcmd + 1; | |
1343 | - | |
1344 | - } else { | |
1345 | - TCHAR tmp[64]; | |
1346 | - wsprintf(tmp, _TEXT("OnMenu%d"), lv1 * 100 + cmd); | |
1347 | - eventname = tmp; | |
1348 | - } | |
1349 | - m_cMenuMap.insert(std::make_pair(lv1 * 100 + cmd, eventname)); | |
1422 | + } | |
1423 | + else { | |
1424 | + TCHAR tmp[64]; | |
1425 | + wsprintf(tmp, _TEXT("OnMenu%d"), lv1 * 100 + cmd); | |
1426 | + eventname = tmp; | |
1427 | + } | |
1428 | + m_cMenuMap.insert(std::make_pair(lv1 * 100 + cmd, eventname)); | |
1350 | 1429 | |
1351 | - // メニューの作成 | |
1352 | - MENUITEMINFO inf = {0}; | |
1430 | + // メニューの作成 | |
1431 | + MENUITEMINFO inf = { 0 }; | |
1432 | + inf.cbSize = sizeof(MENUITEMINFO); | |
1433 | + inf.fMask = MIIM_TYPE | MIIM_ID; | |
1434 | + inf.fType = MFT_STRING; | |
1435 | + inf.wID = lv1 * 100 + cmd; | |
1436 | + inf.dwTypeData = menuname; | |
1437 | + InsertMenuItem(hPopupMenu, lv2, true, &inf); | |
1438 | + lv2++; | |
1439 | + cmd++; | |
1440 | + | |
1441 | + // セパレーターの指定か? | |
1442 | + if (*p == ',') { | |
1443 | + p++; | |
1444 | + | |
1445 | + } | |
1446 | + else if (*p == ':') { | |
1447 | + MENUITEMINFO inf = { 0 }; | |
1353 | 1448 | inf.cbSize = sizeof(MENUITEMINFO); |
1354 | - inf.fMask = MIIM_TYPE | MIIM_ID; | |
1355 | - inf.fType = MFT_STRING; | |
1356 | - inf.wID = lv1 * 100 + cmd; | |
1357 | - inf.dwTypeData = menuname; | |
1449 | + inf.fMask = MIIM_TYPE; | |
1450 | + inf.fType = MFT_SEPARATOR; | |
1358 | 1451 | InsertMenuItem(hPopupMenu, lv2, true, &inf); |
1452 | + p++; | |
1359 | 1453 | lv2++; |
1360 | - cmd++; | |
1361 | - | |
1362 | - // セパレーターの指定か? | |
1363 | - if (*p == ',') { | |
1364 | - p++; | |
1365 | - | |
1366 | - } else if (*p == ':') { | |
1367 | - MENUITEMINFO inf = {0}; | |
1368 | - inf.cbSize = sizeof(MENUITEMINFO); | |
1369 | - inf.fMask = MIIM_TYPE; | |
1370 | - inf.fType = MFT_SEPARATOR; | |
1371 | - InsertMenuItem(hPopupMenu, lv2, true, &inf); | |
1372 | - p++; | |
1373 | - lv2++; | |
1374 | - } | |
1375 | 1454 | } |
1376 | 1455 | } |
1377 | 1456 | } |
1378 | - // 未挿入のポップアップメニューの挿入 | |
1379 | - if (hPopupMenu) { | |
1380 | - // 既存のポップアップを埋め込む | |
1381 | - MENUITEMINFO inf = {0}; | |
1382 | - inf.cbSize = sizeof(MENUITEMINFO); | |
1383 | - inf.fMask = MIIM_SUBMENU | MIIM_TYPE; | |
1384 | - inf.fType = MFT_STRING; | |
1385 | - inf.dwTypeData = szSubmenu; | |
1386 | - inf.hSubMenu = hPopupMenu; | |
1387 | - InsertMenuItem(m_hMenu, lv1, true, &inf); | |
1388 | - } | |
1389 | - ::SetMenu(m_hPopupWnd, m_hMenu); | |
1390 | 1457 | } |
1458 | + // 未挿入のポップアップメニューの挿入 | |
1459 | + if (hPopupMenu) { | |
1460 | + // 既存のポップアップを埋め込む | |
1461 | + MENUITEMINFO inf = { 0 }; | |
1462 | + inf.cbSize = sizeof(MENUITEMINFO); | |
1463 | + inf.fMask = MIIM_SUBMENU | MIIM_TYPE; | |
1464 | + inf.fType = MFT_STRING; | |
1465 | + inf.dwTypeData = szSubmenu; | |
1466 | + inf.hSubMenu = hPopupMenu; | |
1467 | + InsertMenuItem(m_hMenu, lv1, true, &inf); | |
1468 | + } | |
1469 | + ::SetMenu(m_hPopupWnd, m_hMenu); | |
1391 | 1470 | } |
1392 | - return hRet; | |
1471 | + return S_OK; | |
1393 | 1472 | } |
1394 | 1473 | |
1395 | -STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd, VARIANT* pRet) | |
1474 | +STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT pcmd, VARIANT* pRet) | |
1396 | 1475 | { |
1476 | + if (!pRet) { | |
1477 | + return E_POINTER; | |
1478 | + } | |
1479 | + | |
1397 | 1480 | SafeCreateWnd(); |
1398 | 1481 | |
1399 | 1482 | CComVariant varRet; |
@@ -1401,80 +1484,86 @@ STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd, VARIAN | ||
1401 | 1484 | |
1402 | 1485 | int nCommand = 0; |
1403 | 1486 | CComVariant varCmd; |
1404 | - if (varCmd.ChangeType(VT_I2, &cmd) == S_OK) { | |
1487 | + if (SUCCEEDED(varCmd.ChangeType(VT_I2, &pcmd))) { | |
1405 | 1488 | nCommand = varCmd.iVal; |
1406 | 1489 | } |
1407 | 1490 | |
1491 | + HRESULT hr; | |
1492 | + | |
1408 | 1493 | CComVariant varText; |
1409 | - if (varText.ChangeType(VT_BSTR, &text) == S_OK) { | |
1410 | - TCHAR menuname[MAX_PATH]; | |
1494 | + if (FAILED(hr = varText.ChangeType(VT_BSTR, &text))) { | |
1495 | + return hr; | |
1496 | + } | |
1411 | 1497 | |
1412 | - ATL::CString buf(varText.bstrVal); | |
1413 | - UINT len = buf.GetLength() + 1; | |
1414 | - LPTSTR p = buf.GetBuffer(); | |
1498 | + TCHAR menuname[MAX_PATH]; | |
1415 | 1499 | |
1416 | - int lv = 0; | |
1417 | - int cmd = 0; | |
1418 | - HMENU hPopupMenu = CreatePopupMenu(); | |
1419 | - while (*p) { | |
1420 | - LPTSTR st = p; | |
1421 | - while (*p == ' ' || *p == '\t') { | |
1422 | - p++; | |
1423 | - } | |
1424 | - while (*p && *p != ',' && *p != '/' && *p != ':') { | |
1425 | - p = CharNext(p); | |
1426 | - } | |
1427 | - ZeroMemory(menuname, MAX_PATH); | |
1428 | - int menunameLen = p - st; | |
1429 | - if (menunameLen > 0) { | |
1430 | - _tcsncpy_s(menuname, MAX_PATH, st, menunameLen); | |
1431 | - } | |
1432 | - MENUITEMINFO inf = {0}; | |
1433 | - inf.cbSize = sizeof(MENUITEMINFO); | |
1434 | - inf.fMask = MIIM_TYPE | MIIM_ID; | |
1435 | - inf.fType = MFT_STRING; | |
1500 | + ATL::CString buf(varText.bstrVal); | |
1501 | + UINT len = buf.GetLength() + 1; | |
1502 | + LPTSTR p = buf.GetBuffer(); | |
1503 | + | |
1504 | + int lv = 0; | |
1505 | + int cmd = 0; | |
1506 | + HMENU hPopupMenu = CreatePopupMenu(); | |
1507 | + while (*p) { | |
1508 | + LPTSTR st = p; | |
1509 | + while (*p == ' ' || *p == '\t') { | |
1510 | + p++; | |
1511 | + } | |
1512 | + while (*p && *p != ',' && *p != '/' && *p != ':') { | |
1513 | + p = CharNext(p); | |
1514 | + } | |
1515 | + ZeroMemory(menuname, MAX_PATH); | |
1516 | + int menunameLen = p - st; | |
1517 | + if (menunameLen > 0) { | |
1518 | + _tcsncpy_s(menuname, MAX_PATH, st, menunameLen); | |
1519 | + } | |
1520 | + MENUITEMINFO inf = { 0 }; | |
1521 | + inf.cbSize = sizeof(MENUITEMINFO); | |
1522 | + inf.fMask = MIIM_TYPE | MIIM_ID; | |
1523 | + inf.fType = MFT_STRING; | |
1436 | 1524 | |
1437 | - if (nCommand != 0) { | |
1438 | - inf.wID = nCommand + cmd; | |
1525 | + if (nCommand != 0) { | |
1526 | + inf.wID = nCommand + cmd; | |
1439 | 1527 | |
1440 | - } else { | |
1441 | - // コマンドベースが0ならばコマンドイベントは発生させない。 | |
1442 | - // TrackPopupMenuはコマンドを選択しなかった場合は0を返すため、0よりも大きな値にする必要がある。 | |
1443 | - inf.wID = nCommand + cmd + 1; | |
1444 | - } | |
1528 | + } | |
1529 | + else { | |
1530 | + // コマンドベースが0ならばコマンドイベントは発生させない。 | |
1531 | + // TrackPopupMenuはコマンドを選択しなかった場合は0を返すため、0よりも大きな値にする必要がある。 | |
1532 | + inf.wID = nCommand + cmd + 1; | |
1533 | + } | |
1445 | 1534 | |
1446 | - inf.dwTypeData = menuname; | |
1447 | - InsertMenuItem(hPopupMenu, lv, true, &inf); | |
1448 | - lv++; | |
1449 | - cmd++; | |
1535 | + inf.dwTypeData = menuname; | |
1536 | + InsertMenuItem(hPopupMenu, lv, true, &inf); | |
1537 | + lv++; | |
1538 | + cmd++; | |
1450 | 1539 | |
1451 | - if (*p == ',' || *p == '/') { | |
1452 | - p++; | |
1540 | + if (*p == ',' || *p == '/') { | |
1541 | + p++; | |
1453 | 1542 | |
1454 | - } else if (*p == ':') { | |
1455 | - inf.fMask = MIIM_TYPE; | |
1456 | - inf.fType = MFT_SEPARATOR; | |
1457 | - InsertMenuItem(hPopupMenu, lv, true, &inf); | |
1458 | - p++; | |
1459 | - lv++; | |
1460 | - } | |
1461 | 1543 | } |
1544 | + else if (*p == ':') { | |
1545 | + inf.fMask = MIIM_TYPE; | |
1546 | + inf.fType = MFT_SEPARATOR; | |
1547 | + InsertMenuItem(hPopupMenu, lv, true, &inf); | |
1548 | + p++; | |
1549 | + lv++; | |
1550 | + } | |
1551 | + } | |
1462 | 1552 | |
1463 | - // TrackPopupMene | |
1464 | - DWORD pos = GetMessagePos(); | |
1465 | - ::SetFocus(m_hPopupWnd); | |
1466 | - varRet = (SHORT) ::TrackPopupMenuEx(hPopupMenu, | |
1467 | - TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | | |
1468 | - (nCommand == 0 ? (TPM_NONOTIFY | TPM_RETURNCMD) : 0), // コマンドベースが0であれば、コマンドイベントを通知させない。 | |
1469 | - LOWORD(pos), | |
1470 | - HIWORD(pos), | |
1471 | - m_hPopupWnd, | |
1472 | - NULL); | |
1553 | + // TrackPopupMene | |
1554 | + DWORD pos = GetMessagePos(); | |
1555 | + ::SetFocus(m_hPopupWnd); | |
1556 | + varRet = (SHORT) ::TrackPopupMenuEx(hPopupMenu, | |
1557 | + TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | | |
1558 | + (nCommand == 0 ? (TPM_NONOTIFY | TPM_RETURNCMD) : 0), // コマンドベースが0であれば、コマンドイベントを通知させない。 | |
1559 | + LOWORD(pos), | |
1560 | + HIWORD(pos), | |
1561 | + m_hPopupWnd, | |
1562 | + NULL); | |
1473 | 1563 | |
1474 | - DestroyMenu(hPopupMenu); | |
1475 | - } | |
1476 | - varRet.Detach(pRet); | |
1477 | - return S_OK; | |
1564 | + DestroyMenu(hPopupMenu); | |
1565 | + | |
1566 | + return varRet.Detach(pRet); | |
1478 | 1567 | } |
1479 | 1568 | |
1480 | 1569 | STDMETHODIMP COverlappedWindow::get_HWND(long *pVal) |
@@ -1521,7 +1610,8 @@ STDMETHODIMP COverlappedWindow::SetTimer(VARIANT tim, BOOL* pVal) | ||
1521 | 1610 | if (timer) { |
1522 | 1611 | *pVal = ::SetTimer(m_hPopupWnd, 1, timer, NULL) ? VB_TRUE : VB_FALSE; |
1523 | 1612 | |
1524 | - } else { | |
1613 | + } | |
1614 | + else { | |
1525 | 1615 | *pVal = ::KillTimer(m_hPopupWnd, 1) ? VB_TRUE : VB_FALSE; |
1526 | 1616 | } |
1527 | 1617 | return S_OK; |
@@ -1549,7 +1639,7 @@ STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode) | ||
1549 | 1639 | |
1550 | 1640 | if (nCmd >= 100) { |
1551 | 1641 | // メニューコマンドは100以上であるので。 |
1552 | - MENUITEMINFO inf = {0}; | |
1642 | + MENUITEMINFO inf = { 0 }; | |
1553 | 1643 | inf.cbSize = sizeof(MENUITEMINFO); |
1554 | 1644 | inf.fMask = MIIM_STATE; |
1555 | 1645 | inf.fState = nMode ? MFS_CHECKED : MFS_UNCHECKED; |
@@ -1580,7 +1670,7 @@ STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode) | ||
1580 | 1670 | |
1581 | 1671 | if (nCmd >= 100) { |
1582 | 1672 | // メニューコマンドは100以上であるので。 |
1583 | - MENUITEMINFO inf = {0}; | |
1673 | + MENUITEMINFO inf = { 0 }; | |
1584 | 1674 | inf.cbSize = sizeof(MENUITEMINFO); |
1585 | 1675 | inf.fMask = MIIM_STATE; |
1586 | 1676 | inf.fState = nMode ? MFS_ENABLED : MFS_GRAYED; |
@@ -1661,9 +1751,7 @@ STDMETHODIMP COverlappedWindow::get_DropFiles(VARIANT *pVal) | ||
1661 | 1751 | return E_POINTER; |
1662 | 1752 | } |
1663 | 1753 | |
1664 | - m_dropfiles.GetPathArray(pVal); | |
1665 | - | |
1666 | - return S_OK; | |
1754 | + return m_dropfiles.GetPathArray(pVal); | |
1667 | 1755 | } |
1668 | 1756 | |
1669 | 1757 | STDMETHODIMP COverlappedWindow::get_Quit(BOOL *pVal) |
@@ -1714,20 +1802,24 @@ STDMETHODIMP COverlappedWindow::get_Style(long *pVal) | ||
1714 | 1802 | return E_POINTER; |
1715 | 1803 | } |
1716 | 1804 | |
1805 | + DWORD style; | |
1717 | 1806 | if (m_hPopupWnd) { |
1718 | - windowParam.style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE); | |
1807 | + style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE); | |
1808 | + | |
1809 | + } | |
1810 | + else { | |
1811 | + style = windowParam.ComputeStyle(); | |
1719 | 1812 | } |
1720 | 1813 | |
1721 | - *pVal = (long)windowParam.style; | |
1814 | + *pVal = (long)style; | |
1722 | 1815 | |
1723 | 1816 | return S_OK; |
1724 | 1817 | } |
1725 | 1818 | |
1726 | 1819 | STDMETHODIMP COverlappedWindow::put_Style(long newVal) |
1727 | 1820 | { |
1728 | - windowParam.style = (DWORD)newVal; | |
1729 | 1821 | if (m_hPopupWnd) { |
1730 | - ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.style); | |
1822 | + ::SetWindowLong(m_hPopupWnd, GWL_STYLE, (DWORD)newVal); | |
1731 | 1823 | } |
1732 | 1824 | return S_OK; |
1733 | 1825 | } |
@@ -1810,7 +1902,7 @@ STDMETHODIMP COverlappedWindow::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VA | ||
1810 | 1902 | if (m_pForm) { |
1811 | 1903 | // フォームのサイズを変更する |
1812 | 1904 | m_pForm->SetWindowSize(windowParam.width, windowParam.height, |
1813 | - windowParam.GetStyle(), windowParam.exstyle); | |
1905 | + windowParam.ComputeStyle(), windowParam.exstyle); | |
1814 | 1906 | } |
1815 | 1907 | CreateThisInterface(pvarUnk); |
1816 | 1908 | return S_OK; |
@@ -1849,7 +1941,7 @@ STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT captio | ||
1849 | 1941 | windowParam.maxbox = (varMaxMin.iVal & 0x02); |
1850 | 1942 | } |
1851 | 1943 | if (m_hPopupWnd) { |
1852 | - ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.GetStyle()); | |
1944 | + ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.ComputeStyle()); | |
1853 | 1945 | Refresh(); |
1854 | 1946 | } |
1855 | 1947 | CreateThisInterface(pvarUnk); |
@@ -1863,7 +1955,7 @@ void COverlappedWindow::PurgeUnusedWindows() | ||
1863 | 1955 | while (p != m_lstChild.end()) { |
1864 | 1956 | DWORD refCount = (*p)->m_dwRef; |
1865 | 1957 | if ((*p)->m_dwRef == 1) { |
1866 | - // 参照カウントが1しかない = このクラスしか使っていない = 不要 | |
1958 | + // 参照カウントが1しかない = このクラスしか使っていない = 不要候補 | |
1867 | 1959 | BOOL bVisible = false; |
1868 | 1960 | (*p)->get_Visible(&bVisible); |
1869 | 1961 | if (!bVisible) { |
@@ -2190,7 +2282,8 @@ STDMETHODIMP COverlappedWindow::CenterWindow() | ||
2190 | 2282 | // 親ウィンドウがあれば、その中央に位置あわせする |
2191 | 2283 | ::GetWindowRect(m_hParentWnd, &rct); |
2192 | 2284 | |
2193 | - } else { | |
2285 | + } | |
2286 | + else { | |
2194 | 2287 | HWND hwnd = ::GetDesktopWindow(); |
2195 | 2288 | if (!hwnd) { |
2196 | 2289 | return S_OK; |
@@ -2200,7 +2293,7 @@ STDMETHODIMP COverlappedWindow::CenterWindow() | ||
2200 | 2293 | |
2201 | 2294 | int x = rct.left + (rct.right - rct.left) / 2 - windowParam.width / 2; |
2202 | 2295 | int y = rct.top + (rct.bottom - rct.top) / 2 - windowParam.height / 2; |
2203 | - WINDOWPLACEMENT pls = {0}; | |
2296 | + WINDOWPLACEMENT pls = { 0 }; | |
2204 | 2297 | pls.length = sizeof(WINDOWPLACEMENT); |
2205 | 2298 | pls.rcNormalPosition.top = y; |
2206 | 2299 | pls.rcNormalPosition.left = x; |
@@ -2228,17 +2321,22 @@ STDMETHODIMP COverlappedWindow::get_ClassObject(VARIANT* pVal) | ||
2228 | 2321 | STDMETHODIMP COverlappedWindow::put_ClassObject(VARIANT newVal) |
2229 | 2322 | { |
2230 | 2323 | if (m_pClassDisp) { |
2231 | - m_pClassDisp->Release(); | |
2232 | - m_pClassDisp = NULL; | |
2324 | + // 現在の参照を解除する. | |
2325 | + m_pClassDisp.Release(); | |
2233 | 2326 | } |
2234 | 2327 | |
2235 | - if (newVal.vt == VT_DISPATCH) { | |
2236 | - m_pClassDisp = newVal.pdispVal; | |
2237 | - m_pClassDisp->AddRef(); | |
2328 | + if (newVal.vt == VT_EMPTY || newVal.vt == VT_ERROR || newVal.vt == VT_NULL) { | |
2329 | + // 省略時またはNULL, EMPTYの場合は参照解除のみ | |
2330 | + return S_FALSE; | |
2238 | 2331 | } |
2239 | - else if (!(newVal.vt == VT_EMPTY || newVal.vt == VT_ERROR || newVal.vt == VT_NULL)) { | |
2332 | + | |
2333 | + if (newVal.vt != VT_DISPATCH) { | |
2334 | + // DISPATCHインターフェイス以外が指定された場合 | |
2240 | 2335 | return DISP_E_TYPEMISMATCH; |
2241 | 2336 | } |
2337 | + | |
2338 | + m_pClassDisp = newVal.pdispVal; | |
2339 | + | |
2242 | 2340 | return S_OK; |
2243 | 2341 | } |
2244 | 2342 |
@@ -2247,46 +2345,75 @@ HRESULT COverlappedWindow::ClassObjectInvoke(LPCWSTR handler) | ||
2247 | 2345 | if (!m_pClassDisp) { |
2248 | 2346 | return S_FALSE; |
2249 | 2347 | } |
2250 | - DISPID dispid; | |
2348 | + | |
2251 | 2349 | HRESULT hr; |
2252 | - if (FAILED(hr = m_pClassDisp->GetIDsOfNames(IID_NULL, (LPWSTR*)&handler, 1, LOCALE_SYSTEM_DEFAULT, &dispid))) { | |
2350 | + | |
2351 | + DISPID dispid; | |
2352 | + if (FAILED(hr = m_pClassDisp->GetIDsOfNames(IID_NULL, | |
2353 | + (LPWSTR*)&handler, 1, LOCALE_SYSTEM_DEFAULT, &dispid))) { | |
2253 | 2354 | return hr; |
2254 | 2355 | } |
2255 | - DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; | |
2256 | - return m_pClassDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, NULL, NULL, NULL); | |
2356 | + | |
2357 | + DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0 }; | |
2358 | + | |
2359 | + return m_pClassDisp->Invoke(dispid, | |
2360 | + IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, | |
2361 | + &dispparamsNoArgs, NULL, NULL, NULL); | |
2257 | 2362 | } |
2258 | 2363 | |
2259 | 2364 | STDMETHODIMP COverlappedWindow::get_ClientWidth(long *pVal) |
2260 | 2365 | { |
2366 | + if (!pVal) { | |
2367 | + return E_POINTER; | |
2368 | + } | |
2261 | 2369 | SafeCreateWnd(); |
2370 | + | |
2262 | 2371 | RECT rct; |
2263 | 2372 | ::GetClientRect(m_hPopupWnd, &rct); |
2373 | + | |
2264 | 2374 | *pVal = rct.right; |
2375 | + | |
2265 | 2376 | return S_OK; |
2266 | 2377 | } |
2267 | 2378 | |
2268 | 2379 | STDMETHODIMP COverlappedWindow::get_ClientHeight(long *pVal) |
2269 | 2380 | { |
2381 | + if (!pVal) { | |
2382 | + return E_POINTER; | |
2383 | + } | |
2270 | 2384 | SafeCreateWnd(); |
2385 | + | |
2271 | 2386 | RECT rct; |
2272 | 2387 | ::GetClientRect(m_hPopupWnd, &rct); |
2388 | + | |
2273 | 2389 | *pVal = rct.bottom; |
2390 | + | |
2274 | 2391 | return S_OK; |
2275 | 2392 | } |
2276 | 2393 | |
2277 | 2394 | STDMETHODIMP COverlappedWindow::get_innerWidth(double *pVal) |
2278 | 2395 | { |
2396 | + if (!pVal) { | |
2397 | + return E_POINTER; | |
2398 | + } | |
2399 | + | |
2279 | 2400 | SafeCreateWnd(); |
2401 | + | |
2280 | 2402 | RECT rct; |
2281 | 2403 | ::GetClientRect(m_hPopupWnd, &rct); |
2282 | - POINT pt = {rct.right, 0 - rct.bottom}; | |
2404 | + | |
2405 | + POINT pt = { rct.right, 0 - rct.bottom }; | |
2406 | + | |
2283 | 2407 | HDC hdc = ::GetWindowDC(m_hPopupWnd); |
2408 | + | |
2284 | 2409 | int md = ::GetMapMode(hdc); |
2285 | - ::SetMapMode(hdc, MM_LOMETRIC); | |
2410 | + ::SetMapMode(hdc, MM_LOMETRIC); // 論理単位を0.1mmへ変換する | |
2286 | 2411 | ::DPtoLP(hdc, &pt, 1); |
2287 | 2412 | ::SetMapMode(hdc, md); |
2288 | 2413 | ::ReleaseDC(m_hPopupWnd, hdc); |
2289 | - *pVal = pt.x / 10.; | |
2414 | + | |
2415 | + *pVal = pt.x / 10.; // ミリ単位へ | |
2416 | + | |
2290 | 2417 | return S_OK; |
2291 | 2418 | } |
2292 | 2419 |
@@ -2297,17 +2424,21 @@ STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal) | ||
2297 | 2424 | } |
2298 | 2425 | |
2299 | 2426 | SafeCreateWnd(); |
2427 | + | |
2300 | 2428 | RECT rct; |
2301 | 2429 | ::GetClientRect(m_hPopupWnd, &rct); |
2302 | - POINT pt = {rct.right, 0 - rct.bottom}; | |
2430 | + | |
2431 | + POINT pt = { rct.right, 0 - rct.bottom }; | |
2432 | + | |
2303 | 2433 | HDC hdc = ::GetWindowDC(m_hPopupWnd); |
2434 | + | |
2304 | 2435 | int md = ::GetMapMode(hdc); |
2305 | - ::SetMapMode(hdc, MM_LOMETRIC); | |
2436 | + ::SetMapMode(hdc, MM_LOMETRIC);// 論理単位を0.1mmへ変換する | |
2306 | 2437 | ::DPtoLP(hdc, &pt, 1); |
2307 | 2438 | ::SetMapMode(hdc, md); |
2308 | 2439 | ::ReleaseDC(m_hPopupWnd, hdc); |
2309 | 2440 | |
2310 | - *pVal = pt.y / 10.; | |
2441 | + *pVal = pt.y / 10.; // ミリ単位へ | |
2311 | 2442 | |
2312 | 2443 | return S_OK; |
2313 | 2444 | } |
@@ -2382,7 +2513,8 @@ STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText) | ||
2382 | 2513 | } |
2383 | 2514 | } |
2384 | 2515 | |
2385 | - } else if (IsClipboardFormatAvailable(CF_TEXT)) { | |
2516 | + } | |
2517 | + else if (IsClipboardFormatAvailable(CF_TEXT)) { | |
2386 | 2518 | // UNICODE文字列がない場合 |
2387 | 2519 | HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT); |
2388 | 2520 | if (hGlobal) { |
@@ -23,15 +23,17 @@ | ||
23 | 23 | |
24 | 24 | /////////////////////////////////////////////////////////////////////// |
25 | 25 | // ドロップされたファイルの保持 |
26 | -class dropfiledata | |
26 | +class CDropFileData | |
27 | 27 | { |
28 | 28 | public: |
29 | - dropfiledata() | |
29 | + CDropFileData() | |
30 | 30 | { |
31 | 31 | } |
32 | - ~dropfiledata(){ | |
32 | + | |
33 | + ~CDropFileData(){ | |
33 | 34 | Clear(); |
34 | 35 | } |
36 | + | |
35 | 37 | void Clear() |
36 | 38 | { |
37 | 39 | std::list<LPTSTR>::iterator p = m_lstPath.begin(); |
@@ -40,7 +42,8 @@ public: | ||
40 | 42 | p = m_lstPath.erase(p); |
41 | 43 | } |
42 | 44 | } |
43 | - void DropFiles(HDROP hDrop) | |
45 | + | |
46 | + void SetDropFiles(HDROP hDrop) | |
44 | 47 | { |
45 | 48 | Clear(); |
46 | 49 | int count = ::DragQueryFile(hDrop, -1, NULL, 0); |
@@ -51,29 +54,51 @@ public: | ||
51 | 54 | m_lstPath.push_back(pBuf); |
52 | 55 | } |
53 | 56 | } |
54 | - void GetPathArray(VARIANT *pvarPathName) | |
57 | + | |
58 | + HRESULT GetPathArray(VARIANT *pvarPathName) | |
55 | 59 | { |
60 | + if (!pvarPathName) { | |
61 | + return E_POINTER; | |
62 | + } | |
63 | + | |
64 | + VariantInit(pvarPathName); | |
56 | 65 | if (m_lstPath.empty()) { |
57 | 66 | // 空である |
58 | 67 | pvarPathName->vt = VT_EMPTY; |
59 | - return; | |
68 | + return S_FALSE; | |
60 | 69 | } |
70 | + | |
61 | 71 | SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, m_lstPath.size()); |
72 | + if (!pArray) { | |
73 | + return E_OUTOFMEMORY; | |
74 | + } | |
75 | + | |
62 | 76 | VARIANT* pvars; |
63 | - if (SafeArrayAccessData(pArray, (void**)&pvars) == S_OK) { | |
64 | - int i = 0; | |
65 | - std::list<LPTSTR>::iterator p = m_lstPath.begin(); | |
66 | - while (p != m_lstPath.end()) { | |
67 | - CComVariant wbuf(*p); | |
68 | - wbuf.Detach(&pvars[i]); | |
69 | - p++; | |
70 | - i++; | |
77 | + HRESULT hr; | |
78 | + if (FAILED(hr = SafeArrayAccessData(pArray, (void**)&pvars))) { | |
79 | + return hr; | |
80 | + } | |
81 | + int i = 0; | |
82 | + std::list<LPTSTR>::iterator p = m_lstPath.begin(); | |
83 | + while (p != m_lstPath.end()) { | |
84 | + CComVariant wbuf(*p); | |
85 | + hr = wbuf.Detach(&pvars[i]); | |
86 | + if (FAILED(hr)) { | |
87 | + break; | |
71 | 88 | } |
72 | - SafeArrayUnaccessData(pArray); | |
89 | + p++; | |
90 | + i++; | |
73 | 91 | } |
74 | - VariantInit(pvarPathName); | |
92 | + SafeArrayUnaccessData(pArray); | |
93 | + | |
94 | + if (FAILED(hr)) { | |
95 | + SafeArrayDestroy(pArray); | |
96 | + return hr; | |
97 | + } | |
98 | + | |
75 | 99 | pvarPathName->vt = VT_ARRAY | VT_VARIANT; |
76 | 100 | pvarPathName->parray = pArray; |
101 | + return S_OK; | |
77 | 102 | } |
78 | 103 | |
79 | 104 | protected: |
@@ -82,26 +107,25 @@ protected: | ||
82 | 107 | |
83 | 108 | ///////////////////////////////////////////////////////////////////////////// |
84 | 109 | // COverlappedWindow |
85 | -class CreateOverlappedWindow | |
110 | +struct OverlappedWindowParam | |
86 | 111 | { |
87 | -public: | |
88 | - CreateOverlappedWindow() | |
112 | + OverlappedWindowParam() | |
113 | + : exstyle(0) | |
114 | + , showMode(0) | |
115 | + , noclose(false) | |
116 | + , frametype(true) | |
117 | + , captionbar(true) | |
118 | + , systemmenu(true) | |
119 | + , minbox(true) | |
120 | + , maxbox(true) | |
121 | + , autoclose(true) | |
122 | + , automessageloop(true) | |
89 | 123 | { |
90 | - style = 0; | |
91 | - exstyle = 0; | |
92 | - showMode = 0; | |
93 | - noclose = false; | |
94 | - frametype = true; | |
95 | - captionbar = true; | |
96 | - systemmenu = true; | |
97 | - minbox = true; | |
98 | - maxbox = true; | |
99 | - autoclose = true; | |
100 | - automessageloop = true; | |
101 | 124 | ZeroMemory(szClassName, MAX_PATH); |
102 | 125 | posX = posY = width = height = 0; |
103 | 126 | } |
104 | - DWORD GetStyle() | |
127 | + | |
128 | + DWORD ComputeStyle() | |
105 | 129 | { |
106 | 130 | DWORD style = WS_CLIPCHILDREN | WS_OVERLAPPED; |
107 | 131 | if (captionbar) { style |= WS_CAPTION; } |
@@ -111,6 +135,7 @@ public: | ||
111 | 135 | if (maxbox) { style |= WS_MAXIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME; } |
112 | 136 | return style; |
113 | 137 | } |
138 | + | |
114 | 139 | inline void SetWindowPlacement(int x, int y, int w, int h) |
115 | 140 | { |
116 | 141 | posX = x; |
@@ -118,13 +143,14 @@ public: | ||
118 | 143 | width = w; |
119 | 144 | height = h; |
120 | 145 | } |
146 | + | |
121 | 147 | inline void SetWindowClassName(LPCTSTR name) |
122 | 148 | { |
123 | 149 | StringCchCopy(szClassName, MAX_PATH, name); |
124 | 150 | } |
151 | + | |
125 | 152 | TCHAR szClassName[MAX_PATH]; |
126 | 153 | DWORD wndstyle; |
127 | - DWORD style; | |
128 | 154 | DWORD exstyle; |
129 | 155 | int posX; |
130 | 156 | int posY; |
@@ -232,19 +258,27 @@ protected: | ||
232 | 258 | HRESULT ClassObjectInvoke(LPCWSTR handler); |
233 | 259 | |
234 | 260 | public: |
261 | + | |
262 | +#pragma region TRACEREF | |
263 | +#ifdef _DEBUG | |
264 | + /////////////////////////////// | |
265 | + // 参照カウントの追跡デバッグ用 | |
266 | + | |
235 | 267 | ULONG InternalAddRef() |
236 | 268 | { |
237 | 269 | ULONG ref = CComObjectRootEx<CComSingleThreadModel>::InternalAddRef(); |
238 | - ATLTRACE(_TEXT("*addref=%d\n"), ref); | |
270 | + ATLTRACE(_TEXT("* overlappedwindow: addref refcount=%d\n"), ref); | |
239 | 271 | return ref; |
240 | 272 | } |
241 | 273 | |
242 | 274 | ULONG InternalRelease() |
243 | 275 | { |
244 | 276 | ULONG ref = CComObjectRootEx<CComSingleThreadModel>::InternalRelease(); |
245 | - ATLTRACE(_TEXT("*release=%d\n"), ref); | |
277 | + ATLTRACE(_TEXT("* overlappedwindow:release refcount=%d\n"), ref); | |
246 | 278 | return ref; |
247 | 279 | } |
280 | +#endif | |
281 | +#pragma endregion | |
248 | 282 | |
249 | 283 | // IOverlappedWindow |
250 | 284 | public: |
@@ -267,17 +301,11 @@ public: | ||
267 | 301 | STDMETHOD(get_ExitCode)(/*[out, retval]*/ short *pVal); |
268 | 302 | STDMETHOD(put_ExitCode)(/*[in]*/ short newVal); |
269 | 303 | STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal); |
270 | - void MoveNextOverlapped(); | |
271 | - void CreateWindowList(std::list<HWND>& lstWnd, BOOL bSearchRoot); | |
272 | 304 | STDMETHOD(get_AutoClose)(/*[out, retval]*/ BOOL *pVal); |
273 | 305 | STDMETHOD(put_AutoClose)(/*[in]*/ BOOL newVal); |
274 | 306 | STDMETHOD(DoModal)(/*[out,retval]*/VARIANT* retcode); |
275 | 307 | STDMETHOD(get_AutoMessageLoop)(/*[out, retval]*/ BOOL *pVal); |
276 | 308 | STDMETHOD(put_AutoMessageLoop)(/*[in]*/ BOOL newVal); |
277 | - static DWORD MessageLoop(DWORD sleeptim, int count, HWND* hWnd, HANDLE* hEvent); | |
278 | - void SetWaitParam(int* count, HWND* phWnd, HANDLE* phWaitHandle); | |
279 | - HANDLE GetEventHandle(); | |
280 | - void SetParent(HWND hParent); | |
281 | 309 | STDMETHOD(CreateChild)(/*[out,retval]*/VARIANT* pvarUnk); |
282 | 310 | STDMETHOD(SetWindowStyle)(/*[in]*/VARIANT frametype,/*[in,optional]*/VARIANT caption_system,/*[in,optional]*/VARIANT maxmin,/*[out,retval]*/VARIANT* pvarUnk); |
283 | 311 | STDMETHOD(SetPlacement)(/*[in]*/VARIANT x,/*[in]*/VARIANT y,/*[in,optional]*/VARIANT w,/*[in,optional]*/VARIANT h,/*[out,retval]*/VARIANT* pvarUnk); |
@@ -293,23 +321,6 @@ public: | ||
293 | 321 | STDMETHOD(DoEvent)(/*[out,retval]*/VARIANT* varResult); |
294 | 322 | STDMETHOD(get_IsEventEmpty)(/*[out, retval]*/ BOOL *pVal); |
295 | 323 | STDMETHOD(SetTimer)(/*[in]*/VARIANT tim,/*[out,retval]*/BOOL* pVal); |
296 | - | |
297 | - HRESULT OnDraw(ATL_DRAWINFO& di) | |
298 | - { | |
299 | - RECT& rc = *(RECT*)di.prcBounds; | |
300 | - Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); | |
301 | - | |
302 | - SetTextAlign(di.hdcDraw, TA_CENTER | TA_BASELINE); | |
303 | - LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow"); | |
304 | - TextOut(di.hdcDraw, | |
305 | - (rc.left + rc.right) / 2, | |
306 | - (rc.top + rc.bottom) / 2, | |
307 | - pszText, | |
308 | - lstrlen(pszText)); | |
309 | - | |
310 | - return S_OK; | |
311 | - } | |
312 | - | |
313 | 324 | STDMETHOD(get_Caption)(/*[out, retval]*/ BSTR *pVal); |
314 | 325 | STDMETHOD(put_Caption)(/*[in]*/ BSTR newVal); |
315 | 326 | STDMETHOD(get_backColor)(/*[out, retval]*/ long *pVal); |
@@ -353,23 +364,61 @@ public: | ||
353 | 364 | STDMETHOD(put_TopMost)(/*[in]*/ BOOL newVal); |
354 | 365 | STDMETHOD(get_DoubleBuffer)(/*[out, retval]*/ BOOL *pVal); |
355 | 366 | STDMETHOD(put_DoubleBuffer)(/*[in]*/ BOOL newVal); |
367 | + | |
368 | +public: | |
369 | + void MoveNextOverlapped(); | |
370 | + void CreateWindowList(std::list<HWND>& lstWnd, BOOL bSearchRoot); | |
371 | + static DWORD MessageLoop(DWORD sleeptim, int count, HWND* hWnd, HANDLE* hEvent); | |
372 | + void SetWaitParam(int* count, HWND* phWnd, HANDLE* phWaitHandle); | |
373 | + HANDLE GetEventHandle(); | |
374 | + void SetParent(HWND hParent); | |
375 | + | |
376 | + HRESULT OnDraw(ATL_DRAWINFO& di) | |
377 | + { | |
378 | + RECT& rc = *(RECT*)di.prcBounds; | |
379 | + Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); | |
380 | + | |
381 | + SetTextAlign(di.hdcDraw, TA_CENTER | TA_BASELINE); | |
382 | + LPCTSTR pszText = _T("SeraphyScriptTools.OverlappedWindow"); | |
383 | + TextOut(di.hdcDraw, | |
384 | + (rc.left + rc.right) / 2, | |
385 | + (rc.top + rc.bottom) / 2, | |
386 | + pszText, | |
387 | + lstrlen(pszText)); | |
388 | + | |
389 | + return S_OK; | |
390 | + } | |
391 | + | |
392 | +public: | |
356 | 393 | CComBSTR m_bstrCaption; |
394 | + | |
357 | 395 | protected: |
358 | - HWND SafeCreateWnd(); | |
359 | - CreateOverlappedWindow windowParam; | |
396 | + OverlappedWindowParam windowParam; | |
397 | + | |
360 | 398 | CComObject<CCanvas>* m_pCanvas; |
399 | + | |
361 | 400 | CComObject<CForm>* m_pForm; |
401 | + | |
362 | 402 | CComObject<CEvent>* m_pEvent; |
403 | + | |
363 | 404 | CComObject<CObjectMap>* m_pObject; |
405 | + | |
364 | 406 | std::list<CComObject<CEvent>*> m_lstEvent; |
407 | + | |
365 | 408 | std::list<CComObject<COverlappedWindow>*> m_lstChild; |
366 | - std::vector<CComVariant> m_vectorObject; | |
367 | - dropfiledata m_dropfiles; | |
409 | + | |
410 | + CDropFileData m_dropfiles; | |
411 | + | |
368 | 412 | CRITICAL_SECTION m_objEventDataProtection; |
413 | + | |
369 | 414 | BOOL m_bAutoReleaseClassObject; |
415 | + | |
370 | 416 | BOOL m_bDefaultAction; |
371 | 417 | |
418 | + CComPtr<IDispatch> m_pClassDisp; | |
419 | + | |
372 | 420 | protected: |
421 | + HWND SafeCreateWnd(); | |
373 | 422 | static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); |
374 | 423 | void AddEvent(int message, WPARAM wParam, LPARAM lParam); |
375 | 424 | void AddEventSingle(int message, WPARAM wParam, LPARAM lParam); |
@@ -378,7 +427,6 @@ protected: | ||
378 | 427 | void PurgeUnusedWindows(); |
379 | 428 | |
380 | 429 | protected: |
381 | - IDispatch* m_pClassDisp; | |
382 | 430 | int m_dWaitCursor; |
383 | 431 | BOOL m_bQuit; |
384 | 432 | int m_dModalExitCode; |
@@ -4,7 +4,7 @@ | ||
4 | 4 | |
5 | 5 | |
6 | 6 | /* File created by MIDL compiler version 8.00.0603 */ |
7 | -/* at Tue Aug 18 01:30:13 2015 | |
7 | +/* at Wed Aug 19 06:02:15 2015 | |
8 | 8 | */ |
9 | 9 | /* Compiler settings for SeraphyScriptTools.idl: |
10 | 10 | Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.00.0603 |
@@ -58,11 +58,3 @@ extern ATL::CComModule _Module; | ||
58 | 58 | |
59 | 59 | #define VB_TRUE -1 |
60 | 60 | #define VB_FALSE 0 |
61 | - | |
62 | -/* | |
63 | -#if defined(_DEBUG) | |
64 | -#define ATLTRACE(mes) OutputDebugString(mes) | |
65 | -#else | |
66 | -#define ATLTRACE(mes) | |
67 | -#endif | |
68 | -*/ |
@@ -0,0 +1,40 @@ | ||
1 | +option explicit | |
2 | + | |
3 | +dim obj, edt, retcode | |
4 | +set obj = CreateObject("SeraphyScriptTools.Instance") | |
5 | + | |
6 | +wscript.ConnectObject obj.mainframe, "event_" | |
7 | +with obj.MainFrame | |
8 | + .AcceptFiles = True | |
9 | + .SetPlacement ,,350,260 | |
10 | + with .form | |
11 | + .label "ここにファイルをドロップします" | |
12 | + set edt = .edit(,20,10) | |
13 | + .controlbreak | |
14 | + .button("終了", 5).SetID(1) | |
15 | + end with | |
16 | + .Open "DropFiles" | |
17 | + retcode = .DoModal | |
18 | +end with | |
19 | +wscript.disconnectobject obj.mainframe | |
20 | +obj.dialog.messagebox "リターンコード = " & retcode | |
21 | + | |
22 | +sub event_OnSizeEx(wnd) | |
23 | + dim w | |
24 | + with wnd | |
25 | + w = .clientWidth - .form.RightMargin - .form.LeftMargin | |
26 | + end with | |
27 | + if not isempty(edt) then | |
28 | + edt.SetPlacement ,,w | |
29 | + end if | |
30 | +end sub | |
31 | + | |
32 | +sub event_OnDropFilesEx(wnd) | |
33 | + dim buf, file | |
34 | + buf = "" | |
35 | + for each file in wnd.DropFiles | |
36 | + buf = buf & file & vbcrlf | |
37 | + next | |
38 | + 'obj.dialog.messagebox buf | |
39 | + edt.Text = buf | |
40 | +end sub |
@@ -0,0 +1,34 @@ | ||
1 | +option explicit | |
2 | + | |
3 | +dim instance, fso, lst | |
4 | +set instance = createobject("SeraphyScriptTools.Instance") | |
5 | +set lst = createobject("SeraphyScriptTools.ObjectVector") | |
6 | +set fso = CreateObject("Scripting.FileSystemObject") | |
7 | + | |
8 | +dim dirname, msg, x | |
9 | +do | |
10 | + dirname = instance.dialog.browseforfolder(,dirname) | |
11 | + if len(dirname) > 0 then | |
12 | + dim folder | |
13 | + set folder = fso.GetFolder(dirname) | |
14 | + lst.Clear | |
15 | + EnumFolder folder, lst | |
16 | + msgbox lst.Count | |
17 | + msg = "" | |
18 | + for each x in lst '.MakeArray | |
19 | + msg = msg & "," & x | |
20 | + next | |
21 | + msgbox msg | |
22 | + else | |
23 | + exit do | |
24 | + end if | |
25 | +loop | |
26 | + | |
27 | +sub EnumFolder(folder, lst) | |
28 | + dim dirname,subfolder | |
29 | + dirname = folder.name | |
30 | + lst.Push dirname | |
31 | + for each subfolder in folder.subfolders | |
32 | + EnumFolder subfolder, lst | |
33 | + next | |
34 | +end sub |
@@ -2,4 +2,5 @@ dim pro1 | ||
2 | 2 | set pro1 = createobject("SeraphyScriptTools.privateprofile") |
3 | 3 | |
4 | 4 | dim sec1 |
5 | +' ↓ ここでエラーを発生させる. | |
5 | 6 | set sec1 = pro1.OpenSection("") |
@@ -13,6 +13,7 @@ set obj = new mainframe | ||
13 | 13 | class mainframe |
14 | 14 | public instance |
15 | 15 | public tree |
16 | + public dirname | |
16 | 17 | public sub class_initialize |
17 | 18 | set instance = createobject("seraphyscripttools.instance") |
18 | 19 | with instance.mainframe |
@@ -41,8 +42,8 @@ class mainframe | ||
41 | 42 | end sub |
42 | 43 | |
43 | 44 | public sub OnStart |
44 | - dim dirname,item,folder | |
45 | - dirname = instance.dialog.browseforfolder | |
45 | + dim item,folder | |
46 | + dirname = instance.dialog.browseforfolder(,dirname) | |
46 | 47 | if(len(dirname) > 0) then |
47 | 48 | item = null |
48 | 49 | set folder = fso.GetFolder(dirname) |
@@ -34,4 +34,34 @@ SAFEARRAY* GetArrayFromVariant(VARIANT& var, VARTYPE* pVt) | ||
34 | 34 | return pArray; |
35 | 35 | } |
36 | 36 | |
37 | +/** | |
38 | + * VARIANT型が変数(ByRef型)をさしている場合は、 | |
39 | + * それ自身が値となるようにByVal型に強制変換してコピーする. | |
40 | + * (ByValであれば単純にコピーする.) | |
41 | + */ | |
42 | +HRESULT VariantCopyByVal(VARIANT *pDestVal, const VARIANT *pSrcVal) | |
43 | +{ | |
44 | + if (!pDestVal || !pSrcVal) { | |
45 | + return E_POINTER; | |
46 | + } | |
47 | + ATLASSERT(pDestVal != pSrcVal); | |
48 | + | |
49 | + VariantInit(pDestVal); | |
50 | + | |
51 | + if (pSrcVal->vt & VT_BYREF) { | |
52 | + // ByRefの場合はByValに変換する. | |
53 | + VARTYPE vt = pSrcVal->vt & ~VT_BYREF; | |
37 | 54 | |
55 | + if (vt == VT_VARIANT) { | |
56 | + // Variantのポインタの場合は、そのポインタをコピーするのみ | |
57 | + return VariantCopy(pDestVal, pSrcVal->pvarVal); | |
58 | + } | |
59 | + else { | |
60 | + // 型変換を使ってByRefを外す | |
61 | + return VariantChangeType(pDestVal, pSrcVal, 0, vt); | |
62 | + } | |
63 | + } | |
64 | + | |
65 | + // ByValの場合はコピーするのみ | |
66 | + return VariantCopy(pDestVal, pSrcVal); | |
67 | +} |
@@ -3,3 +3,6 @@ | ||
3 | 3 | #pragma once |
4 | 4 | |
5 | 5 | SAFEARRAY* GetArrayFromVariant(VARIANT& var, VARTYPE* pVt); |
6 | + | |
7 | +HRESULT VariantCopyByVal(VARIANT *pDestVal, const VARIANT *pSrcVal); | |
8 | + |