1 // OverlappedWindow.cpp : COverlappedWindow
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
4 // /D "_ATL_MIN_CRT"
\82ð
\8aO
\82·
7 #include "SeraphyScriptTools.h"
8 #include "OverlappedWindow.h"
13 /////////////////////////////////////////////////////////////////////////////
17 HRESULT COverlappedWindow::FinalConstruct()
19 m_pUnkMarshaler = NULL;
21 //
\83A
\83C
\83R
\83\93\82Ì
\8f\89\8aú
\89»
24 //
\83C
\83x
\83\93\83g
\91Ò
\8b@
\97p
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\81A
\83C
\83x
\83\93\83g
\8f\88\97\9d\92\86\83Z
\83}
\83t
\83H
25 m_hWaitEvent = CreateEvent(NULL, false, false, NULL); //
\8e©
\93®
\83C
\83x
\83\93\83g :
\8f\89\8aúFALSE
26 //
\83N
\83\8a\83e
\83B
\83J
\83\8b\83Z
\83N
\83V
\83\87\83\93
27 InitializeCriticalSection(&m_objEventDataProtection);
29 //
\83C
\83x
\83\93\83g
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8f\89\8aú
\89»
31 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\8f\89\8aú
\89»
33 m_bAutoReleaseClassObject = true;
35 //
\83E
\83B
\83\93\83h
\83E
\83T
\83C
\83Y
36 //
\81¦ Windows2000
\8e\9e\91ã
\82Í300x300
\82¾
\82Á
\82½
\82ª
\81ALuna
\88È
\8d~
\82Å
\98g
\95\9d\82ª
\95Ï
\8dX
\82³
\82ê
\82½
\82±
\82Æ
\82É
\82æ
\82è
37 //
\89¡
\95\9d308
\82É
\8fC
\90³
\82µ
\82½
\81B(2015/08)
38 windowParam.SetWindowPlacement(CW_USEDEFAULT, CW_USEDEFAULT, 308, 300);
39 windowParam.noclose = false;
40 windowParam.doublebuffer = true;
41 windowParam.automessageloop = true;
42 //
\83o
\83b
\83N
\83O
\83\89\83E
\83\93\83h
\83u
\83\89\83V
43 m_dwBackColor = ::GetSysColor(COLOR_WINDOW);
44 m_hBkBrush = CreateSolidBrush(COLORREF(m_dwBackColor));
45 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\8dì
\90¬
50 //
\83\86\81[
\83U
\81[
\83\82\81[
\83h
\82Ì
\8f\89\8aú
\89»
51 m_bQuit = false; //
\95Â
\82¶
\82ç
\82ê
\82Ä
\82¢
\82È
\82¢
\82±
\82Æ
\82ð
\8e¦
\82·
52 m_dModalExitCode = 0; //
\83\82\81[
\83_
\83\8b\95Ô
\93\9a\83R
\81[
\83h
54 m_bDefaultAction = true; //
\83f
\83B
\83t
\83H
\83\8b\83g
\82ÌOK/CANCEL
\83A
\83N
\83V
\83\87\83\93\82Å
\95Â
\82¶
\82é
56 //
\83t
\83H
\81[
\83\80\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8dì
\90¬
57 m_hLastFocusControl = NULL;
62 //
\83t
\83H
\81[
\83\80\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\90¶
\90¬
64 if (FAILED(hr = CComObject<CForm>::CreateInstance(&m_pForm))) {
68 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
69 windowParam.ComputeStyle(), windowParam.exstyle);
71 //
\95`
\89æ
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\90¶
\90¬
73 if (FAILED(hr = CComObject<CCanvas>::CreateInstance(&m_pCanvas))) {
78 //
\83\86\81[
\83U
\81[
\92è
\8b`
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\90¶
\90¬
80 if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&m_pObject))) {
85 //
\83E
\83F
\83C
\83g
\83J
\81[
\83\
\83\8b\82Ì
\8f\89\8aú
\89»
88 //
\8fW
\96ñ
\82Ì
\82½
\82ß
\82Ì
\83t
\83\8a\81[
\83X
\83\8c\83b
\83h
\83}
\81[
\83V
\83\83\83\89\82Ì
\90Ý
\92è
89 return CoCreateFreeThreadedMarshaler(
90 GetControllingUnknown(), &m_pUnkMarshaler.p);
93 void COverlappedWindow::FinalRelease()
95 //
\83E
\83B
\83\93\83h
\83E
\82ª
\94j
\8aü
\82³
\82ê
\82é
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
\83C
\83x
\83\93\83g
97 ClassObjectInvoke(L"ExitWindow");
99 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\95ú
\8aü
101 m_pClassDisp.Release();
104 //
\83A
\83C
\83R
\83\93\82Ì
\94j
\8aü
106 ::DestroyIcon(m_hIcon);
108 //
\83`
\83\83\83C
\83\8b\83h
\83|
\83b
\83v
\83A
\83b
\83v
\82Ì
\94j
\8aü
109 std::list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
110 while (pWnd != m_lstChild.end()) {
113 pWnd = m_lstChild.erase(pWnd);
115 //
\83C
\83x
\83\93\83g
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
121 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\83f
\83^
\83b
\83`
\82Æ
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\95ú
\8aü
123 m_pCanvas->DetachOwner();
124 m_pCanvas->Release();
127 //
\83t
\83H
\81[
\83\80\82Ì
\94j
\8aü
129 m_pForm->DetachOwner();
133 //
\83\86\81[
\83U
\81[
\92è
\8b`
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
135 m_pObject->Release();
139 //
\94w
\8ci
\83u
\83\89\83V
\82Ì
\89ð
\95ú
141 DeleteObject(m_hBkBrush);
144 EnterCriticalSection(&m_objEventDataProtection);
145 //
\83C
\83x
\83\93\83g
\83f
\81[
\83^
\82Ì
\89ð
\95ú
146 std::list<CComObject<CEvent>*>::iterator pEv = m_lstEvent.begin();
147 while (pEv != m_lstEvent.end()) {
149 pEv = m_lstEvent.erase(pEv);
151 LeaveCriticalSection(&m_objEventDataProtection);
153 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82Ì
\89ð
\95ú
155 CloseHandle(m_hWaitEvent);
158 //
\83\81\83j
\83\85\81[
\82Ì
\94j
\8aü
160 DestroyMenu(m_hMenu);
163 //
\83\81\83C
\83\93\83E
\83B
\83\93\83h
\83E
\82Ì
\94j
\8aü
165 ::DestroyWindow(m_hPopupWnd);
168 //
\83N
\83\8a\83e
\83B
\83J
\83\8b\83Z
\83b
\83V
\83\87\83\93\82Ì
\94j
\8aü
169 DeleteCriticalSection(&m_objEventDataProtection);
171 m_pUnkMarshaler.Release();
172 ATLTRACE("COverlappedWindow::FinalRelease\r\n");
175 STDMETHODIMP COverlappedWindow::get_Caption(BSTR* pVal)
177 *pVal = SysAllocString(m_bstrCaption);
181 STDMETHODIMP COverlappedWindow::put_Caption(BSTR newVal)
183 SysReAllocString(&m_bstrCaption, newVal);
188 STDMETHODIMP COverlappedWindow::get_backColor(long *pVal)
190 *pVal = m_dwBackColor;
194 STDMETHODIMP COverlappedWindow::put_backColor(long newVal)
196 m_dwBackColor = newVal;
198 DeleteObject(m_hBkBrush);
200 m_hBkBrush = CreateSolidBrush(COLORREF(newVal));
202 ::InvalidateRect(m_hPopupWnd, NULL, true);
203 ::UpdateWindow(m_hPopupWnd);
208 HWND COverlappedWindow::SafeCreateWnd()
210 //
\90¶
\90¬
\8dÏ
\82Ý
\82Å
\82 \82ê
\82Î
\89½
\82à
\82µ
\82È
\82¢
\81B
214 //
\83E
\83B
\83\93\83h
\83E
\90¶
\90¬
\82É
\95K
\97v
\82È
\91S
\83p
\83\89\83\81\81[
\83^
\81[
\82Í
\83R
\83\93\83X
\83g
\83\89\83N
\83^
\82Å
\8dì
\90¬
\8dÏ
\82Ý
215 //
\82 \82Æ
\82Í
\83E
\83B
\83\93\83h
\83E
\82ª
\95K
\97v
\82É
\82È
\82Á
\82½
\83^
\83C
\83~
\83\93\83O
\82Å
\90¶
\90¬
\82ð
\8ds
\82¤
217 if (windowParam.noclose) {
218 //
\95Â
\82¶
\82é
\83{
\83^
\83\93\82È
\82µ
\83^
\83C
\83v
219 windowParam.SetWindowClassName(_TEXT("SeraphyScriptToolsOverlappedWindowNC"));
220 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_NOCLOSE;
223 windowParam.SetWindowClassName(_TEXT("SeraphyScriptToolsOverlappedWindow"));
224 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
227 WNDCLASSEX wcex = { 0 };
228 wcex.cbSize = sizeof(WNDCLASSEX);
229 wcex.lpfnWndProc = (WNDPROC)WindowProc;
232 wcex.hInstance = _Module.m_hInst;
233 wcex.hIcon = NULL;//(HICON)LoadImage(NULL,"SETUPICON.ICO",IMAGE_ICON,16,16,LR_LOADFROMFILE);//LoadIcon(hInstance, (LPCTSTR)IDI_INSTPAC);
234 wcex.hIconSm = m_hIcon;//LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
235 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
236 wcex.hbrBackground = NULL;
237 wcex.lpszMenuName = NULL;
238 wcex.lpszClassName = windowParam.szClassName;
239 wcex.style = windowParam.wndstyle;
240 ATOM atm = RegisterClassEx(&wcex);
242 HWND hWnd = CreateWindowEx(
244 windowParam.szClassName,
245 _TEXT(""), //
\83_
\83~
\81[
246 windowParam.ComputeStyle(),
252 NULL, _Module.m_hInst, this);
253 ::SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) this); //
\83N
\83\89\83X
\82Æ
\8aÖ
\98A
\95t
\82¯
\82é
255 //
\83E
\83B
\83\93\83h
\83E
\83X
\83^
\83C
\83\8b\82Ì
\8dÄ
\90Ý
\92è
256 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.ComputeStyle());
259 //
\83V
\83X
\83e
\83\80\83\81\83j
\83\85\81[
\82É
\83t
\83\8c\81[
\83\80\88Ú
\93®
\83\81\83j
\83\85\81[
\82ð
\82Â
\82¯
\82é
260 HMENU hMenu = ::GetSystemMenu(m_hPopupWnd, false);
261 int cnt = ::GetMenuItemCount(hMenu);
262 MENUITEMINFO minfo = { 0 };
263 minfo.cbSize = sizeof(MENUITEMINFO);
264 minfo.fMask = MIIM_TYPE | MIIM_ID;
265 minfo.fType = MFT_STRING;
266 minfo.wID = WM_MOVENEXT_OVERLAPPED;
267 minfo.dwTypeData = _TEXT("
\8e\9f\82Ì
\83E
\83B
\83\93\83h
\83E
\82É
\88Ú
\93®\tF6"); //FIXME:
\83\8a\83\
\81[
\83X
\82É
\88Ú
\93®
\82·
\82é
268 ::InsertMenuItem(hMenu, cnt, true, &minfo);
270 //
\83t
\83H
\81[
\83\80\82Ì
\83\81\83C
\83\93\83E
\83B
\83\93\83h
\83E
\97p
\82Æ
\82µ
\82Ä
\83A
\83^
\83b
\83`
\82·
\82é
272 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\82Ì
\8e\96\91O
\8dì
\90¬
\95ª
\82à
\8e©
\93®
\90¶
\90¬
\82³
\82ê
\82é
273 m_pForm->AttachOwner(m_hPopupWnd);
276 //
\83E
\83B
\83\93\83h
\83E
\82ª
\90¶
\90¬
\82³
\82ê
\82½
\83C
\83x
\83\93\83g
\82ð
\94
\8ds
\82·
\82é
278 ClassObjectInvoke(L"InitWindow");
283 LRESULT CALLBACK COverlappedWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
285 COverlappedWindow* me = (COverlappedWindow*)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
287 //
\8bÙ
\8b}
\92â
\8e~
\82Ì
\94»
\92è
288 if (GetAsyncKeyState(VK_PAUSE) & 0x8000) {
289 ::EnableWindow(hWnd, true);
291 me->m_dModalExitCode = 3;
295 case WM_MOVENEXT_OVERLAPPED:
297 me->MoveNextOverlapped();
302 //
\83f
\83B
\83t
\83H
\83\8b\83g
\82Ì
\93®
\8dì
\82ð
\8ds
\82¤
309 ::GetClientRect(hWnd, &rt);
310 HDC hdc = ::BeginPaint(hWnd, &ps);
313 BOOL bDblBuf = me->windowParam.doublebuffer;
315 //
\82¿
\82ç
\82Â
\82«
\82ð
\96³
\82
\82·
\82é
\82½
\82ß
\82É
\83o
\83u
\83\8b\83o
\83b
\83t
\83@
\95\97\82É
\82·
\82é
\82©
\81H
316 hdc2 = ::CreateCompatibleDC(NULL);
317 bmp = ::CreateCompatibleBitmap(hdc, rt.right, rt.bottom);
318 ::SelectObject(hdc2, bmp);
320 //
\94w
\8ci
\82ð
\93h
\82è
\82Â
\82Ô
\82·
321 ::SetBkColor(hdc2, COLORREF(me->m_dwBackColor));
322 ::SetBkMode(hdc2, TRANSPARENT);
323 ::SetPolyFillMode(hdc2, ALTERNATE);
324 FillRect(hdc2, &rt, me->m_hBkBrush);
326 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83f
\81[
\83^
\81[
\82Ì
\95`
\89æ
328 me->m_pCanvas->Draw(hdc2, rt);
332 //
\83_
\83u
\83\8b\83o
\83b
\83t
\83@
\82Ì
\93]
\91\97
333 ::BitBlt(hdc, 0, 0, rt.right, rt.bottom, hdc2, 0, 0, SRCCOPY);
337 ::EndPaint(hWnd, &ps);
342 if (wParam == SC_CLOSE) {
343 if (me->windowParam.autoclose) {
347 me->m_dModalExitCode = IDABORT;
348 me->AddEventSingle(WM_COMMAND, IDABORT, 0);
351 else if (wParam == WM_MOVENEXT_OVERLAPPED) {
352 SendMessage(hWnd, WM_MOVENEXT_OVERLAPPED, 0, 0);
359 me->AddEventSingle(WM_MOUSEMOVE, 0, 0);
362 case WM_LBUTTONDBLCLK:
364 me->AddEvent(WM_LBUTTONDBLCLK, 0, 0);
367 case WM_RBUTTONDBLCLK:
369 me->AddEvent(WM_RBUTTONDBLCLK, 0, 0);
374 if (me->m_dCaptureMode == 0) {
375 me->AddEvent(WM_LBUTTONDOWN, 0, 0);
377 me->m_dCaptureMode |= 0x01;
386 if (me->m_dCaptureMode & 0x01) {
387 me->AddEvent(WM_LBUTTONUP, 0, 0);
388 me->m_dCaptureMode &= ~0x01;
395 if (me->m_dCaptureMode == 0) {
396 me->AddEvent(WM_RBUTTONDOWN, 0, 0);
398 me->m_dCaptureMode |= 0x02;
407 if (me->m_dCaptureMode & 0x02) {
408 me->AddEvent(WM_RBUTTONUP, 0, 0);
409 me->m_dCaptureMode &= ~0x02;
414 case WM_CAPTURECHANGED:
416 if (me->m_dCaptureMode & 0x01) {
417 me->AddEvent(WM_CAPTURECHANGED, 1, 0);
419 if (me->m_dCaptureMode & 0x02) {
420 me->AddEvent(WM_CAPTURECHANGED, 2, 0);
422 me->m_dCaptureMode = 0;
427 me->AddEventSingle(WM_SIZE, 0, 0);
433 me->AddEventSingle(WM_TIMER, 0, 0);
439 HDROP hDrop = (HDROP)wParam;
440 me->m_dropfiles.SetDropFiles(hDrop);
441 me->AddEvent(WM_DROPFILES, 0, 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);
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);
465 ATLTRACE(_TEXT("command=%d:%d\n"), HIWORD(wParam), LOWORD(wParam));
467 HWND hControl = (HWND)lParam;
468 int nID = LOWORD(wParam);
469 int notify = HIWORD(wParam);
471 if (nID == IDABORT) {
472 // IDABORT
\82Æ
\93¯
\88ê
\82È
\82çquit
\82ð
\97§
\82Ä
\82é
475 me->AddEventSingle(WM_COMMAND, nID, 0);
478 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\92Ê
\92m
484 // TreeView - ListView
\88È
\8aO
\82Ì
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ª
\83t
\83H
\81[
\83J
\83X
\82ð
\8eó
\82¯
\8eæ
\82Á
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
485 me->m_hLastFocusControl = hControl;
488 // LISTBOX
\82ª
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
489 me->AddEvent(WM_COMMAND, nID, 0);
498 NMHDR* notify = (NMHDR*)lParam;
499 switch (notify->code) {
502 // TreeView - ListView
\82ª
\83t
\83H
\81[
\83J
\83X
\82ð
\8eó
\82¯
\8eæ
\82Á
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
503 me->m_hLastFocusControl = notify->hwndFrom;
508 // TreeView
\82Ì
\91I
\91ð
\82ª
\95Ï
\8dX
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82³
\82ê
\82é
509 LPNMTREEVIEW pnmTv = (LPNMTREEVIEW)lParam;
510 me->AddEvent(WM_COMMAND, pnmTv->hdr.idFrom, 0);
515 // ListView - TreeView
\82Å
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82³
\82ê
\82½
516 LPNMITEMACTIVATE pnmLv = (LPNMITEMACTIVATE)lParam;
517 me->AddEvent(WM_COMMAND, pnmLv->hdr.idFrom, 0);
520 case LVN_COLUMNCLICK:
522 // ListView
\82Å
\83J
\83\89\83\80\82ª
\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
523 LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam;
524 LONG_PTR addr = ::GetWindowLongPtr(pnmv->hdr.hwndFrom, GWLP_USERDATA);
526 //
\83J
\83\89\83\80\83N
\83\8a\83b
\83N
\82É
\82æ
\82é
\83\
\81[
\83e
\83B
\83\93\83O
\82ð
\8ds
\82¤
527 CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr;
528 pCtrl->ListSort(pnmv->iSubItem);
532 case LVN_ENDLABELEDIT:
534 // ListView
\82Å
\8d\80\96Ú
\82ª
\95Ò
\8fW
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
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);
543 // ListView
\82Å
\83L
\81[
\83{
\81[
\83h
\82ª
\89\9f\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
544 LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam;
545 if (pnkd->wVKey == VK_SPACE) {
546 //
\83X
\83y
\81[
\83X
\83L
\81[
\82Å
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82Æ
\93¯
\82¶
\8cø
\89Ê
\82ð
\8e\9d\82½
\82¹
\82é
547 me->AddEvent(WM_COMMAND, pnkd->hdr.idFrom, 0);
549 else if (pnkd->wVKey == VK_DELETE) {
550 //
\83f
\83\8a\81[
\83g
551 me->AddEvent(WM_NOTIFY, pnkd->hdr.idFrom, VK_DELETE);
553 else if (pnkd->wVKey == VK_F2) {
554 //
\83\89\83x
\83\8b\95Ò
\8fW
\8aJ
\8en
555 int idx = ListView_GetNextItem(pnkd->hdr.hwndFrom, -1, LVNI_FOCUSED);
556 ListView_EditLabel(pnkd->hdr.hwndFrom, idx);
562 LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)lParam;
563 if (ptvkd->wVKey == VK_DELETE) {
564 //
\83f
\83\8a\81[
\83g
565 me->AddEvent(WM_NOTIFY, ptvkd->hdr.idFrom, VK_DELETE);
571 // ListView - TreeView
\82Å
\89E
\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
572 LPNMHDR lpnmh = (LPNMHDR)lParam;
573 LONG_PTR addr = ::GetWindowLongPtr(lpnmh->hwndFrom, GWLP_USERDATA);
575 CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr;
576 pCtrl->OnRClick(); //
\83R
\83\93\83g
\83\8d\81[
\83\8b\82É
\89E
\83N
\83\8a\83b
\83N
\82ð
\92Ê
\92m
\82µ
\91O
\8f\88\97\9d\82ð
\8ds
\82í
\82¹
\82é
578 me->AddEvent(WM_NOTIFY, lpnmh->idFrom, VK_RBUTTON);
586 case WM_CTLCOLORSTATIC:
588 HDC hdc = (HDC)wParam;
589 ::SetBkColor(hdc, me->m_dwBackColor);
590 ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT));
591 return (LPARAM)me->m_hBkBrush;
593 case WM_CTLCOLOREDIT:
594 case WM_CTLCOLORLISTBOX:
595 case WM_CTLCOLORMSGBOX:
598 //
\83t
\83H
\81[
\83\80\82Å
\8ew
\92è
\82³
\82ê
\82½
\83R
\83\93\83g
\83\8d\81[
\83\8b\94w
\8ci
\83u
\83\89\83V
\82ð
\8eæ
\93¾
\82·
\82é
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();
608 if (me->m_dWaitCursor > 0) {
609 ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
615 return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
618 STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult)
625 //
\83C
\83x
\83\93\83L
\83\85\81[
\82Ì
\8eæ
\93¾
626 EnterCriticalSection(&m_objEventDataProtection);
627 CComObject<CEvent>* pEv = NULL;
628 if (!m_lstEvent.empty()) {
629 //
\83C
\83x
\83\93\83g
\83\8a\83X
\83g
\82É
\83f
\81[
\83^
\81[
\82ª
\93ü
\82Á
\82Ä
\82¢
\82é
630 pEv = m_lstEvent.front();
631 m_lstEvent.pop_front();
633 if (m_lstEvent.empty()) {
634 //
\82±
\82ê
\88È
\8fã
\83\81\83b
\83Z
\81[
\83W
\82ª
\82È
\82¢
\82Ì
\82È
\82ç
\82Î
\81A
\83C
\83x
\83\93\83g
\83t
\83\89\83O
\82ð
\83\8a\83Z
\83b
\83g
\82·
\82é
635 ResetEvent(m_hWaitEvent);
638 //
\82Ü
\82¾
\83\81\83b
\83Z
\81[
\83W
\82ª
\82 \82é
\82Ì
\82Å
\83C
\83x
\83\93\83g
\82ð
\82½
\82Ä
\82é
639 SetEvent(m_hWaitEvent);
641 LeaveCriticalSection(&m_objEventDataProtection);
643 //
\8eæ
\82è
\8fo
\82µ
\82½
\83C
\83x
\83\93\83g
\82Ì
\8f\88\97\9d
645 //
\95Ô
\93\9a\83C
\83x
\83\93\83g
\83R
\81[
\83h
646 ret = pEv->GetMessage();
648 if (pEv->GetMessage() == WM_TIMER) {
649 //
\83^
\83C
\83}
\81[
\83C
\83x
\83\93\83g
\82ÍUI
\82É
\8aÖ
\8cW
\82È
\82
\8a\84\82è
\8d\9e\82Ü
\82ê
\82é
\82½
\82ß
650 //
\83C
\83x
\83\93\83g
\83v
\83\8d\83p
\83e
\83B
\81[
\82É
\82Í
\83Z
\83b
\83g
\82¹
\82¸
\81A
\83\89\83C
\83Y
\82·
\82é
\82¾
\82¯
\81B
652 ClassObjectInvoke(L"OnTimer");
655 //
\82»
\82Ì
\82Ù
\82©
\82Ì
\83C
\83x
\83\93\83g
\82Í
\8c»
\8dÝ
\82Ì
\83C
\83x
\83\93\83g
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\83v
\83\8d\83p
\83e
\83B
\81[
\82É
\83Z
\83b
\83g
\82·
\82é
657 //
\8cÃ
\82¢
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
664 //
\82±
\82Ì
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\88ø
\90\94\82Æ
\82µ
\82Ä
\93n
\82·
\82½
\82ß
\82É
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\90¶
\90¬
\82·
\82é
665 CComPtr<IUnknown> pUnk;
667 if (FAILED(hr = QueryInterface(IID_IUnknown, (void**)&pUnk))) {
671 //
\83C
\83x
\83\93\83g
\82É
\91Î
\82·
\82é
\83\89\83C
\83Y
672 switch (pEv->GetMessage()) {
676 Fire_OnKeydownEx(pUnk);
677 ClassObjectInvoke(L"OnKeydown");
683 Fire_OnKeydown2Ex(pUnk);
684 ClassObjectInvoke(L"OnKeydown2");
690 Fire_OnMouseMoveEx(pUnk);
691 ClassObjectInvoke(L"OnMouseMove");
694 case WM_LBUTTONDBLCLK:
697 Fire_OnDblClickEx(pUnk);
698 ClassObjectInvoke(L"OnDblClick");
704 Fire_OnClickEx(pUnk);
705 ClassObjectInvoke(L"OnClick");
708 case WM_RBUTTONDBLCLK:
711 Fire_OnRDblClickEx(pUnk);
712 ClassObjectInvoke(L"OnRDblClick");
718 Fire_OnRClickEx(pUnk);
719 ClassObjectInvoke(L"OnRClick");
725 Fire_OnClickOutEx(pUnk);
726 ClassObjectInvoke(L"OnClickOut");
732 Fire_OnRClickOutEx(pUnk);
733 ClassObjectInvoke(L"OnRClickOut");
736 case WM_CAPTURECHANGED:
738 if (pEv->GetParam() == 1) {
739 Fire_OnClickCancel();
740 Fire_OnClickCancelEx(pUnk);
741 ClassObjectInvoke(L"OnClickCancel");
744 Fire_OnRClickCancel();
745 Fire_OnRClickCancelEx(pUnk);
746 ClassObjectInvoke(L"OnRClickCancel");
754 ClassObjectInvoke(L"OnSize");
759 int nID = pEv->GetParam();
762 if (m_bDefaultAction) {
765 m_dModalExitCode = IDOK;
768 ClassObjectInvoke(L"OnOK");
771 if (m_bDefaultAction) {
774 m_dModalExitCode = IDCANCEL;
776 Fire_OnCancelEx(pUnk);
777 ClassObjectInvoke(L"OnCancel");
781 m_dModalExitCode = IDABORT;
784 ClassObjectInvoke(L"OnExit");
788 Fire_OnCommandEx(pUnk);
789 ClassObjectInvoke(L"OnCommand");
791 //
\8aÖ
\98A
\82Ã
\82¯
\82ç
\82ê
\82½
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ª
\82 \82é
\82Ì
\82©
\81H
793 BSTR eventname = NULL;
794 if (m_pForm->FindControlEventName(nID, &eventname)) {
795 if (SysStringLen(eventname) > 0) {
796 ClassObjectInvoke(eventname);
798 SysFreeString(eventname);
801 //
\83\81\83j
\83\85\81[
\82Ì
\8c\9f\8dõ
802 if (m_hMenu && nID >= 100) {
803 std::map<int, CComBSTR>::iterator p = m_cMenuMap.find(nID);
804 if (p != m_cMenuMap.end()) {
805 //
\94
\8c©
\82³
\82ê
\82½
806 ClassObjectInvoke(p->second);
814 Fire_OnDropFilesEx(pUnk);
815 ClassObjectInvoke(L"OnDropFiles");
820 switch (pEv->GetLParam()) {
822 Fire_OnContextDelete();
823 Fire_OnContextDeleteEx(pUnk);
824 ClassObjectInvoke(L"OnContextDelete");
827 Fire_OnContextMenu();
828 Fire_OnContextMenuEx(pUnk);
829 ClassObjectInvoke(L"OnContextMenu");
835 //
\82±
\82Ì
\88ø
\90\94\82Æ
\82µ
\82Ä
\93n
\82µ
\82½
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\89ð
\95ú
\82·
\82é
840 //
\8f\88\97\9d\82³
\82ê
\82½
\83C
\83x
\83\93\83g
\82Í
\89ð
\95ú
\82·
\82é
844 //
\83C
\83x
\83\93\83g
\82ª
\82È
\82¢
\8fê
\8d\87\82Í
\83C
\83x
\83\93\83g
\82Ì
\83N
\83\8a\83A
846 //
\8cÃ
\82¢
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
851 //
\83C
\83x
\83\93\83g
\83R
\81[
\83h
\82ð
\96ß
\82·
\81B
852 ret.Detach(varResult);
856 void COverlappedWindow::AddEventSingle(int message, WPARAM wParam, LPARAM lParam)
858 //
\83C
\83x
\83\93\83g
\83o
\83b
\83t
\83@
\82É
\96¢
\8f\88\97\9d\82Ì
\83C
\83x
\83\93\83g
\82ª
\82 \82ê
\82Î
\83C
\83x
\83\93\83g
\82ð
\94
\8ds
\82µ
\82È
\82¢
\81B
860 EnterCriticalSection(&m_objEventDataProtection);
861 std::list<CComObject<CEvent>*>::iterator p = m_lstEvent.begin();
862 while (p != m_lstEvent.end()) {
863 if ((*p)->GetMessage() == message && (*p)->GetParam() == wParam) {
869 LeaveCriticalSection(&m_objEventDataProtection);
871 //
\93¯
\88ê
\83C
\83x
\83\93\83g
\82ª
\82È
\82¯
\82ê
\82Î
\83C
\83x
\83\93\83g
\82Ì
\94
\8ds
\82ð
\8ds
\82¤
872 AddEvent(message, wParam, lParam);
876 void COverlappedWindow::AddEvent(int message, WPARAM wParam, LPARAM lParam)
878 //
\83C
\83x
\83\93\83g
\94
\90¶
\8e\9e\82Ì
\83}
\83E
\83X
\88Ê
\92u
\82ð
\83N
\83\89\83C
\83G
\83\93\83g
\8dÀ
\95W
\82É
\95Ï
\8a·
\82·
\82é
880 DWORD pos = GetMessagePos();
885 ::ScreenToClient(m_hPopupWnd, &pt);
886 //
\8dÀ
\95W
\8cn
\82Ì
\95Ï
\8a·
888 HDC hdc = ::GetDC(m_hPopupWnd);
891 ::GetClientRect(m_hPopupWnd, &rct);
892 ::SetViewportOrgEx(hdc, 0, rct.bottom, &org);
893 int md = ::GetMapMode(hdc);
894 ::SetMapMode(hdc, MM_LOMETRIC);
895 ::DPtoLP(hdc, &lp, 1);
896 ::SetMapMode(hdc, md);
897 ::SetViewportOrgEx(hdc, org.x, org.y, NULL);
898 ::ReleaseDC(m_hPopupWnd, hdc);
901 //
\83C
\83x
\83\93\83g
\82Ì
\90Ï
\82Ý
\8fã
\82°
902 EnterCriticalSection(&m_objEventDataProtection);
903 CComObject<CEvent>* pEvent = NULL;
905 if (SUCCEEDED(hr = CComObject<CEvent>::CreateInstance(&pEvent))) {
907 pEvent->SetData(message, wParam, lParam, pt, lp);
908 m_lstEvent.push_back(pEvent);
910 ATLASSERT(SUCCEEDED(hr));
912 LeaveCriticalSection(&m_objEventDataProtection);
914 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82ð
\83V
\83O
\83i
\83\8b\82É
\82·
\82é
915 SetEvent(m_hWaitEvent);
917 if (windowParam.automessageloop) {
918 //
\82½
\82¾
\82¿
\82É
\83C
\83x
\83\93\83g
\8f\88\97\9d\82ð
\8ds
\82¤
925 STDMETHODIMP COverlappedWindow::Draw()
929 ::InvalidateRect(m_hPopupWnd, NULL, true);
930 ::UpdateWindow(m_hPopupWnd);
936 STDMETHODIMP COverlappedWindow::get_IsEventEmpty(BOOL *pVal)
938 //
\83C
\83x
\83\93\83g
\82ª
\8bó
\82È
\82çtrue
939 *pVal = m_lstEvent.empty() ? VB_TRUE : VB_FALSE;
943 STDMETHODIMP COverlappedWindow::Open(VARIANT caption, VARIANT* pvarUnk)
947 if ((caption.vt != VT_ERROR && caption.vt != VT_NULL) && tmp.ChangeType(VT_BSTR, &caption) == S_OK) {
948 put_Caption(tmp.bstrVal);
953 m_dModalExitCode = 0; //
\83\82\81[
\83_
\83\8b\95Ô
\93\9a\83R
\81[
\83h
954 CreateThisInterface(pvarUnk);
958 STDMETHODIMP COverlappedWindow::Close()
960 //
\83`
\83\83\83C
\83\8b\83h
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82é
\8fê
\8d\87\82Í
\81A
\83`
\83\83\83C
\83\8b\83h
\82à
\83N
\83\8d\81[
\83Y
\82·
\82é
961 std::list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
962 while (pWnd != m_lstChild.end()) {
966 //
\82±
\82Ì
\83E
\83B
\83\93\83h
\83E
\82ð
\94ñ
\95\
\8e¦
\82É
\82·
\82é
970 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\95ú
\8aü
971 if (m_pClassDisp && m_bAutoReleaseClassObject) {
972 m_pClassDisp.Release();
975 //
\83t
\83H
\81[
\83J
\83X
\82ð
\88Ú
\93®
\82·
\82é
977 ::SetActiveWindow(m_hParentWnd);
978 ::SetFocus(m_hParentWnd);
981 MoveNextOverlapped();
986 STDMETHODIMP COverlappedWindow::get_DoubleBuffer(BOOL *pVal)
992 *pVal = windowParam.doublebuffer ? VB_TRUE : VB_FALSE;
997 STDMETHODIMP COverlappedWindow::put_DoubleBuffer(BOOL newVal)
999 windowParam.doublebuffer = newVal;
1004 STDMETHODIMP COverlappedWindow::get_TopMost(BOOL *pVal)
1012 DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1013 *pVal = (exstyle & WS_EX_TOPMOST) ? VB_TRUE : VB_FALSE;
1018 STDMETHODIMP COverlappedWindow::put_TopMost(BOOL newVal)
1021 ::SetWindowPos(m_hPopupWnd, newVal ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
1025 STDMETHODIMP COverlappedWindow::get_PosX(short *pVal)
1032 WINDOWPLACEMENT pls = { 0 };
1033 pls.length = sizeof(WINDOWPLACEMENT);
1034 ::GetWindowPlacement(m_hPopupWnd, &pls);
1035 windowParam.posX = (int)pls.rcNormalPosition.left;
1038 *pVal = windowParam.posX;
1043 STDMETHODIMP COverlappedWindow::put_PosX(short newVal)
1045 windowParam.posX = newVal;
1047 WINDOWPLACEMENT pls = { 0 };
1048 pls.length = sizeof(WINDOWPLACEMENT);
1049 ::GetWindowPlacement(m_hPopupWnd, &pls);
1050 ::SetWindowPos(m_hPopupWnd, NULL,
1052 pls.rcNormalPosition.top,
1053 0, 0, SWP_NOZORDER | SWP_NOSIZE);
1058 STDMETHODIMP COverlappedWindow::get_PosY(short *pVal)
1065 WINDOWPLACEMENT pls = { 0 };
1066 pls.length = sizeof(WINDOWPLACEMENT);
1067 ::GetWindowPlacement(m_hPopupWnd, &pls);
1068 windowParam.posY = (int)pls.rcNormalPosition.top;
1071 *pVal = windowParam.posY;
1076 STDMETHODIMP COverlappedWindow::put_PosY(short newVal)
1078 windowParam.posY = newVal;
1080 WINDOWPLACEMENT pls = { 0 };
1081 pls.length = sizeof(WINDOWPLACEMENT);
1082 ::GetWindowPlacement(m_hPopupWnd, &pls);
1083 ::SetWindowPos(m_hPopupWnd, NULL,
1084 pls.rcNormalPosition.left,
1086 0, 0, SWP_NOZORDER | SWP_NOSIZE);
1091 STDMETHODIMP COverlappedWindow::get_Width(short *pVal)
1098 WINDOWPLACEMENT pls = { 0 };
1099 pls.length = sizeof(WINDOWPLACEMENT);
1100 ::GetWindowPlacement(m_hPopupWnd, &pls);
1101 windowParam.width = (int)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1104 *pVal = windowParam.width;
1109 STDMETHODIMP COverlappedWindow::put_Width(short newVal)
1111 windowParam.width = newVal;
1114 WINDOWPLACEMENT pls = { 0 };
1115 pls.length = sizeof(WINDOWPLACEMENT);
1116 ::GetWindowPlacement(m_hPopupWnd, &pls);
1117 ::SetWindowPos(m_hPopupWnd, NULL,
1120 pls.rcNormalPosition.bottom - pls.rcNormalPosition.top, SWP_NOZORDER | SWP_NOMOVE);
1124 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1125 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
1126 windowParam.ComputeStyle(), windowParam.exstyle);
1131 STDMETHODIMP COverlappedWindow::get_Height(short *pVal)
1138 WINDOWPLACEMENT pls = { 0 };
1139 pls.length = sizeof(WINDOWPLACEMENT);
1140 ::GetWindowPlacement(m_hPopupWnd, &pls);
1141 windowParam.height = (short)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1144 *pVal = windowParam.height;
1149 STDMETHODIMP COverlappedWindow::put_Height(short newVal)
1151 windowParam.height = newVal;
1154 WINDOWPLACEMENT pls = { 0 };
1155 pls.length = sizeof(WINDOWPLACEMENT);
1156 ::GetWindowPlacement(m_hPopupWnd, &pls);
1157 ::SetWindowPos(m_hPopupWnd, NULL, 0, 0,
1158 pls.rcNormalPosition.right - pls.rcNormalPosition.left,
1160 SWP_NOZORDER | SWP_NOMOVE);
1164 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1165 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
1166 windowParam.ComputeStyle(), windowParam.exstyle);
1171 STDMETHODIMP COverlappedWindow::get_AcceptFiles(BOOL *pVal)
1179 DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1180 *pVal = (exstyle & WS_EX_ACCEPTFILES) ? VB_TRUE : VB_FALSE;
1185 STDMETHODIMP COverlappedWindow::put_AcceptFiles(BOOL newVal)
1188 DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1189 exstyle &= ~WS_EX_ACCEPTFILES;
1190 exstyle |= newVal ? WS_EX_ACCEPTFILES : 0;
1191 ::SetWindowLong(m_hPopupWnd, GWL_EXSTYLE, exstyle);
1195 STDMETHODIMP COverlappedWindow::SetForegroundWindow()
1198 ::SetForegroundWindow(m_hPopupWnd);
1202 STDMETHODIMP COverlappedWindow::SetFocus()
1205 ::SetFocus(m_hPopupWnd);
1209 STDMETHODIMP COverlappedWindow::get_Enable(BOOL *pVal)
1216 *pVal = ::IsWindowEnabled(m_hPopupWnd) ? VB_TRUE : VB_FALSE;
1221 STDMETHODIMP COverlappedWindow::put_Enable(BOOL newVal)
1225 ::EnableWindow(m_hPopupWnd, newVal);
1228 m_pForm->EnableAllControl(newVal);
1229 ::SetActiveWindow(m_hPopupWnd);
1235 STDMETHODIMP COverlappedWindow::get_Iconic(BOOL *pVal)
1243 *pVal = ::IsIconic(m_hPopupWnd) ? VB_TRUE : VB_FALSE;
1248 STDMETHODIMP COverlappedWindow::put_Iconic(BOOL newVal)
1251 ::ShowWindow(m_hPopupWnd, newVal ? SW_MINIMIZE : SW_SHOWNORMAL);
1256 STDMETHODIMP COverlappedWindow::get_Zoomed(BOOL *pVal)
1264 *pVal = ::IsZoomed(m_hPopupWnd) ? VB_TRUE : VB_FALSE;
1269 STDMETHODIMP COverlappedWindow::put_Zoomed(BOOL newVal)
1272 ::ShowWindow(m_hPopupWnd, newVal ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL);
1276 STDMETHODIMP COverlappedWindow::get_Visible(BOOL *pVal)
1284 if (::IsWindow(m_hPopupWnd)) {
1285 //
\83E
\83B
\83\93\83h
\83E
\82ª
\8dì
\90¬
\8dÏ
\82Ý
\82Å
\82 \82ê
\82Î
\92²
\8d¸
\82·
\82é
1286 DWORD style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
1287 *pVal = (style & WS_VISIBLE) ? VB_TRUE : VB_FALSE;
1293 STDMETHODIMP COverlappedWindow::put_Visible(BOOL newVal)
1295 if (!newVal && !::IsWindow(m_hPopupWnd)) {
1296 // FALSE
\82È
\82ç
\81A
\82 \82¦
\82Ä
\8dì
\90¬
\82Í
\8e\8e\82Ý
\82È
\82¢
1302 ::ShowWindow(m_hPopupWnd, newVal ? SW_SHOWNORMAL : SW_HIDE);
1303 ::SetActiveWindow(m_hPopupWnd);
1308 STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim, BOOL* pRet)
1317 //
\91Ò
\8b@
\8e\9e\8aÔ
\82Ì
\8eæ
\93¾
1318 DWORD sleeptim = 1000;
1320 if (tim.ChangeType(VT_I4, &varTim) == S_OK) {
1321 sleeptim = (DWORD)tim.lVal;
1323 if (sleeptim == 0) {
1324 sleeptim = INFINITE;
1327 HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = { NULL };
1328 HWND hWnd[MAXIMUM_WAIT_OBJECTS] = { NULL };
1330 SetWaitParam(&cnt, hWnd, hEvent);
1331 *pRet = MessageLoop(sleeptim, cnt, hWnd, hEvent) ? VB_TRUE : VB_FALSE;
1336 STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt)
1343 if (FAILED(hr = tmp.ChangeType(VT_BSTR, &fmt))) {
1347 ATL::CString buf(tmp.bstrVal);
1349 //
\8cÃ
\82¢
\83\81\83j
\83\85\81[
\82ð
\94j
\8aü
\82·
\82é
1352 ::SetMenu(m_hPopupWnd, NULL);
1353 DestroyMenu(m_hMenu);
1357 if (buf.GetLength() > 0) {
1358 //
\8d\80\96Ú
\82ª
\82 \82ê
\82Î
\83\81\83j
\83\85\81[
\96¼
\82ð
\83p
\81[
\83X
\82·
\82é
1359 m_hMenu = CreateMenu();
1360 TCHAR menuname[MAX_PATH];
1361 TCHAR szSubmenu[MAX_PATH];
1362 HMENU hPopupMenu = NULL;
1367 LPTSTR p = buf.GetBuffer();
1369 while (*p == ' ' || *p == '\t') p++; //
\83u
\83\89\83\93\83N
\83X
\83L
\83b
\83v
1372 //
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1374 //
\8aù
\91¶
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\82ð
\96\84\82ß
\8d\9e\82Þ
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);
1387 hPopupMenu = CreatePopupMenu();
1389 while (*p && *p != ',' && *p != '/' && *p != ':') {
1392 ZeroMemory(szSubmenu, MAX_PATH);
1393 int submenuLen = p - st;
1394 if (submenuLen > 0) {
1395 _tcsncpy_s(szSubmenu, MAX_PATH, st, submenuLen);
1397 if (*p == ',' || *p == ':') {
1402 //
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1405 while (*p && *p != ',' && *p != '/' && *p != ':') {
1409 ZeroMemory(menuname, MAX_PATH);
1410 int menunameLen = p - st;
1411 if (menunameLen > 0) {
1412 _tcsncpy_s(menuname, MAX_PATH, st, menunameLen);
1415 //
\83R
\83}
\83\93\83h
\83Z
\83p
\83\8c\81[
\83^
\81[
\82ð
\8c\9f\8d¸
\82·
\82é
1417 LPTSTR findcmd = _tcschr(menuname, _TEXT('@'));
1420 eventname = findcmd + 1;
1425 wsprintf(tmp, _TEXT("OnMenu%d"), lv1 * 100 + cmd);
1428 m_cMenuMap.insert(std::make_pair(lv1 * 100 + cmd, eventname));
1430 //
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
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);
1441 //
\83Z
\83p
\83\8c\81[
\83^
\81[
\82Ì
\8ew
\92è
\82©?
1446 else if (*p == ':') {
1447 MENUITEMINFO inf = { 0 };
1448 inf.cbSize = sizeof(MENUITEMINFO);
1449 inf.fMask = MIIM_TYPE;
1450 inf.fType = MFT_SEPARATOR;
1451 InsertMenuItem(hPopupMenu, lv2, true, &inf);
1458 //
\96¢
\91}
\93ü
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\91}
\93ü
1460 //
\8aù
\91¶
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\82ð
\96\84\82ß
\8d\9e\82Þ
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);
1469 ::SetMenu(m_hPopupWnd, m_hMenu);
1474 STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT pcmd, VARIANT* pRet)
1487 if (SUCCEEDED(varCmd.ChangeType(VT_I2, &pcmd))) {
1488 nCommand = varCmd.iVal;
1493 CComVariant varText;
1494 if (FAILED(hr = varText.ChangeType(VT_BSTR, &text))) {
1498 TCHAR menuname[MAX_PATH];
1500 ATL::CString buf(varText.bstrVal);
1501 UINT len = buf.GetLength() + 1;
1502 LPTSTR p = buf.GetBuffer();
1506 HMENU hPopupMenu = CreatePopupMenu();
1509 while (*p == ' ' || *p == '\t') {
1512 while (*p && *p != ',' && *p != '/' && *p != ':') {
1515 ZeroMemory(menuname, MAX_PATH);
1516 int menunameLen = p - st;
1517 if (menunameLen > 0) {
1518 _tcsncpy_s(menuname, MAX_PATH, st, menunameLen);
1520 MENUITEMINFO inf = { 0 };
1521 inf.cbSize = sizeof(MENUITEMINFO);
1522 inf.fMask = MIIM_TYPE | MIIM_ID;
1523 inf.fType = MFT_STRING;
1525 if (nCommand != 0) {
1526 inf.wID = nCommand + cmd;
1530 //
\83R
\83}
\83\93\83h
\83x
\81[
\83X
\82ª0
\82È
\82ç
\82Î
\83R
\83}
\83\93\83h
\83C
\83x
\83\93\83g
\82Í
\94
\90¶
\82³
\82¹
\82È
\82¢
\81B
1531 // TrackPopupMenu
\82Í
\83R
\83}
\83\93\83h
\82ð
\91I
\91ð
\82µ
\82È
\82©
\82Á
\82½
\8fê
\8d\87\82Í0
\82ð
\95Ô
\82·
\82½
\82ß
\81A0
\82æ
\82è
\82à
\91å
\82«
\82È
\92l
\82É
\82·
\82é
\95K
\97v
\82ª
\82 \82é
\81B
1532 inf.wID = nCommand + cmd + 1;
1535 inf.dwTypeData = menuname;
1536 InsertMenuItem(hPopupMenu, lv, true, &inf);
1540 if (*p == ',' || *p == '/') {
1544 else if (*p == ':') {
1545 inf.fMask = MIIM_TYPE;
1546 inf.fType = MFT_SEPARATOR;
1547 InsertMenuItem(hPopupMenu, lv, true, &inf);
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), //
\83R
\83}
\83\93\83h
\83x
\81[
\83X
\82ª0
\82Å
\82 \82ê
\82Î
\81A
\83R
\83}
\83\93\83h
\83C
\83x
\83\93\83g
\82ð
\92Ê
\92m
\82³
\82¹
\82È
\82¢
\81B
1564 DestroyMenu(hPopupMenu);
1566 return varRet.Detach(pRet);
1569 STDMETHODIMP COverlappedWindow::get_HWND(long *pVal)
1571 *pVal = (LONG)m_hPopupWnd;
1575 STDMETHODIMP COverlappedWindow::GetSysColor(VARIANT typ, VARIANT *col)
1582 //
\83V
\83X
\83e
\83\80\83J
\83\89\81[
\82Ì
\8eæ
\93¾
1585 CComVariant varType;
1586 if (FAILED(hr = varType.ChangeType(VT_I2, &typ))) {
1591 varRet = (long)::GetSysColor(varType.iVal);
1592 return varRet.Detach(col);
1595 STDMETHODIMP COverlappedWindow::SetTimer(VARIANT tim, BOOL* pVal)
1606 if (SUCCEEDED(varTim.ChangeType(VT_I4, &tim))) {
1607 timer = varTim.lVal;
1611 *pVal = ::SetTimer(m_hPopupWnd, 1, timer, NULL) ? VB_TRUE : VB_FALSE;
1615 *pVal = ::KillTimer(m_hPopupWnd, 1) ? VB_TRUE : VB_FALSE;
1621 STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode)
1625 return Error(IDS_ERR_NOCREATEMENU);
1630 if (SUCCEEDED(varCmd.ChangeType(VT_I2, &cmd))) {
1635 CComVariant varMode;
1636 if (SUCCEEDED(varMode.ChangeType(VT_I2, &mode))) {
1637 nMode = varMode.iVal;
1641 //
\83\81\83j
\83\85\81[
\83R
\83}
\83\93\83h
\82Í100
\88È
\8fã
\82Å
\82 \82é
\82Ì
\82Å
\81B
1642 MENUITEMINFO inf = { 0 };
1643 inf.cbSize = sizeof(MENUITEMINFO);
1644 inf.fMask = MIIM_STATE;
1645 inf.fState = nMode ? MFS_CHECKED : MFS_UNCHECKED;
1646 ::SetMenuItemInfo(m_hMenu, nCmd, false, &inf);
1652 STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode)
1656 return Error(IDS_ERR_NOCREATEMENU);
1661 if (SUCCEEDED(varCmd.ChangeType(VT_I2, &cmd))) {
1666 CComVariant varMode;
1667 if (SUCCEEDED(varMode.ChangeType(VT_I2, &mode))) {
1668 nMode = varMode.iVal;
1672 //
\83\81\83j
\83\85\81[
\83R
\83}
\83\93\83h
\82Í100
\88È
\8fã
\82Å
\82 \82é
\82Ì
\82Å
\81B
1673 MENUITEMINFO inf = { 0 };
1674 inf.cbSize = sizeof(MENUITEMINFO);
1675 inf.fMask = MIIM_STATE;
1676 inf.fState = nMode ? MFS_ENABLED : MFS_GRAYED;
1677 ::SetMenuItemInfo(m_hMenu, nCmd, false, &inf);
1682 STDMETHODIMP COverlappedWindow::get_CreateNoCloseWindow(BOOL *pVal)
1688 //
\83N
\83\8d\81[
\83Y
\8bÖ
\8e~
\83E
\83B
\83\93\83h
\83E?
1689 *pVal = windowParam.noclose ? VB_TRUE : VB_FALSE;
1694 STDMETHODIMP COverlappedWindow::put_CreateNoCloseWindow(BOOL newVal)
1697 //
\83E
\83B
\83\93\83h
\83E
\8dì
\90¬
\8cã
\82É
\82Í
\8ew
\92è
\82Å
\82«
\82È
\82¢
1698 return Error(IDS_ERR_CREATEDWND);
1700 windowParam.noclose = newVal;
1704 STDMETHODIMP COverlappedWindow::get_Canvas(VARIANT *pVal)
1710 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\93n
\82·
1711 ::VariantInit(pVal);
1715 CComPtr<IUnknown> pUnk;
1716 if (FAILED(hr = m_pCanvas->QueryInterface(&pUnk))) {
1719 pVal->vt = VT_UNKNOWN;
1720 pVal->punkVal = pUnk.Detach();
1726 STDMETHODIMP COverlappedWindow::get_Event(VARIANT *pVal)
1732 ::VariantInit(pVal);
1735 //
\83C
\83x
\83\93\83g
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8eæ
\93¾
1737 CComPtr<IUnknown> pUnk;
1738 if (FAILED(hr = m_pEvent->QueryInterface(&pUnk))) {
1741 pVal->vt = VT_UNKNOWN;
1742 pVal->punkVal = pUnk.Detach();
1748 STDMETHODIMP COverlappedWindow::get_DropFiles(VARIANT *pVal)
1754 return m_dropfiles.GetPathArray(pVal);
1757 STDMETHODIMP COverlappedWindow::get_Quit(BOOL *pVal)
1763 *pVal = m_bQuit ? VB_TRUE : VB_FALSE;
1768 STDMETHODIMP COverlappedWindow::put_Quit(BOOL newVal)
1772 //
\83C
\83x
\83\93\83g
\82ð
\94
\90¶
\82³
\82¹
\91Ò
\8b@
\8fó
\91Ô
\82ð
\89ð
\82
1773 SetEvent(m_hWaitEvent);
1778 STDMETHODIMP COverlappedWindow::get_Form(VARIANT *pVal)
1784 //
\83t
\83H
\81[
\83\80\82Ì
\8cö
\8aJ
1785 ::VariantInit(pVal);
1789 CComPtr<IUnknown> pUnk;
1790 if (FAILED(hr = m_pForm->QueryInterface(&pUnk))) {
1793 pVal->vt = VT_UNKNOWN;
1794 pVal->punkVal = pUnk.Detach();
1799 STDMETHODIMP COverlappedWindow::get_Style(long *pVal)
1807 style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
1811 style = windowParam.ComputeStyle();
1814 *pVal = (long)style;
1819 STDMETHODIMP COverlappedWindow::put_Style(long newVal)
1822 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, (DWORD)newVal);
1827 STDMETHODIMP COverlappedWindow::get_Exstyle(long *pVal)
1830 windowParam.exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1832 *pVal = (long)windowParam.exstyle;
1836 STDMETHODIMP COverlappedWindow::put_Exstyle(long newVal)
1838 windowParam.exstyle = (DWORD)newVal;
1840 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.exstyle);
1845 STDMETHODIMP COverlappedWindow::get_WindowClassName(BSTR *pVal)
1851 CComBSTR tmp(windowParam.szClassName);
1852 *pVal = tmp.Detach();
1856 STDMETHODIMP COverlappedWindow::Refresh()
1863 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOCOPYBITS);
1868 void COverlappedWindow::SetTitle()
1873 ATL::CString tmp(m_bstrCaption);
1874 ::SetWindowText(m_hPopupWnd, tmp);
1877 STDMETHODIMP COverlappedWindow::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VARIANT h, VARIANT *pvarUnk)
1879 //
\83T
\83C
\83Y
\95Ï
\8dX
1880 CComVariant varX, varY, varW, varH;
1881 UINT flag = SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE;
1882 if ((x.vt != VT_EMPTY && x.vt != VT_NULL && x.vt != VT_ERROR) && varX.ChangeType(VT_I2, &x) == S_OK) {
1883 windowParam.posX = varX.iVal;
1884 flag &= ~SWP_NOMOVE;
1886 if ((y.vt != VT_EMPTY && y.vt != VT_NULL && y.vt != VT_ERROR) && varY.ChangeType(VT_I2, &y) == S_OK) {
1887 windowParam.posY = varY.iVal;
1888 flag &= ~SWP_NOMOVE;
1890 if ((w.vt != VT_EMPTY && w.vt != VT_NULL && w.vt != VT_ERROR) && varW.ChangeType(VT_I2, &w) == S_OK) {
1891 windowParam.width = varW.iVal;
1892 flag &= ~SWP_NOSIZE;
1894 if ((h.vt != VT_EMPTY && h.vt != VT_NULL && h.vt != VT_ERROR) && varH.ChangeType(VT_I2, &h) == S_OK) {
1895 windowParam.height = varH.iVal;
1896 flag &= ~SWP_NOSIZE;
1898 //
\83E
\83B
\83\93\83h
\83E
\82ª
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82ê
\82Î
\82½
\82¾
\82¿
\82É
\94½
\89f
1900 ::SetWindowPos(m_hPopupWnd, NULL, windowParam.posX, windowParam.posY, windowParam.width, windowParam.height, flag);
1903 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1904 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
1905 windowParam.ComputeStyle(), windowParam.exstyle);
1907 CreateThisInterface(pvarUnk);
1911 void COverlappedWindow::CreateThisInterface(VARIANT* pvarUnk)
1913 ATLASSERT(pvarUnk != NULL);
1915 //
\82±
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
1916 ::VariantInit(pvarUnk);
1918 CComPtr<IUnknown> pUnk;
1919 HRESULT hr = QueryInterface(IID_IUnknown, (void**)&pUnk);
1920 ATLASSERT(SUCCEEDED(hr));
1922 pvarUnk->vt = VT_UNKNOWN;
1923 pvarUnk->punkVal = pUnk.Detach();
1926 STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT caption_system, VARIANT maxmin, VARIANT *pvarUnk)
1928 CComVariant varFrametype, varCaptionSystem, varMaxMin;
1929 if (frametype.vt != VT_EMPTY && frametype.vt != VT_ERROR && frametype.vt != VT_NULL
1930 && varFrametype.ChangeType(VT_I2, &frametype) == S_OK) {
1931 windowParam.frametype = varFrametype.iVal;
1933 if (caption_system.vt != VT_EMPTY && caption_system.vt != VT_ERROR && caption_system.vt != VT_NULL
1934 && varCaptionSystem.ChangeType(VT_I2, &caption_system) == S_OK) {
1935 windowParam.captionbar = (varCaptionSystem.iVal > 0);
1936 windowParam.systemmenu = (varCaptionSystem.iVal > 1);
1938 if (maxmin.vt != VT_EMPTY && maxmin.vt != VT_ERROR && maxmin.vt != VT_NULL
1939 && varMaxMin.ChangeType(VT_I2, &maxmin) == S_OK) {
1940 windowParam.minbox = (varMaxMin.iVal & 0x01);
1941 windowParam.maxbox = (varMaxMin.iVal & 0x02);
1944 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.ComputeStyle());
1947 CreateThisInterface(pvarUnk);
1951 void COverlappedWindow::PurgeUnusedWindows()
1953 //
\8eQ
\8fÆ
\83J
\83E
\83\93\83g
\82ª1
\82Â
\82µ
\82©
\82È
\82¢
\83E
\83B
\83\93\83h
\83E
\82Ì
\94j
\8aü
\82ð
\8ds
\82¤
1954 std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1955 while (p != m_lstChild.end()) {
1956 DWORD refCount = (*p)->m_dwRef;
1957 if ((*p)->m_dwRef == 1) {
1958 //
\8eQ
\8fÆ
\83J
\83E
\83\93\83g
\82ª1
\82µ
\82©
\82È
\82¢ =
\82±
\82Ì
\83N
\83\89\83X
\82µ
\82©
\8eg
\82Á
\82Ä
\82¢
\82È
\82¢ =
\95s
\97v
\8có
\95â
1959 BOOL bVisible = false;
1960 (*p)->get_Visible(&bVisible);
1962 //
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82È
\82¯
\82ê
\82Î
\8fÁ
\82µ
\82Ä
\82æ
\82µ
\81B
1964 p = m_lstChild.erase(p);
1973 STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
1980 ::VariantInit(pvarUnk);
1982 //
\96¢
\8eg
\97p
\82Ì
\83E
\83B
\83\93\83h
\83E
\82ð
\8dí
\8f\9c\82·
\82é
1983 PurgeUnusedWindows();
1985 //
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\8dì
\90¬
1986 CComObject<COverlappedWindow>* pChild = NULL;
1988 if (FAILED(hr = CComObject<COverlappedWindow>::CreateInstance(&pChild))) {
1992 //
\95Ô
\8bp
\97p
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8eæ
\93¾
1993 CComPtr<IUnknown> pUnk;
1994 if (FAILED(hr = pChild->QueryInterface(&pUnk))) {
1999 pChild->SetParent(m_hPopupWnd);
2000 pChild->put_WaitCursor(m_dWaitCursor);
2002 //
\83\8a\83X
\83g
\82É
\95Û
\91¶
\82·
\82é
\82½
\82ß
\8eQ
\8fÆ
\83J
\83E
\83\93\83g+1
\82·
\82é.
2004 m_lstChild.push_back(pChild);
2006 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
2007 pvarUnk->vt = VT_UNKNOWN;
2008 pvarUnk->punkVal = pUnk.Detach();
2012 void COverlappedWindow::SetParent(HWND hParent)
2014 m_hParentWnd = hParent;
2017 HANDLE COverlappedWindow::GetEventHandle()
2019 return m_hWaitEvent;
2022 void COverlappedWindow::SetWaitParam(int *count, HWND *hWnd, HANDLE *hEvent)
2024 //
\82·
\82×
\82Ä
\82Ì
\8eq
\83I
\81[
\83o
\81[
\83\89\83b
\83v
\83E
\83B
\83\93\83h
\83E
\82Ì
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82ð
\8eæ
\93¾
2025 if (*count < MAXIMUM_WAIT_OBJECTS) {
2026 //
\8e©
\95ª
\8e©
\90g
\82ð
\93o
\98^
2027 hEvent[*count] = m_hWaitEvent;
2028 hWnd[*count] = m_hPopupWnd;
2030 //
\83`
\83\83\83C
\83\8b\83h
\82ð
\93o
\98^
2031 std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
2032 while ((p != m_lstChild.end()) && (*count < MAXIMUM_WAIT_OBJECTS)) {
2033 //
\83`
\83\83\83C
\83\8b\83h
\82ª
\8f\8a\97L
\82·
\82é
\83`
\83\83\83C
\83\8b\83h
\82ð
\8dÄ
\8bN
\93I
\82É
\8cÄ
\82Ñ
\8fo
\82·
2034 (*p)->SetWaitParam(count, hWnd, hEvent);
2040 DWORD COverlappedWindow::MessageLoop(DWORD sleeptim, int cnt, HWND *hWnd, HANDLE* hEvent)
2042 //
\83\81\83b
\83Z
\81[
\83W
\83\8b\81[
\83v
\82ð
\8f\88\97\9d\82·
\82é
2044 DWORD retWait = MsgWaitForMultipleObjects(cnt, hEvent, false, sleeptim, QS_ALLEVENTS | QS_ALLINPUT);
2046 if (retWait != WAIT_TIMEOUT) {
2048 if (retWait >= WAIT_OBJECT_0 && retWait < WAIT_OBJECT_0 + cnt) {
2049 //
\83C
\83x
\83\93\83g
\82Ì
\94
\90¶
\82µ
\82½
\83n
\83\93\83h
\83\8b\82ð
\8e¯
\95Ê
\82·
\82é
2050 ret = retWait - WAIT_OBJECT_0 + 1;
2054 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
2055 BOOL bTranslated = false;
2058 //
\83\81\83b
\83Z
\81[
\83W
\82ª
\91®
\82·
\82é
\83I
\81[
\83i
\81[
\83E
\83B
\83\93\83h
\83E
\82ð
\92T
\82µ
\8fo
\82·
2059 HWND hParent = msg.hwnd;
2060 while (!hOwner && hParent) {
2062 for (i = 0; i < cnt && hWnd[i]; i++) {
2063 if (hParent == hWnd[i]) {
2068 hParent = ::GetParent(hParent);
2072 BOOL bTranslatedDlg = false;
2073 if (msg.message == WM_KEYDOWN) {
2074 //
\82Æ
\82 \82¦
\82¸
\81A
\8c»
\8dÝ
\82Ì
\83L
\81[
\83R
\81[
\83h
\82ð
\83E
\83B
\83\93\83h
\83E
\83v
\83\8d\83V
\83W
\83\83\82É
\8f\88\97\9d\82³
\82¹
\82é
2075 ::SendMessage(hOwner, WM_KEYDOWN_EX, msg.wParam, msg.lParam);
2077 //
\83_
\83C
\83A
\83\8d\83O
\82à
\82Ç
\82«
\8f\88\97\9d\82ð
\8ds
\82¤
2078 BOOL bShift = GetKeyState(VK_SHIFT) & 0x8000;
2079 BOOL bCtrl = GetKeyState(VK_CONTROL) & 0x8000;
2080 if (msg.wParam == VK_TAB) {
2083 HWND hNextFocus = ::GetNextDlgTabItem(hOwner, GetFocus(), bShift);
2085 ::SetFocus(hNextFocus);
2088 bTranslatedDlg = true;
2090 else if (msg.wParam == VK_F6) {
2092 SendMessage(hOwner, WM_MOVENEXT_OVERLAPPED, 0, 0);
2093 bTranslatedDlg = true;
2096 if (!bTranslatedDlg) {
2097 bTranslated |= ::IsDialogMessage(hOwner, &msg);
2101 ::TranslateMessage(&msg);
2102 ::DispatchMessage(&msg);
2109 STDMETHODIMP COverlappedWindow::get_AutoMessageLoop(BOOL *pVal)
2111 *pVal = windowParam.automessageloop ? VB_TRUE : VB_FALSE;
2115 STDMETHODIMP COverlappedWindow::put_AutoMessageLoop(BOOL newVal)
2117 windowParam.automessageloop = newVal;
2121 STDMETHODIMP COverlappedWindow::DoModal(VARIANT* pRetCode)
2123 CComVariant dmy, retdmy;
2125 dmy.scode = DISP_E_PARAMNOTFOUND;
2128 CComVariant tim = (short)1000;
2130 while (!m_bQuit && ::IsWindow(m_hPopupWnd)) {
2131 WaitEvent(tim, &ret);
2138 ::VariantInit(pRetCode);
2139 pRetCode->vt = VT_I2;
2140 pRetCode->iVal = m_dModalExitCode;
2144 STDMETHODIMP COverlappedWindow::get_AutoClose(BOOL *pVal)
2146 *pVal = windowParam.autoclose ? VB_TRUE : VB_FALSE;
2150 STDMETHODIMP COverlappedWindow::put_AutoClose(BOOL newVal)
2152 windowParam.autoclose = newVal;
2156 void COverlappedWindow::CreateWindowList(std::list<HWND>& lstWnd, BOOL bSearchRoot)
2159 if (m_hParentWnd && bSearchRoot) {
2160 //
\8dª
\8c³
\82Å
\82È
\82¯
\82ê
\82Î
\81A
\82³
\82ç
\82É
\96â
\82¢
\8d\87\82í
\82¹
\82é
2161 COverlappedWindow* pParent = (COverlappedWindow*)::GetWindowLongPtr(m_hParentWnd, GWLP_USERDATA);
2163 pParent->CreateWindowList(lstWnd, true);
2167 //
\82±
\82±
\82ª
\8dª
\8c³
\82Å
\82 \82é
2168 std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
2169 DWORD stl = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
2170 if (stl & WS_VISIBLE) {
2171 //
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82é
\83E
\83B
\83\93\83h
\83E
\82Ì
\82Ý
\82ð
\93o
\98^
\82·
\82é
2172 lstWnd.push_back(m_hPopupWnd);
2174 while (p != m_lstChild.end()) {
2175 //
\82·
\82×
\82Ä
\82Ì
\8eq
\83I
\81[
\83o
\81[
\83\89\83b
\83v
\82ð
\97ñ
\8b\93\82·
\82é
2177 (*p)->get_HWND((long*)&hWnd);
2178 if (hWnd && ::IsWindow(hWnd)) {
2179 (*p)->CreateWindowList(lstWnd, false);
2186 void COverlappedWindow::MoveNextOverlapped()
2188 //
\8f\87\8f\98\83\8a\83X
\83g
\82Ì
\90¶
\90¬
\82ð
\88Ë
\97\8a\82·
\82é
2189 std::list<HWND>lstWnd;
2190 CreateWindowList(lstWnd, true);
2191 //
\8c»
\8dÝ
\88Ê
\92u
\82ð
\94c
\88¬
\82·
\82é
2192 HWND hActiveWnd = ::GetActiveWindow();
2193 std::list<HWND>::iterator p = lstWnd.begin();
2194 while (p != lstWnd.end()) {
2196 if (hActiveWnd == *p) {
2197 //
\83A
\83N
\83e
\83B
\83u
\83E
\83B
\83\93\83h
\83E
\82ð
\94
\8c©
\82µ
\82½
2199 HWND hNext = lstWnd.front();
2200 if (p != lstWnd.end()) {
2203 // ::SetActiveWindow(hNext);
2211 STDMETHODIMP COverlappedWindow::get_Object(VARIANT idx, VARIANT *pVal)
2213 //
\83I
\81[
\83o
\81[
\83\89\83b
\83v
\83I
\83u
\83W
\83F
\83N
\83g
\82É
\83o
\83C
\83\93\83h
\82·
\82é
\82±
\82Æ
\82Ì
\82Å
\82«
\82é
\98A
\91z
\94z
\97ñ
2214 ::VariantInit(pVal);
2215 pVal->vt = VT_UNKNOWN;
2216 m_pObject->QueryInterface(IID_IUnknown, (void**)&(pVal->punkVal));
2221 STDMETHODIMP COverlappedWindow::get_ExitCode(short *pVal)
2223 *pVal = (short)m_dModalExitCode;
2227 STDMETHODIMP COverlappedWindow::put_ExitCode(short newVal)
2229 m_dModalExitCode = newVal;
2233 STDMETHODIMP COverlappedWindow::get_WaitCursor(short *pVal)
2235 *pVal = (short)m_dWaitCursor;
2239 STDMETHODIMP COverlappedWindow::put_WaitCursor(short newVal)
2241 m_dWaitCursor = newVal;
2243 ::SendMessage(m_hPopupWnd, WM_SETCURSOR, (WPARAM)m_hPopupWnd, 0);
2245 //
\83`
\83\83\83C
\83\8b\83h
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82é
\8fê
\8d\87\82Í
\81A
\83`
\83\83\83C
\83\8b\83h
\82É
\82à
\83E
\83F
\83C
\83g
\83J
\81[
\83\
\83\8b\82ð
\93K
\97p
\82·
\82é
2246 std::list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
2247 while (pWnd != m_lstChild.end()) {
2248 (*pWnd)->put_WaitCursor(newVal);
2254 STDMETHODIMP COverlappedWindow::LoadIcon(VARIANT text)
2256 CComVariant varText;
2257 if (varText.ChangeType(VT_BSTR, &text) != S_OK) {
2258 return DISP_E_TYPEMISMATCH;
2260 ATL::CString szPath(varText.bstrVal);
2263 DestroyIcon(m_hIcon);
2266 m_hIcon = (HICON)LoadImage(NULL, szPath, IMAGE_ICON,
2267 GetSystemMetrics(SM_CXSMICON),
2268 GetSystemMetrics(SM_CYSMICON),
2271 if (m_hIcon && m_hPopupWnd) {
2272 ::SendMessage(m_hPopupWnd, WM_SETICON, false, (LPARAM)m_hIcon);
2277 STDMETHODIMP COverlappedWindow::CenterWindow()
2282 //
\90e
\83E
\83B
\83\93\83h
\83E
\82ª
\82 \82ê
\82Î
\81A
\82»
\82Ì
\92\86\89\9b\82É
\88Ê
\92u
\82 \82í
\82¹
\82·
\82é
2283 ::GetWindowRect(m_hParentWnd, &rct);
2287 HWND hwnd = ::GetDesktopWindow();
2291 ::GetWindowRect(hwnd, &rct);
2294 int x = rct.left + (rct.right - rct.left) / 2 - windowParam.width / 2;
2295 int y = rct.top + (rct.bottom - rct.top) / 2 - windowParam.height / 2;
2296 WINDOWPLACEMENT pls = { 0 };
2297 pls.length = sizeof(WINDOWPLACEMENT);
2298 pls.rcNormalPosition.top = y;
2299 pls.rcNormalPosition.left = x;
2300 pls.rcNormalPosition.bottom = y + windowParam.height;
2301 pls.rcNormalPosition.right = x + windowParam.width;
2302 ::SetWindowPlacement(m_hPopupWnd, &pls);
2307 STDMETHODIMP COverlappedWindow::get_ClassObject(VARIANT* pVal)
2313 ::VariantInit(pVal);
2315 CComVariant tmp(m_pClassDisp);
2316 return tmp.Detach(pVal);
2321 STDMETHODIMP COverlappedWindow::put_ClassObject(VARIANT newVal)
2324 //
\8c»
\8dÝ
\82Ì
\8eQ
\8fÆ
\82ð
\89ð
\8f\9c\82·
\82é.
2325 m_pClassDisp.Release();
2328 if (newVal.vt == VT_EMPTY || newVal.vt == VT_ERROR || newVal.vt == VT_NULL) {
2329 //
\8fÈ
\97ª
\8e\9e\82Ü
\82½
\82ÍNULL, EMPTY
\82Ì
\8fê
\8d\87\82Í
\8eQ
\8fÆ
\89ð
\8f\9c\82Ì
\82Ý
2333 if (newVal.vt != VT_DISPATCH) {
2334 // DISPATCH
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\88È
\8aO
\82ª
\8ew
\92è
\82³
\82ê
\82½
\8fê
\8d\87
2335 return DISP_E_TYPEMISMATCH;
2338 m_pClassDisp = newVal.pdispVal;
2343 HRESULT COverlappedWindow::ClassObjectInvoke(LPCWSTR handler)
2345 if (!m_pClassDisp) {
2352 if (FAILED(hr = m_pClassDisp->GetIDsOfNames(IID_NULL,
2353 (LPWSTR*)&handler, 1, LOCALE_SYSTEM_DEFAULT, &dispid))) {
2357 DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0 };
2359 return m_pClassDisp->Invoke(dispid,
2360 IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
2361 &dispparamsNoArgs, NULL, NULL, NULL);
2364 STDMETHODIMP COverlappedWindow::get_ClientWidth(long *pVal)
2372 ::GetClientRect(m_hPopupWnd, &rct);
2379 STDMETHODIMP COverlappedWindow::get_ClientHeight(long *pVal)
2387 ::GetClientRect(m_hPopupWnd, &rct);
2394 STDMETHODIMP COverlappedWindow::get_innerWidth(double *pVal)
2403 ::GetClientRect(m_hPopupWnd, &rct);
2405 POINT pt = { rct.right, 0 - rct.bottom };
2407 HDC hdc = ::GetWindowDC(m_hPopupWnd);
2409 int md = ::GetMapMode(hdc);
2410 ::SetMapMode(hdc, MM_LOMETRIC); //
\98_
\97\9d\92P
\88Ê
\82ð0.1mm
\82Ö
\95Ï
\8a·
\82·
\82é
2411 ::DPtoLP(hdc, &pt, 1);
2412 ::SetMapMode(hdc, md);
2413 ::ReleaseDC(m_hPopupWnd, hdc);
2415 *pVal = pt.x / 10.; //
\83~
\83\8a\92P
\88Ê
\82Ö
2420 STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal)
2429 ::GetClientRect(m_hPopupWnd, &rct);
2431 POINT pt = { rct.right, 0 - rct.bottom };
2433 HDC hdc = ::GetWindowDC(m_hPopupWnd);
2435 int md = ::GetMapMode(hdc);
2436 ::SetMapMode(hdc, MM_LOMETRIC);//
\98_
\97\9d\92P
\88Ê
\82ð0.1mm
\82Ö
\95Ï
\8a·
\82·
\82é
2437 ::DPtoLP(hdc, &pt, 1);
2438 ::SetMapMode(hdc, md);
2439 ::ReleaseDC(m_hPopupWnd, hdc);
2441 *pVal = pt.y / 10.; //
\83~
\83\8a\92P
\88Ê
\82Ö
2446 STDMETHODIMP COverlappedWindow::get_AutoReleaseClassObject(BOOL *pVal)
2452 *pVal = m_bAutoReleaseClassObject ? VB_TRUE : VB_FALSE;
2457 STDMETHODIMP COverlappedWindow::put_AutoReleaseClassObject(BOOL newVal)
2459 m_bAutoReleaseClassObject = newVal;
2463 STDMETHODIMP COverlappedWindow::get_DefaultAction(BOOL *pVal)
2469 *pVal = m_bDefaultAction ? VB_TRUE : VB_FALSE;
2474 STDMETHODIMP COverlappedWindow::put_DefaultAction(BOOL newVal)
2476 m_bDefaultAction = newVal;
2480 STDMETHODIMP COverlappedWindow::SetClipboardText(BSTR text)
2483 if (::OpenClipboard(m_hPopupWnd)) {
2486 int len = SysStringByteLen(text);
2487 HGLOBAL hGlobal = GlobalAlloc(GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
2488 LPWSTR p = (LPWSTR)GlobalLock(hGlobal);
2489 StringCchCopyW(p, len + 1, text);
2490 GlobalUnlock(hGlobal);
2491 ::SetClipboardData(CF_UNICODETEXT, hGlobal);
2498 STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText)
2501 ::VariantInit(pVarText);
2502 if (::OpenClipboard(m_hPopupWnd)) {
2503 if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
2504 // UNICODE
\95¶
\8e\9a\97ñ
\82ª
\82 \82ê
\82Î
\81A
\82»
\82¿
\82ç
\82ð
\97D
\90æ
\82µ
\82Ä
\8eæ
\93¾
\82·
\82é
2505 HGLOBAL hGlobal = ::GetClipboardData(CF_UNICODETEXT);
2507 LPCWSTR p = (LPCWSTR)GlobalLock(hGlobal);
2510 GlobalUnlock(hGlobal);
2511 pVarText->bstrVal = wstr.Detach();
2512 pVarText->vt = VT_BSTR;
2517 else if (IsClipboardFormatAvailable(CF_TEXT)) {
2518 // UNICODE
\95¶
\8e\9a\97ñ
\82ª
\82È
\82¢
\8fê
\8d\87
2519 HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT);
2521 LPCSTR p = (LPCSTR)GlobalLock(hGlobal);
2524 GlobalUnlock(hGlobal);
2525 pVarText->bstrVal = wstr.Detach();
2526 pVarText->vt = VT_BSTR;