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 COverlappedWindow::COverlappedWindow()
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¬
58 m_hLastFocusControl = NULL;
59 if (m_pForm->CreateInstance(&m_pForm) == S_OK) {
61 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
62 windowParam.GetStyle(), windowParam.exstyle);
64 //
\95`
\89æ
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\90¶
\90¬
66 if (m_pCanvas->CreateInstance(&m_pCanvas) == S_OK) {
69 //
\83\86\81[
\83U
\81[
\92è
\8b`
\98A
\91z
\94z
\97ñ
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\90¶
\90¬
71 if (m_pObject->CreateInstance(&m_pObject) == S_OK) {
74 //
\83E
\83F
\83C
\83g
\83J
\81[
\83\
\83\8b\82Ì
\8f\89\8aú
\89»
78 HRESULT COverlappedWindow::FinalConstruct()
80 return CoCreateFreeThreadedMarshaler(
81 GetControllingUnknown(), &m_pUnkMarshaler.p);
84 void COverlappedWindow::FinalRelease()
86 //
\83E
\83B
\83\93\83h
\83E
\82ª
\94j
\8aü
\82³
\82ê
\82é
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
\83C
\83x
\83\93\83g
88 ClassObjectInvoke(L"ExitWindow");
90 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\95ú
\8aü
92 m_pClassDisp->Release();
96 //
\83A
\83C
\83R
\83\93\82Ì
\94j
\8aü
98 ::DestroyIcon(m_hIcon);
100 //
\83`
\83\83\83C
\83\8b\83h
\83|
\83b
\83v
\83A
\83b
\83v
\82Ì
\94j
\8aü
101 list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
102 while (pWnd != m_lstChild.end()) {
105 pWnd = m_lstChild.erase(pWnd);
107 //
\83C
\83x
\83\93\83g
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
113 //
\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ü
115 m_pCanvas->DetachOwner();
116 m_pCanvas->Release();
119 //
\83t
\83H
\81[
\83\80\82Ì
\94j
\8aü
121 m_pForm->DetachOwner();
125 //
\83\86\81[
\83U
\81[
\92è
\8b`
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
127 m_pObject->Release();
131 //
\94w
\8ci
\83u
\83\89\83V
\82Ì
\89ð
\95ú
133 DeleteObject(m_hBkBrush);
136 EnterCriticalSection(&m_objEventDataProtection);
137 //
\83C
\83x
\83\93\83g
\83f
\81[
\83^
\82Ì
\89ð
\95ú
138 list<CComObject<CEvent>*>::iterator pEv = m_lstEvent.begin();
139 while (pEv != m_lstEvent.end()) {
141 pEv = m_lstEvent.erase(pEv);
143 LeaveCriticalSection(&m_objEventDataProtection);
145 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82Ì
\89ð
\95ú
147 CloseHandle(m_hWaitEvent);
150 //
\83\81\83j
\83\85\81[
\82Ì
\94j
\8aü
152 DestroyMenu(m_hMenu);
155 //
\83\81\83C
\83\93\83E
\83B
\83\93\83h
\83E
\82Ì
\94j
\8aü
157 ::DestroyWindow(m_hPopupWnd);
160 //
\83N
\83\8a\83e
\83B
\83J
\83\8b\83Z
\83b
\83V
\83\87\83\93\82Ì
\94j
\8aü
161 DeleteCriticalSection(&m_objEventDataProtection);
163 m_pUnkMarshaler.Release();
164 ATLTRACE("COverlappedWindow::FinalRelease\r\n");
167 STDMETHODIMP COverlappedWindow::get_Caption(BSTR* pVal)
169 *pVal = SysAllocString(m_bstrCaption);
173 STDMETHODIMP COverlappedWindow::put_Caption(BSTR newVal)
175 SysReAllocString(&m_bstrCaption, newVal);
180 STDMETHODIMP COverlappedWindow::get_backColor(long *pVal)
182 *pVal = m_dwBackColor;
186 STDMETHODIMP COverlappedWindow::put_backColor(long newVal)
188 m_dwBackColor = newVal;
190 DeleteObject(m_hBkBrush);
192 m_hBkBrush = CreateSolidBrush(COLORREF(newVal));
194 ::InvalidateRect(m_hPopupWnd, NULL, true);
195 ::UpdateWindow(m_hPopupWnd);
200 HWND COverlappedWindow::SafeCreateWnd()
202 //
\90¶
\90¬
\8dÏ
\82Ý
\82Å
\82 \82ê
\82Î
\89½
\82à
\82µ
\82È
\82¢
\81B
206 //
\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Ý
207 //
\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¤
209 if (windowParam.noclose) {
210 //
\95Â
\82¶
\82é
\83{
\83^
\83\93\82È
\82µ
\83^
\83C
\83v
211 windowParam.SetWindowClassName(_TEXT("SeraphyScriptToolsOverlappedWindowNC"));
212 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_NOCLOSE;
215 windowParam.SetWindowClassName(_TEXT("SeraphyScriptToolsOverlappedWindow"));
216 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
219 WNDCLASSEX wcex = {0};
220 wcex.cbSize = sizeof(WNDCLASSEX);
221 wcex.lpfnWndProc = (WNDPROC)WindowProc;
224 wcex.hInstance = _Module.m_hInst;
225 wcex.hIcon = NULL;//(HICON)LoadImage(NULL,"SETUPICON.ICO",IMAGE_ICON,16,16,LR_LOADFROMFILE);//LoadIcon(hInstance, (LPCTSTR)IDI_INSTPAC);
226 wcex.hIconSm = m_hIcon;//LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
227 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
228 wcex.hbrBackground = NULL;
229 wcex.lpszMenuName = NULL;
230 wcex.lpszClassName = windowParam.szClassName;
231 wcex.style = windowParam.wndstyle;
232 ATOM atm = RegisterClassEx(&wcex);
234 HWND hWnd = CreateWindowEx(
236 windowParam.szClassName,
237 _TEXT(""), //
\83_
\83~
\81[
238 windowParam.GetStyle(),
244 NULL, _Module.m_hInst, this);
245 ::SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) this); //
\83N
\83\89\83X
\82Æ
\8aÖ
\98A
\95t
\82¯
\82é
247 //
\83E
\83B
\83\93\83h
\83E
\83X
\83^
\83C
\83\8b\82Ì
\8dÄ
\90Ý
\92è
248 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.GetStyle());
251 //
\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é
252 HMENU hMenu = ::GetSystemMenu(m_hPopupWnd, false);
253 int cnt = ::GetMenuItemCount(hMenu);
254 MENUITEMINFO minfo = {0};
255 minfo.cbSize = sizeof(MENUITEMINFO);
256 minfo.fMask = MIIM_TYPE | MIIM_ID;
257 minfo.fType = MFT_STRING;
258 minfo.wID = WM_MOVENEXT_OVERLAPPED;
259 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é
260 ::InsertMenuItem(hMenu, cnt, true, &minfo);
262 //
\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é
264 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\82Ì
\8e\96\91O
\8dì
\90¬
\95ª
\82à
\8e©
\93®
\90¶
\90¬
\82³
\82ê
\82é
265 m_pForm->AttachOwner(m_hPopupWnd);
268 //
\83E
\83B
\83\93\83h
\83E
\82ª
\90¶
\90¬
\82³
\82ê
\82½
\83C
\83x
\83\93\83g
\82ð
\94
\8ds
\82·
\82é
270 ClassObjectInvoke(L"InitWindow");
275 LRESULT CALLBACK COverlappedWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
277 COverlappedWindow* me = (COverlappedWindow*)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
279 //
\8bÙ
\8b}
\92â
\8e~
\82Ì
\94»
\92è
280 if (GetAsyncKeyState(VK_PAUSE) & 0x8000) {
281 ::EnableWindow(hWnd, true);
283 me->m_dModalExitCode = 3;
287 case WM_MOVENEXT_OVERLAPPED:
289 me->MoveNextOverlapped();
294 //
\83f
\83B
\83t
\83H
\83\8b\83g
\82Ì
\93®
\8dì
\82ð
\8ds
\82¤
301 ::GetClientRect(hWnd, &rt);
302 HDC hdc = ::BeginPaint(hWnd, &ps);
305 BOOL bDblBuf = me->windowParam.doublebuffer;
307 //
\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
308 hdc2 = ::CreateCompatibleDC(NULL);
309 bmp = ::CreateCompatibleBitmap(hdc, rt.right, rt.bottom);
310 ::SelectObject(hdc2, bmp);
312 //
\94w
\8ci
\82ð
\93h
\82è
\82Â
\82Ô
\82·
313 ::SetBkColor(hdc2, COLORREF(me->m_dwBackColor));
314 ::SetBkMode(hdc2, TRANSPARENT);
315 ::SetPolyFillMode(hdc2, ALTERNATE);
316 FillRect(hdc2, &rt, me->m_hBkBrush);
318 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83f
\81[
\83^
\81[
\82Ì
\95`
\89æ
320 me->m_pCanvas->Draw(hdc2, rt);
324 //
\83_
\83u
\83\8b\83o
\83b
\83t
\83@
\82Ì
\93]
\91\97
325 ::BitBlt(hdc, 0, 0, rt.right, rt.bottom, hdc2, 0, 0, SRCCOPY);
329 ::EndPaint(hWnd, &ps);
334 if (wParam == SC_CLOSE) {
335 if (me->windowParam.autoclose) {
339 me->m_dModalExitCode = IDABORT;
340 me->AddEventSingle(WM_COMMAND, IDABORT, 0);
343 else if (wParam == WM_MOVENEXT_OVERLAPPED) {
344 SendMessage(hWnd, WM_MOVENEXT_OVERLAPPED, 0, 0);
351 me->AddEventSingle(WM_MOUSEMOVE, 0, 0);
354 case WM_LBUTTONDBLCLK:
356 me->AddEvent(WM_LBUTTONDBLCLK, 0, 0);
359 case WM_RBUTTONDBLCLK:
361 me->AddEvent(WM_RBUTTONDBLCLK, 0, 0);
366 if (me->m_dCaptureMode == 0) {
367 me->AddEvent(WM_LBUTTONDOWN, 0, 0);
369 me->m_dCaptureMode |= 0x01;
378 if (me->m_dCaptureMode & 0x01) {
379 me->AddEvent(WM_LBUTTONUP, 0, 0);
380 me->m_dCaptureMode &= ~0x01;
387 if (me->m_dCaptureMode == 0) {
388 me->AddEvent(WM_RBUTTONDOWN, 0, 0);
390 me->m_dCaptureMode |= 0x02;
399 if (me->m_dCaptureMode & 0x02) {
400 me->AddEvent(WM_RBUTTONUP, 0, 0);
401 me->m_dCaptureMode &= ~0x02;
406 case WM_CAPTURECHANGED:
408 if (me->m_dCaptureMode & 0x01) {
409 me->AddEvent(WM_CAPTURECHANGED, 1, 0);
411 if (me->m_dCaptureMode & 0x02) {
412 me->AddEvent(WM_CAPTURECHANGED, 2, 0);
414 me->m_dCaptureMode = 0;
419 me->AddEventSingle(WM_SIZE, 0, 0);
425 me->AddEventSingle(WM_TIMER, 0, 0);
431 HDROP hDrop = (HDROP)wParam;
432 me->m_dropfiles.DropFiles(hDrop);
433 me->AddEvent(WM_DROPFILES, 0, 0);
439 if (GetKeyState(VK_SHIFT) & 0x8000) st |= 0x01;
440 if (GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02;
441 if (GetKeyState(VK_MENU) & 0x8000) st |= 0x04;
442 me->AddEventSingle(WM_KEYDOWN, wParam, st);
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_EX, wParam, st);
458 wsprintf(mes, _TEXT("command=%d:%d\n"), HIWORD(wParam), LOWORD(wParam));
459 OutputDebugString(mes);
461 HWND hControl = (HWND)lParam;
462 int nID = LOWORD(wParam);
463 int notify = HIWORD(wParam);
465 if (nID == IDABORT) {
466 // IDABORT
\82Æ
\93¯
\88ê
\82È
\82çquit
\82ð
\97§
\82Ä
\82é
469 me->AddEventSingle(WM_COMMAND, nID, 0);
472 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\92Ê
\92m
478 // 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é
479 me->m_hLastFocusControl = hControl;
482 // LISTBOX
\82ª
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
483 me->AddEvent(WM_COMMAND, nID, 0);
492 NMHDR* notify = (NMHDR*)lParam;
493 switch (notify->code) {
496 // TreeView - ListView
\82ª
\83t
\83H
\81[
\83J
\83X
\82ð
\8eó
\82¯
\8eæ
\82Á
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
497 me->m_hLastFocusControl = notify->hwndFrom;
502 // TreeView
\82Ì
\91I
\91ð
\82ª
\95Ï
\8dX
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82³
\82ê
\82é
503 LPNMTREEVIEW pnmTv = (LPNMTREEVIEW)lParam;
504 me->AddEvent(WM_COMMAND, pnmTv->hdr.idFrom, 0);
509 // ListView - TreeView
\82Å
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82³
\82ê
\82½
510 LPNMITEMACTIVATE pnmLv = (LPNMITEMACTIVATE)lParam;
511 me->AddEvent(WM_COMMAND, pnmLv->hdr.idFrom, 0);
514 case LVN_COLUMNCLICK:
516 // ListView
\82Å
\83J
\83\89\83\80\82ª
\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
517 LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam;
518 LONG_PTR addr = ::GetWindowLongPtr(pnmv->hdr.hwndFrom, GWLP_USERDATA);
520 //
\83J
\83\89\83\80\83N
\83\8a\83b
\83N
\82É
\82æ
\82é
\83\
\81[
\83e
\83B
\83\93\83O
\82ð
\8ds
\82¤
521 CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr;
522 pCtrl->ListSort(pnmv->iSubItem);
526 case LVN_ENDLABELEDIT:
528 // ListView
\82Å
\8d\80\96Ú
\82ª
\95Ò
\8fW
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
529 NMLVDISPINFO* pdi = (NMLVDISPINFO*)lParam;
530 if (pdi->item.mask & LVIF_TEXT) {
531 ListView_SetItemText(pdi->hdr.hwndFrom, pdi->item.iItem, 0, pdi->item.pszText);
537 // ListView
\82Å
\83L
\81[
\83{
\81[
\83h
\82ª
\89\9f\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
538 LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam;
539 if (pnkd->wVKey == VK_SPACE) {
540 //
\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é
541 me->AddEvent(WM_COMMAND, pnkd->hdr.idFrom, 0);
543 else if (pnkd->wVKey == VK_DELETE) {
544 //
\83f
\83\8a\81[
\83g
545 me->AddEvent(WM_NOTIFY, pnkd->hdr.idFrom, VK_DELETE);
547 else if (pnkd->wVKey == VK_F2) {
548 //
\83\89\83x
\83\8b\95Ò
\8fW
\8aJ
\8en
549 int idx = ListView_GetNextItem(pnkd->hdr.hwndFrom, -1, LVNI_FOCUSED);
550 ListView_EditLabel(pnkd->hdr.hwndFrom, idx);
556 LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)lParam;
557 if (ptvkd->wVKey == VK_DELETE) {
558 //
\83f
\83\8a\81[
\83g
559 me->AddEvent(WM_NOTIFY, ptvkd->hdr.idFrom, VK_DELETE);
565 // ListView - TreeView
\82Å
\89E
\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
566 LPNMHDR lpnmh = (LPNMHDR)lParam;
567 LONG_PTR addr = ::GetWindowLongPtr(lpnmh->hwndFrom, GWLP_USERDATA);
569 CComObject<CControl>* pCtrl = (CComObject<CControl>*)addr;
570 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é
572 me->AddEvent(WM_NOTIFY, lpnmh->idFrom, VK_RBUTTON);
580 case WM_CTLCOLORSTATIC:
582 HDC hdc = (HDC)wParam;
583 ::SetBkColor(hdc, me->m_dwBackColor);
584 ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT));
585 return (LPARAM)me->m_hBkBrush;
587 case WM_CTLCOLOREDIT:
588 case WM_CTLCOLORLISTBOX:
589 case WM_CTLCOLORMSGBOX:
592 //
\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é
593 HDC hdc = (HDC)wParam;
594 ::SetBkColor(hdc, me->m_pForm->GetControlColor());
595 ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT));
596 return (LPARAM)me->m_pForm->GetControlColorBrush();
602 if (me->m_dWaitCursor > 0) {
603 ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
609 return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
612 STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult)
619 //
\83C
\83x
\83\93\83L
\83\85\81[
\82Ì
\8eæ
\93¾
620 EnterCriticalSection(&m_objEventDataProtection);
621 CComObject<CEvent>* pEv = NULL;
622 if (!m_lstEvent.empty()) {
623 //
\83C
\83x
\83\93\83g
\83\8a\83X
\83g
\82É
\83f
\81[
\83^
\81[
\82ª
\93ü
\82Á
\82Ä
\82¢
\82é
624 pEv = m_lstEvent.front();
625 m_lstEvent.pop_front();
627 if (m_lstEvent.empty()) {
628 //
\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é
629 ResetEvent(m_hWaitEvent);
632 //
\82Ü
\82¾
\83\81\83b
\83Z
\81[
\83W
\82ª
\82 \82é
\82Ì
\82Å
\83C
\83x
\83\93\83g
\82ð
\82½
\82Ä
\82é
633 SetEvent(m_hWaitEvent);
635 LeaveCriticalSection(&m_objEventDataProtection);
637 //
\8eæ
\82è
\8fo
\82µ
\82½
\83C
\83x
\83\93\83g
\82Ì
\8f\88\97\9d
639 //
\95Ô
\93\9a\83C
\83x
\83\93\83g
\83R
\81[
\83h
640 ret = pEv->GetMessage();
642 if (pEv->GetMessage() == WM_TIMER) {
643 //
\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ß
644 //
\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
646 ClassObjectInvoke(L"OnTimer");
649 //
\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é
651 //
\8cÃ
\82¢
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
657 //
\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é
658 IUnknown* pUnk = NULL;
659 QueryInterface(IID_IUnknown, (void**)&pUnk);
660 //
\83C
\83x
\83\93\83g
\82É
\91Î
\82·
\82é
\83\89\83C
\83Y
661 switch (pEv->GetMessage()) {
665 Fire_OnKeydownEx(pUnk);
666 ClassObjectInvoke(L"OnKeydown");
672 Fire_OnKeydown2Ex(pUnk);
673 ClassObjectInvoke(L"OnKeydown2");
679 Fire_OnMouseMoveEx(pUnk);
680 ClassObjectInvoke(L"OnMouseMove");
683 case WM_LBUTTONDBLCLK:
686 Fire_OnDblClickEx(pUnk);
687 ClassObjectInvoke(L"OnDblClick");
693 Fire_OnClickEx(pUnk);
694 ClassObjectInvoke(L"OnClick");
697 case WM_RBUTTONDBLCLK:
700 Fire_OnRDblClickEx(pUnk);
701 ClassObjectInvoke(L"OnRDblClick");
707 Fire_OnRClickEx(pUnk);
708 ClassObjectInvoke(L"OnRClick");
714 Fire_OnClickOutEx(pUnk);
715 ClassObjectInvoke(L"OnClickOut");
721 Fire_OnRClickOutEx(pUnk);
722 ClassObjectInvoke(L"OnRClickOut");
725 case WM_CAPTURECHANGED:
727 if (pEv->GetParam() == 1) {
728 Fire_OnClickCancel();
729 Fire_OnClickCancelEx(pUnk);
730 ClassObjectInvoke(L"OnClickCancel");
733 Fire_OnRClickCancel();
734 Fire_OnRClickCancelEx(pUnk);
735 ClassObjectInvoke(L"OnRClickCancel");
743 ClassObjectInvoke(L"OnSize");
748 int nID = pEv->GetParam();
751 if (m_bDefaultAction) {
754 m_dModalExitCode = IDOK;
757 ClassObjectInvoke(L"OnOK");
760 if (m_bDefaultAction) {
763 m_dModalExitCode = IDCANCEL;
765 Fire_OnCancelEx(pUnk);
766 ClassObjectInvoke(L"OnCancel");
770 m_dModalExitCode = IDABORT;
773 ClassObjectInvoke(L"OnExit");
777 Fire_OnCommandEx(pUnk);
778 ClassObjectInvoke(L"OnCommand");
780 //
\8aÖ
\98A
\82Ã
\82¯
\82ç
\82ê
\82½
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ª
\82 \82é
\82Ì
\82©
\81H
782 BSTR eventname = NULL;
783 if (m_pForm->FindControlEventName(nID, &eventname)) {
784 if (SysStringLen(eventname) > 0) {
785 ClassObjectInvoke(eventname);
787 SysFreeString(eventname);
790 //
\83\81\83j
\83\85\81[
\82Ì
\8c\9f\8dõ
791 if (m_hMenu && nID >= 100) {
792 map<int, CComBSTR>::iterator p = m_cMenuMap.find(nID);
793 if (p != m_cMenuMap.end()) {
794 //
\94
\8c©
\82³
\82ê
\82½
795 ClassObjectInvoke(p->second);
803 Fire_OnDropFilesEx(pUnk);
804 ClassObjectInvoke(L"OnDropFiles");
809 switch (pEv->GetLParam()) {
811 Fire_OnContextDelete();
812 Fire_OnContextDeleteEx(pUnk);
813 ClassObjectInvoke(L"OnContextDelete");
816 Fire_OnContextMenu();
817 Fire_OnContextMenuEx(pUnk);
818 ClassObjectInvoke(L"OnContextMenu");
824 //
\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é
829 //
\8f\88\97\9d\82³
\82ê
\82½
\83C
\83x
\83\93\83g
\82Í
\89ð
\95ú
\82·
\82é
833 //
\83C
\83x
\83\93\83g
\82ª
\82È
\82¢
\8fê
\8d\87\82Í
\83C
\83x
\83\93\83g
\82Ì
\83N
\83\8a\83A
835 //
\8cÃ
\82¢
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
840 //
\83C
\83x
\83\93\83g
\83R
\81[
\83h
\82ð
\96ß
\82·
\81B
841 ret.Detach(varResult);
845 void COverlappedWindow::AddEventSingle(int message, WPARAM wParam, LPARAM lParam)
847 //
\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
849 EnterCriticalSection(&m_objEventDataProtection);
850 list<CComObject<CEvent>*>::iterator p = m_lstEvent.begin();
851 while (p != m_lstEvent.end()) {
852 if ((*p)->GetMessage() == message && (*p)->GetParam() == wParam) {
858 LeaveCriticalSection(&m_objEventDataProtection);
860 //
\93¯
\88ê
\83C
\83x
\83\93\83g
\82ª
\82È
\82¯
\82ê
\82Î
\83C
\83x
\83\93\83g
\82Ì
\94
\8ds
\82ð
\8ds
\82¤
861 AddEvent(message, wParam, lParam);
865 void COverlappedWindow::AddEvent(int message, WPARAM wParam, LPARAM lParam)
867 //
\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é
869 DWORD pos = GetMessagePos();
874 ::ScreenToClient(m_hPopupWnd, &pt);
875 //
\8dÀ
\95W
\8cn
\82Ì
\95Ï
\8a·
877 HDC hdc = ::GetDC(m_hPopupWnd);
880 ::GetClientRect(m_hPopupWnd, &rct);
881 ::SetViewportOrgEx(hdc, 0, rct.bottom, &org);
882 int md = ::GetMapMode(hdc);
883 ::SetMapMode(hdc, MM_LOMETRIC);
884 ::DPtoLP(hdc, &lp, 1);
885 ::SetMapMode(hdc, md);
886 ::SetViewportOrgEx(hdc, org.x, org.y, NULL);
887 ::ReleaseDC(m_hPopupWnd, hdc);
890 //
\83C
\83x
\83\93\83g
\82Ì
\90Ï
\82Ý
\8fã
\82°
891 EnterCriticalSection(&m_objEventDataProtection);
892 CComObject<CEvent>* pEvent;
893 if (pEvent->CreateInstance(&pEvent) == S_OK) {
895 pEvent->SetData(message, wParam, lParam, pt, lp);
896 m_lstEvent.push_back(pEvent);
898 LeaveCriticalSection(&m_objEventDataProtection);
900 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82ð
\83V
\83O
\83i
\83\8b\82É
\82·
\82é
901 SetEvent(m_hWaitEvent);
903 if (windowParam.automessageloop) {
904 //
\82½
\82¾
\82¿
\82É
\83C
\83x
\83\93\83g
\8f\88\97\9d\82ð
\8ds
\82¤
911 STDMETHODIMP COverlappedWindow::Draw()
915 ::InvalidateRect(m_hPopupWnd, NULL, true);
916 ::UpdateWindow(m_hPopupWnd);
922 STDMETHODIMP COverlappedWindow::get_IsEventEmpty(BOOL *pVal)
924 //
\83C
\83x
\83\93\83g
\82ª
\8bó
\82È
\82çtrue
925 *pVal = m_lstEvent.empty() ? VB_TRUE : VB_FALSE;
929 STDMETHODIMP COverlappedWindow::Open(VARIANT caption, VARIANT* pvarUnk)
933 if ((caption.vt != VT_ERROR && caption.vt != VT_NULL) && tmp.ChangeType(VT_BSTR, &caption) == S_OK) {
934 put_Caption(tmp.bstrVal);
939 m_dModalExitCode = 0; //
\83\82\81[
\83_
\83\8b\95Ô
\93\9a\83R
\81[
\83h
940 CreateThisInterface(pvarUnk);
944 STDMETHODIMP COverlappedWindow::Close()
946 //
\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é
947 list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
948 while (pWnd != m_lstChild.end()) {
952 //
\82±
\82Ì
\83E
\83B
\83\93\83h
\83E
\82ð
\94ñ
\95\
\8e¦
\82É
\82·
\82é
956 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\95ú
\8aü
957 if (m_pClassDisp && m_bAutoReleaseClassObject) {
958 m_pClassDisp->Release();
962 //
\83t
\83H
\81[
\83J
\83X
\82ð
\88Ú
\93®
\82·
\82é
964 ::SetActiveWindow(m_hParentWnd);
965 ::SetFocus(m_hParentWnd);
968 MoveNextOverlapped();
973 STDMETHODIMP COverlappedWindow::get_DoubleBuffer(BOOL *pVal)
975 *pVal = windowParam.doublebuffer ? VB_TRUE : VB_FALSE;
979 STDMETHODIMP COverlappedWindow::put_DoubleBuffer(BOOL newVal)
981 windowParam.doublebuffer = newVal;
986 STDMETHODIMP COverlappedWindow::get_TopMost(BOOL *pVal)
989 DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
990 *pVal = (exstyle & WS_EX_TOPMOST) ? VB_TRUE : VB_FALSE;
994 STDMETHODIMP COverlappedWindow::put_TopMost(BOOL newVal)
997 ::SetWindowPos(m_hPopupWnd, newVal ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
1001 STDMETHODIMP COverlappedWindow::get_PosX(short *pVal)
1004 WINDOWPLACEMENT pls = {0};
1005 pls.length = sizeof(WINDOWPLACEMENT);
1006 ::GetWindowPlacement(m_hPopupWnd, &pls);
1007 windowParam.posX = (int)pls.rcNormalPosition.left;
1009 *pVal = windowParam.posX;
1013 STDMETHODIMP COverlappedWindow::put_PosX(short newVal)
1015 windowParam.posX = newVal;
1017 WINDOWPLACEMENT pls = {0};
1018 pls.length = sizeof(WINDOWPLACEMENT);
1019 ::GetWindowPlacement(m_hPopupWnd, &pls);
1020 ::SetWindowPos(m_hPopupWnd, NULL,
1022 pls.rcNormalPosition.top,
1023 0, 0, SWP_NOZORDER | SWP_NOSIZE);
1028 STDMETHODIMP COverlappedWindow::get_PosY(short *pVal)
1031 WINDOWPLACEMENT pls = {0};
1032 pls.length = sizeof(WINDOWPLACEMENT);
1033 ::GetWindowPlacement(m_hPopupWnd, &pls);
1034 windowParam.posY = (int)pls.rcNormalPosition.top;
1036 *pVal = windowParam.posY;
1040 STDMETHODIMP COverlappedWindow::put_PosY(short newVal)
1042 windowParam.posY = newVal;
1044 WINDOWPLACEMENT pls = {0};
1045 pls.length = sizeof(WINDOWPLACEMENT);
1046 ::GetWindowPlacement(m_hPopupWnd, &pls);
1047 ::SetWindowPos(m_hPopupWnd, NULL,
1048 pls.rcNormalPosition.left,
1050 0, 0, SWP_NOZORDER | SWP_NOSIZE);
1055 STDMETHODIMP COverlappedWindow::get_Width(short *pVal)
1058 WINDOWPLACEMENT pls = {0};
1059 pls.length = sizeof(WINDOWPLACEMENT);
1060 ::GetWindowPlacement(m_hPopupWnd, &pls);
1061 windowParam.width = (int)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1063 *pVal = windowParam.width;
1067 STDMETHODIMP COverlappedWindow::put_Width(short newVal)
1069 windowParam.width = newVal;
1071 WINDOWPLACEMENT pls = {0};
1072 pls.length = sizeof(WINDOWPLACEMENT);
1073 ::GetWindowPlacement(m_hPopupWnd, &pls);
1074 ::SetWindowPos(m_hPopupWnd, NULL,
1077 pls.rcNormalPosition.bottom - pls.rcNormalPosition.top, SWP_NOZORDER | SWP_NOMOVE);
1080 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1081 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
1082 windowParam.GetStyle(), windowParam.exstyle);
1087 STDMETHODIMP COverlappedWindow::get_Height(short *pVal)
1090 WINDOWPLACEMENT pls = {0};
1091 pls.length = sizeof(WINDOWPLACEMENT);
1092 ::GetWindowPlacement(m_hPopupWnd, &pls);
1093 windowParam.height = (short)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1095 *pVal = windowParam.height;
1099 STDMETHODIMP COverlappedWindow::put_Height(short newVal)
1101 windowParam.height = newVal;
1103 WINDOWPLACEMENT pls = {0};
1104 pls.length = sizeof(WINDOWPLACEMENT);
1105 ::GetWindowPlacement(m_hPopupWnd, &pls);
1106 ::SetWindowPos(m_hPopupWnd, NULL, 0, 0,
1107 pls.rcNormalPosition.right - pls.rcNormalPosition.left,
1109 SWP_NOZORDER | SWP_NOMOVE);
1112 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1113 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
1114 windowParam.GetStyle(), windowParam.exstyle);
1119 STDMETHODIMP COverlappedWindow::get_AcceptFiles(BOOL *pVal)
1122 DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1123 *pVal = (exstyle & WS_EX_ACCEPTFILES) ? VB_TRUE : VB_FALSE;
1127 STDMETHODIMP COverlappedWindow::put_AcceptFiles(BOOL newVal)
1130 DWORD exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1131 exstyle &= ~WS_EX_ACCEPTFILES;
1132 exstyle |= newVal ? WS_EX_ACCEPTFILES : 0;
1133 ::SetWindowLong(m_hPopupWnd, GWL_EXSTYLE, exstyle);
1137 STDMETHODIMP COverlappedWindow::SetForegroundWindow()
1140 ::SetForegroundWindow(m_hPopupWnd);
1144 STDMETHODIMP COverlappedWindow::SetFocus()
1147 ::SetFocus(m_hPopupWnd);
1151 STDMETHODIMP COverlappedWindow::get_Enable(BOOL *pVal)
1154 *pVal = ::IsWindowEnabled(m_hPopupWnd) ? VB_TRUE : VB_FALSE;
1158 STDMETHODIMP COverlappedWindow::put_Enable(BOOL newVal)
1161 ::EnableWindow(m_hPopupWnd, newVal);
1163 m_pForm->EnableAllControl(newVal);
1164 ::SetActiveWindow(m_hPopupWnd);
1170 STDMETHODIMP COverlappedWindow::get_Iconic(BOOL *pVal)
1173 *pVal = ::IsIconic(m_hPopupWnd) ? VB_TRUE : VB_FALSE;
1177 STDMETHODIMP COverlappedWindow::put_Iconic(BOOL newVal)
1180 ::ShowWindow(m_hPopupWnd, newVal ? SW_MINIMIZE : SW_SHOWNORMAL);
1185 STDMETHODIMP COverlappedWindow::get_Zoomed(BOOL *pVal)
1188 *pVal = ::IsZoomed(m_hPopupWnd) ? VB_TRUE : VB_FALSE;
1192 STDMETHODIMP COverlappedWindow::put_Zoomed(BOOL newVal)
1195 ::ShowWindow(m_hPopupWnd, newVal ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL);
1199 STDMETHODIMP COverlappedWindow::get_Visible(BOOL *pVal)
1202 if (::IsWindow(m_hPopupWnd)) {
1203 //
\83E
\83B
\83\93\83h
\83E
\82ª
\8dì
\90¬
\8dÏ
\82Ý
\82Å
\82 \82ê
\82Î
\92²
\8d¸
\82·
\82é
1204 DWORD style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
1205 *pVal = (style & WS_VISIBLE) ? VB_TRUE : VB_FALSE;
1210 STDMETHODIMP COverlappedWindow::put_Visible(BOOL newVal)
1212 if (!newVal && !::IsWindow(m_hPopupWnd)) {
1213 // FALSE
\82È
\82ç
\81A
\82 \82¦
\82Ä
\8dì
\90¬
\82Í
\8e\8e\82Ý
\82È
\82¢
1217 ::ShowWindow(m_hPopupWnd, newVal ? SW_SHOWNORMAL : SW_HIDE);
1218 ::SetActiveWindow(m_hPopupWnd);
1222 STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim, BOOL* pRet)
1227 //
\91Ò
\8b@
\8e\9e\8aÔ
\82Ì
\8eæ
\93¾
1228 DWORD sleeptim = 1000;
1230 if (tim.ChangeType(VT_I4, &varTim) == S_OK) {
1231 sleeptim = (DWORD)tim.lVal;
1233 if (sleeptim == 0) {
1234 sleeptim = INFINITE;
1237 HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = {NULL};
1238 HWND hWnd[MAXIMUM_WAIT_OBJECTS] = {NULL};
1240 SetWaitParam(&cnt, hWnd, hEvent);
1241 *pRet = MessageLoop(sleeptim, cnt, hWnd, hEvent) ? VB_TRUE : VB_FALSE;
1246 STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt)
1249 HRESULT hRet = S_OK;
1251 if (tmp.ChangeType(VT_BSTR, &fmt) == S_OK) {
1252 ATL::CString buf(tmp.bstrVal);
1254 //
\8cÃ
\82¢
\83\81\83j
\83\85\81[
\82ð
\94j
\8aü
\82·
\82é
1257 ::SetMenu(m_hPopupWnd, NULL);
1258 DestroyMenu(m_hMenu);
1262 if (buf.GetLength() > 0) {
1263 //
\8d\80\96Ú
\82ª
\82 \82ê
\82Î
\83\81\83j
\83\85\81[
\96¼
\82ð
\83p
\81[
\83X
\82·
\82é
1264 m_hMenu = CreateMenu();
1265 TCHAR menuname[MAX_PATH];
1266 TCHAR szSubmenu[MAX_PATH];
1267 HMENU hPopupMenu = NULL;
1272 LPTSTR p = buf.GetBuffer();
1274 while (*p == ' ' || *p == '\t') p++; //
\83u
\83\89\83\93\83N
\83X
\83L
\83b
\83v
1277 //
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1279 //
\8aù
\91¶
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\82ð
\96\84\82ß
\8d\9e\82Þ
1280 MENUITEMINFO inf = {0};
1281 inf.cbSize = sizeof(MENUITEMINFO);
1282 inf.fMask = MIIM_SUBMENU | MIIM_TYPE;
1283 inf.fType = MFT_STRING;
1284 inf.dwTypeData = szSubmenu;
1285 inf.hSubMenu = hPopupMenu;
1286 InsertMenuItem(m_hMenu, lv1, true, &inf);
1292 hPopupMenu = CreatePopupMenu();
1294 while (*p && *p != ',' && *p != '/' && *p != ':') {
1297 ZeroMemory(szSubmenu, MAX_PATH);
1298 int submenuLen = p - st;
1299 if (submenuLen > 0) {
1300 _tcsncpy_s(szSubmenu, MAX_PATH, st, submenuLen);
1302 if (*p == ',' || *p == ':') {
1307 //
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1310 while (*p && *p != ',' && *p != '/' && *p != ':') {
1313 ZeroMemory(menuname, MAX_PATH);
1314 int menunameLen = p - st;
1315 if (menunameLen > 0) {
1316 _tcsncpy_s(menuname, MAX_PATH, st, menunameLen);
1318 //
\83R
\83}
\83\93\83h
\83Z
\83p
\83\8c\81[
\83^
\81[
\82ð
\8c\9f\8d¸
\82·
\82é
1320 LPTSTR findcmd = _tcschr(menuname, _TEXT('@'));
1323 eventname = findcmd + 1;
1327 wsprintf(tmp, _TEXT("OnMenu%d"), lv1 * 100 + cmd);
1330 m_cMenuMap.insert(std::pair<int, CComBSTR>(lv1 * 100 + cmd, eventname));
1331 //
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1332 MENUITEMINFO inf = {0};
1333 inf.cbSize = sizeof(MENUITEMINFO);
1334 inf.fMask = MIIM_TYPE | MIIM_ID;
1335 inf.fType = MFT_STRING;
1336 inf.wID = lv1 * 100 + cmd;
1337 inf.dwTypeData = menuname;
1338 InsertMenuItem(hPopupMenu, lv2, true, &inf);
1341 //
\83Z
\83p
\83\8c\81[
\83^
\81[
\82Ì
\8ew
\92è
\82©?
1345 else if (*p == ':') {
1346 MENUITEMINFO inf = {0};
1347 inf.cbSize = sizeof(MENUITEMINFO);
1348 inf.fMask = MIIM_TYPE;
1349 inf.fType = MFT_SEPARATOR;
1350 InsertMenuItem(hPopupMenu, lv2, true, &inf);
1357 //
\96¢
\91}
\93ü
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\91}
\93ü
1359 //
\8aù
\91¶
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\82ð
\96\84\82ß
\8d\9e\82Þ
1360 MENUITEMINFO inf = {0};
1361 inf.cbSize = sizeof(MENUITEMINFO);
1362 inf.fMask = MIIM_SUBMENU | MIIM_TYPE;
1363 inf.fType = MFT_STRING;
1364 inf.dwTypeData = szSubmenu;
1365 inf.hSubMenu = hPopupMenu;
1366 InsertMenuItem(m_hMenu, lv1, true, &inf);
1368 ::SetMenu(m_hPopupWnd, m_hMenu);
1374 STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd, VARIANT* pRet)
1383 if (varCmd.ChangeType(VT_I2, &cmd) == S_OK) {
1384 nCommand = varCmd.iVal;
1387 CComVariant varText;
1388 if (varText.ChangeType(VT_BSTR, &text) == S_OK) {
1389 TCHAR menuname[MAX_PATH];
1391 ATL::CString buf(varText.bstrVal);
1392 UINT len = buf.GetLength() + 1;
1393 LPTSTR p = buf.GetBuffer();
1397 HMENU hPopupMenu = CreatePopupMenu();
1400 while (*p == ' ' || *p == '\t') {
1403 while (*p && *p != ',' && *p != '/' && *p != ':') {
1406 ZeroMemory(menuname, MAX_PATH);
1407 int menunameLen = p - st;
1408 if (menunameLen > 0) {
1409 _tcsncpy_s(menuname, MAX_PATH, st, menunameLen);
1411 MENUITEMINFO inf = {0};
1412 inf.cbSize = sizeof(MENUITEMINFO);
1413 inf.fMask = MIIM_TYPE | MIIM_ID;
1414 inf.fType = MFT_STRING;
1415 if (nCommand != 0) {
1416 inf.wID = nCommand + cmd;
1419 //
\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
1420 // 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
1421 inf.wID = nCommand + cmd + 1;
1423 inf.dwTypeData = menuname;
1424 InsertMenuItem(hPopupMenu, lv, true, &inf);
1427 if (*p == ',' || *p == '/') {
1430 else if (*p == ':') {
1431 inf.fMask = MIIM_TYPE;
1432 inf.fType = MFT_SEPARATOR;
1433 InsertMenuItem(hPopupMenu, lv, true, &inf);
1440 DWORD pos = GetMessagePos();
1441 ::SetFocus(m_hPopupWnd);
1442 varRet = (SHORT) ::TrackPopupMenuEx(hPopupMenu,
1443 TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON |
1444 (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
1449 DestroyMenu(hPopupMenu);
1451 varRet.Detach(pRet);
1455 STDMETHODIMP COverlappedWindow::get_HWND(long *pVal)
1457 *pVal = (LONG)m_hPopupWnd;
1461 STDMETHODIMP COverlappedWindow::GetSysColor(VARIANT typ, VARIANT *col)
1463 //
\83V
\83X
\83e
\83\80\83J
\83\89\81[
\82Ì
\8eæ
\93¾
1464 CComVariant varType;
1466 varType.ChangeType(VT_I2, &typ);
1467 varRet = (long)::GetSysColor(varType.iVal);
1472 STDMETHODIMP COverlappedWindow::SetTimer(VARIANT tim, BOOL* pVal)
1478 if (varTim.ChangeType(VT_I4, &tim) == S_OK) {
1479 timer = varTim.lVal;
1482 *pVal = ::SetTimer(m_hPopupWnd, 1, timer, NULL) ? VB_TRUE : VB_FALSE;
1485 *pVal = ::KillTimer(m_hPopupWnd, 1) ? VB_TRUE : VB_FALSE;
1491 STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode)
1495 return Error(IDS_ERR_NOCREATEMENU);
1499 CComVariant varCmd, varMode;
1500 if (varCmd.ChangeType(VT_I2, &cmd) == S_OK) {
1503 if (varMode.ChangeType(VT_I2, &mode) == S_OK) {
1504 nMode = varMode.iVal;
1507 //
\83\81\83j
\83\85\81[
\83R
\83}
\83\93\83h
\82Í100
\88È
\8fã
\82Å
\82 \82é
\82Ì
\82Å
\81B
1508 MENUITEMINFO inf = {0};
1509 inf.cbSize = sizeof(MENUITEMINFO);
1510 inf.fMask = MIIM_STATE;
1511 inf.fState = nMode ? MFS_CHECKED : MFS_UNCHECKED;
1512 ::SetMenuItemInfo(m_hMenu, nCmd, false, &inf);
1517 STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode)
1521 return Error(IDS_ERR_NOCREATEMENU);
1525 CComVariant varCmd, varMode;
1526 if (varCmd.ChangeType(VT_I2, &cmd) == S_OK) {
1529 if (varMode.ChangeType(VT_I2, &mode) == S_OK) {
1530 nMode = varMode.iVal;
1533 //
\83\81\83j
\83\85\81[
\83R
\83}
\83\93\83h
\82Í100
\88È
\8fã
\82Å
\82 \82é
\82Ì
\82Å
\81B
1534 MENUITEMINFO inf = {0};
1535 inf.cbSize = sizeof(MENUITEMINFO);
1536 inf.fMask = MIIM_STATE;
1537 inf.fState = nMode ? MFS_ENABLED : MFS_GRAYED;
1538 ::SetMenuItemInfo(m_hMenu, nCmd, false, &inf);
1543 STDMETHODIMP COverlappedWindow::get_CreateNoCloseWindow(BOOL *pVal)
1545 //
\83N
\83\8d\81[
\83Y
\8bÖ
\8e~
\83E
\83B
\83\93\83h
\83E?
1546 *pVal = windowParam.noclose ? VB_TRUE : VB_FALSE;
1550 STDMETHODIMP COverlappedWindow::put_CreateNoCloseWindow(BOOL newVal)
1553 //
\83E
\83B
\83\93\83h
\83E
\8dì
\90¬
\8cã
\82É
\82Í
\8ew
\92è
\82Å
\82«
\82È
\82¢
1554 return Error(IDS_ERR_CREATEDWND);
1556 windowParam.noclose = newVal;
1560 STDMETHODIMP COverlappedWindow::get_Canvas(VARIANT *pVal)
1562 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\93n
\82·
1563 ::VariantInit(pVal);
1564 IUnknown* pUnk = NULL;
1566 m_pCanvas->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
1567 pVal->vt = VT_UNKNOWN;
1568 pVal->punkVal = pUnk;
1573 STDMETHODIMP COverlappedWindow::get_Event(VARIANT *pVal)
1575 ::VariantInit(pVal);
1577 //
\83C
\83x
\83\93\83g
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8eæ
\93¾
1578 IUnknown* pUnk = NULL;
1579 if (m_pEvent->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
1580 pVal->vt = VT_UNKNOWN;
1581 pVal->punkVal = pUnk;
1587 STDMETHODIMP COverlappedWindow::get_DropFiles(VARIANT *pVal)
1589 m_dropfiles.GetPathArray(pVal);
1593 STDMETHODIMP COverlappedWindow::get_Quit(BOOL *pVal)
1595 *pVal = m_bQuit ? VB_TRUE : VB_FALSE;
1599 STDMETHODIMP COverlappedWindow::put_Quit(BOOL newVal)
1603 //
\83C
\83x
\83\93\83g
\82ð
\94
\90¶
\82³
\82¹
\91Ò
\8b@
\8fó
\91Ô
\82ð
\89ð
\82
1604 SetEvent(m_hWaitEvent);
1609 STDMETHODIMP COverlappedWindow::get_Form(VARIANT *pVal)
1611 //
\83t
\83H
\81[
\83\80\82Ì
\8cö
\8aJ
1612 ::VariantInit(pVal);
1614 IUnknown* pUnk = NULL;
1615 if (m_pForm->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
1616 pVal->vt = VT_UNKNOWN;
1617 pVal->punkVal = pUnk;
1623 STDMETHODIMP COverlappedWindow::get_Style(long *pVal)
1626 windowParam.style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
1628 *pVal = (long)windowParam.style;
1632 STDMETHODIMP COverlappedWindow::put_Style(long newVal)
1634 windowParam.style = (DWORD)newVal;
1636 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.style);
1641 STDMETHODIMP COverlappedWindow::get_Exstyle(long *pVal)
1644 windowParam.exstyle = ::GetWindowLong(m_hPopupWnd, GWL_EXSTYLE);
1646 *pVal = (long)windowParam.exstyle;
1650 STDMETHODIMP COverlappedWindow::put_Exstyle(long newVal)
1652 windowParam.exstyle = (DWORD)newVal;
1654 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.exstyle);
1659 STDMETHODIMP COverlappedWindow::get_WindowClassName(BSTR *pVal)
1661 CComBSTR tmp(windowParam.szClassName);
1662 *pVal = tmp.Detach();
1666 STDMETHODIMP COverlappedWindow::Refresh()
1673 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOCOPYBITS);
1678 void COverlappedWindow::SetTitle()
1683 ATL::CString tmp(m_bstrCaption);
1684 ::SetWindowText(m_hPopupWnd, tmp);
1687 STDMETHODIMP COverlappedWindow::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VARIANT h, VARIANT *pvarUnk)
1689 //
\83T
\83C
\83Y
\95Ï
\8dX
1690 CComVariant varX, varY, varW, varH;
1691 UINT flag = SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE;
1692 if ((x.vt != VT_EMPTY && x.vt != VT_NULL && x.vt != VT_ERROR) && varX.ChangeType(VT_I2, &x) == S_OK) {
1693 windowParam.posX = varX.iVal;
1694 flag &= ~SWP_NOMOVE;
1696 if ((y.vt != VT_EMPTY && y.vt != VT_NULL && y.vt != VT_ERROR) && varY.ChangeType(VT_I2, &y) == S_OK) {
1697 windowParam.posY = varY.iVal;
1698 flag &= ~SWP_NOMOVE;
1700 if ((w.vt != VT_EMPTY && w.vt != VT_NULL && w.vt != VT_ERROR) && varW.ChangeType(VT_I2, &w) == S_OK) {
1701 windowParam.width = varW.iVal;
1702 flag &= ~SWP_NOSIZE;
1704 if ((h.vt != VT_EMPTY && h.vt != VT_NULL && h.vt != VT_ERROR) && varH.ChangeType(VT_I2, &h) == S_OK) {
1705 windowParam.height = varH.iVal;
1706 flag &= ~SWP_NOSIZE;
1708 //
\83E
\83B
\83\93\83h
\83E
\82ª
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82ê
\82Î
\82½
\82¾
\82¿
\82É
\94½
\89f
1710 ::SetWindowPos(m_hPopupWnd, NULL, windowParam.posX, windowParam.posY, windowParam.width, windowParam.height, flag);
1713 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1714 m_pForm->SetWindowSize(windowParam.width, windowParam.height,
1715 windowParam.GetStyle(), windowParam.exstyle);
1717 CreateThisInterface(pvarUnk);
1721 void COverlappedWindow::CreateThisInterface(VARIANT* pvarUnk)
1723 //
\82±
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
1724 ::VariantInit(pvarUnk);
1725 IUnknown* pUnk = NULL;
1726 if (QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
1727 pvarUnk->vt = VT_UNKNOWN;
1728 pvarUnk->punkVal = pUnk;
1732 STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT caption_system, VARIANT maxmin, VARIANT *pvarUnk)
1734 CComVariant varFrametype, varCaptionSystem, varMaxMin;
1735 if (frametype.vt != VT_EMPTY && frametype.vt != VT_ERROR && frametype.vt != VT_NULL
1736 && varFrametype.ChangeType(VT_I2, &frametype) == S_OK) {
1737 windowParam.frametype = varFrametype.iVal;
1739 if (caption_system.vt != VT_EMPTY && caption_system.vt != VT_ERROR && caption_system.vt != VT_NULL
1740 && varCaptionSystem.ChangeType(VT_I2, &caption_system) == S_OK) {
1741 windowParam.captionbar = (varCaptionSystem.iVal > 0);
1742 windowParam.systemmenu = (varCaptionSystem.iVal > 1);
1744 if (maxmin.vt != VT_EMPTY && maxmin.vt != VT_ERROR && maxmin.vt != VT_NULL
1745 && varMaxMin.ChangeType(VT_I2, &maxmin) == S_OK) {
1746 windowParam.minbox = (varMaxMin.iVal & 0x01);
1747 windowParam.maxbox = (varMaxMin.iVal & 0x02);
1750 ::SetWindowLong(m_hPopupWnd, GWL_STYLE, windowParam.GetStyle());
1753 CreateThisInterface(pvarUnk);
1757 STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
1760 ::VariantInit(pvarUnk);
1761 //
\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¤
1762 list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1763 while (p != m_lstChild.end()) {
1764 DWORD refCount = (*p)->m_dwRef;
1765 if ((*p)->m_dwRef == 1) {
1766 //
\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
1767 BOOL bVisible = false;
1768 (*p)->get_Visible(&bVisible);
1770 //
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82È
\82¯
\82ê
\82Î
\8fÁ
\82µ
\82Ä
\82æ
\82µ
\81B
1772 p = m_lstChild.erase(p);
1779 CComObject<COverlappedWindow>* pChild = NULL;
1780 if (pChild->CreateInstance(&pChild) == S_OK) {
1782 pChild->SetParent(m_hPopupWnd);
1783 pChild->put_WaitCursor(m_dWaitCursor);
1784 m_lstChild.push_back(pChild);
1785 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
1786 IUnknown* pUnk = NULL;
1787 if (pChild->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
1788 pvarUnk->vt = VT_UNKNOWN;
1789 pvarUnk->punkVal = pUnk;
1795 void COverlappedWindow::SetParent(HWND hParent)
1797 m_hParentWnd = hParent;
1800 HANDLE COverlappedWindow::GetEventHandle()
1802 return m_hWaitEvent;
1805 void COverlappedWindow::SetWaitParam(int *count, HWND *hWnd, HANDLE *hEvent)
1807 //
\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¾
1808 if (*count < MAXIMUM_WAIT_OBJECTS) {
1809 //
\8e©
\95ª
\8e©
\90g
\82ð
\93o
\98^
1810 hEvent[*count] = m_hWaitEvent;
1811 hWnd[*count] = m_hPopupWnd;
1813 //
\83`
\83\83\83C
\83\8b\83h
\82ð
\93o
\98^
1814 list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1815 while ((p != m_lstChild.end()) && (*count < MAXIMUM_WAIT_OBJECTS)) {
1816 //
\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·
1817 (*p)->SetWaitParam(count, hWnd, hEvent);
1823 DWORD COverlappedWindow::MessageLoop(DWORD sleeptim, int cnt, HWND *hWnd, HANDLE* hEvent)
1825 //
\83\81\83b
\83Z
\81[
\83W
\83\8b\81[
\83v
\82ð
\8f\88\97\9d\82·
\82é
1827 DWORD retWait = MsgWaitForMultipleObjects(cnt, hEvent, false, sleeptim, QS_ALLEVENTS | QS_ALLINPUT);
1829 if (retWait != WAIT_TIMEOUT) {
1831 if (retWait >= WAIT_OBJECT_0 && retWait < WAIT_OBJECT_0 + cnt) {
1832 //
\83C
\83x
\83\93\83g
\82Ì
\94
\90¶
\82µ
\82½
\83n
\83\93\83h
\83\8b\82ð
\8e¯
\95Ê
\82·
\82é
1833 ret = retWait - WAIT_OBJECT_0 + 1;
1837 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
1838 BOOL bTranslated = false;
1841 //
\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·
1842 HWND hParent = msg.hwnd;
1843 while (!hOwner && hParent) {
1845 for (i = 0; i < cnt && hWnd[i]; i++) {
1846 if (hParent == hWnd[i]) {
1851 hParent = ::GetParent(hParent);
1855 BOOL bTranslatedDlg = false;
1856 if (msg.message == WM_KEYDOWN) {
1857 //
\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é
1858 ::SendMessage(hOwner, WM_KEYDOWN_EX, msg.wParam, msg.lParam);
1860 //
\83_
\83C
\83A
\83\8d\83O
\82à
\82Ç
\82«
\8f\88\97\9d\82ð
\8ds
\82¤
1861 BOOL bShift = GetKeyState(VK_SHIFT) & 0x8000;
1862 BOOL bCtrl = GetKeyState(VK_CONTROL) & 0x8000;
1863 if (msg.wParam == VK_TAB) {
1866 HWND hNextFocus = ::GetNextDlgTabItem(hOwner, GetFocus(), bShift);
1868 ::SetFocus(hNextFocus);
1871 bTranslatedDlg = true;
1873 else if (msg.wParam == VK_F6) {
1875 SendMessage(hOwner, WM_MOVENEXT_OVERLAPPED, 0, 0);
1876 bTranslatedDlg = true;
1879 if (!bTranslatedDlg) {
1880 bTranslated |= ::IsDialogMessage(hOwner, &msg);
1884 ::TranslateMessage(&msg);
1885 ::DispatchMessage(&msg);
1892 STDMETHODIMP COverlappedWindow::get_AutoMessageLoop(BOOL *pVal)
1894 *pVal = windowParam.automessageloop ? VB_TRUE : VB_FALSE;
1898 STDMETHODIMP COverlappedWindow::put_AutoMessageLoop(BOOL newVal)
1900 windowParam.automessageloop = newVal;
1904 STDMETHODIMP COverlappedWindow::DoModal(VARIANT* pRetCode)
1906 CComVariant dmy, retdmy;
1908 dmy.scode = DISP_E_PARAMNOTFOUND;
1911 CComVariant tim = (short)1000;
1913 while (!m_bQuit && ::IsWindow(m_hPopupWnd)) {
1914 WaitEvent(tim, &ret);
1921 ::VariantInit(pRetCode);
1922 pRetCode->vt = VT_I2;
1923 pRetCode->iVal = m_dModalExitCode;
1927 STDMETHODIMP COverlappedWindow::get_AutoClose(BOOL *pVal)
1929 *pVal = windowParam.autoclose ? VB_TRUE : VB_FALSE;
1933 STDMETHODIMP COverlappedWindow::put_AutoClose(BOOL newVal)
1935 windowParam.autoclose = newVal;
1939 void COverlappedWindow::CreateWindowList(list<HWND>& lstWnd, BOOL bSearchRoot)
1942 if (m_hParentWnd && bSearchRoot) {
1943 //
\8dª
\8c³
\82Å
\82È
\82¯
\82ê
\82Î
\81A
\82³
\82ç
\82É
\96â
\82¢
\8d\87\82í
\82¹
\82é
1944 COverlappedWindow* pParent = (COverlappedWindow*)::GetWindowLongPtr(m_hParentWnd, GWLP_USERDATA);
1946 pParent->CreateWindowList(lstWnd, true);
1950 //
\82±
\82±
\82ª
\8dª
\8c³
\82Å
\82 \82é
1951 list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1952 DWORD stl = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
1953 if (stl & WS_VISIBLE) {
1954 //
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82é
\83E
\83B
\83\93\83h
\83E
\82Ì
\82Ý
\82ð
\93o
\98^
\82·
\82é
1955 lstWnd.push_back(m_hPopupWnd);
1957 while (p != m_lstChild.end()) {
1958 //
\82·
\82×
\82Ä
\82Ì
\8eq
\83I
\81[
\83o
\81[
\83\89\83b
\83v
\82ð
\97ñ
\8b\93\82·
\82é
1960 (*p)->get_HWND((long*)&hWnd);
1961 if (hWnd && ::IsWindow(hWnd)) {
1962 (*p)->CreateWindowList(lstWnd, false);
1969 void COverlappedWindow::MoveNextOverlapped()
1971 //
\8f\87\8f\98\83\8a\83X
\83g
\82Ì
\90¶
\90¬
\82ð
\88Ë
\97\8a\82·
\82é
1973 CreateWindowList(lstWnd, true);
1974 //
\8c»
\8dÝ
\88Ê
\92u
\82ð
\94c
\88¬
\82·
\82é
1975 HWND hActiveWnd = ::GetActiveWindow();
1976 list<HWND>::iterator p = lstWnd.begin();
1977 while (p != lstWnd.end()) {
1979 if (hActiveWnd == *p) {
1980 //
\83A
\83N
\83e
\83B
\83u
\83E
\83B
\83\93\83h
\83E
\82ð
\94
\8c©
\82µ
\82½
1982 HWND hNext = lstWnd.front();
1983 if (p != lstWnd.end()) {
1986 // ::SetActiveWindow(hNext);
1994 STDMETHODIMP COverlappedWindow::get_Object(VARIANT idx, VARIANT *pVal)
1996 //
\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ñ
1997 ::VariantInit(pVal);
1998 pVal->vt = VT_UNKNOWN;
1999 m_pObject->QueryInterface(IID_IUnknown, (void**)&(pVal->punkVal));
2004 STDMETHODIMP COverlappedWindow::get_ExitCode(short *pVal)
2006 *pVal = (short)m_dModalExitCode;
2010 STDMETHODIMP COverlappedWindow::put_ExitCode(short newVal)
2012 m_dModalExitCode = newVal;
2016 STDMETHODIMP COverlappedWindow::get_WaitCursor(short *pVal)
2018 *pVal = (short)m_dWaitCursor;
2022 STDMETHODIMP COverlappedWindow::put_WaitCursor(short newVal)
2024 m_dWaitCursor = newVal;
2026 ::SendMessage(m_hPopupWnd, WM_SETCURSOR, (WPARAM)m_hPopupWnd, 0);
2028 //
\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é
2029 list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
2030 while (pWnd != m_lstChild.end()) {
2031 (*pWnd)->put_WaitCursor(newVal);
2037 STDMETHODIMP COverlappedWindow::LoadIcon(VARIANT text)
2039 CComVariant varText;
2040 if (varText.ChangeType(VT_BSTR, &text) != S_OK) {
2041 return DISP_E_TYPEMISMATCH;
2043 ATL::CString szPath(varText.bstrVal);
2046 DestroyIcon(m_hIcon);
2049 m_hIcon = (HICON)LoadImage(NULL, szPath, IMAGE_ICON,
2050 GetSystemMetrics(SM_CXSMICON),
2051 GetSystemMetrics(SM_CYSMICON),
2054 if (m_hIcon && m_hPopupWnd) {
2055 ::SendMessage(m_hPopupWnd, WM_SETICON, false, (LPARAM)m_hIcon);
2060 STDMETHODIMP COverlappedWindow::CenterWindow()
2065 //
\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é
2066 ::GetWindowRect(m_hParentWnd, &rct);
2069 HWND hwnd = ::GetDesktopWindow();
2073 ::GetWindowRect(hwnd, &rct);
2075 int x = rct.left + (rct.right - rct.left) / 2 - windowParam.width / 2;
2076 int y = rct.top + (rct.bottom - rct.top) / 2 - windowParam.height / 2;
2077 WINDOWPLACEMENT pls = {0};
2078 pls.length = sizeof(WINDOWPLACEMENT);
2079 pls.rcNormalPosition.top = y;
2080 pls.rcNormalPosition.left = x;
2081 pls.rcNormalPosition.bottom = y + windowParam.height;
2082 pls.rcNormalPosition.right = x + windowParam.width;
2083 ::SetWindowPlacement(m_hPopupWnd, &pls);
2087 STDMETHODIMP COverlappedWindow::get_ClassObject(VARIANT* pVal)
2089 ::VariantInit(pVal);
2091 m_pClassDisp->AddRef();
2092 pVal->pdispVal = m_pClassDisp;
2093 pVal->vt = VT_UNKNOWN;
2098 STDMETHODIMP COverlappedWindow::put_ClassObject(VARIANT newVal)
2101 m_pClassDisp->Release();
2103 if (newVal.vt == VT_DISPATCH) {
2104 m_pClassDisp = newVal.pdispVal;
2105 m_pClassDisp->AddRef();
2107 else if (!(newVal.vt == VT_EMPTY || newVal.vt == VT_ERROR || newVal.vt == VT_NULL)) {
2108 return DISP_E_TYPEMISMATCH;
2113 HRESULT COverlappedWindow::ClassObjectInvoke(LPCWSTR handler)
2115 if (!m_pClassDisp) {
2120 if (FAILED(hr = m_pClassDisp->GetIDsOfNames(IID_NULL, (LPWSTR*)&handler, 1, LOCALE_SYSTEM_DEFAULT, &dispid))) {
2123 DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
2124 return m_pClassDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, NULL, NULL, NULL);
2127 STDMETHODIMP COverlappedWindow::get_ClientWidth(long *pVal)
2131 ::GetClientRect(m_hPopupWnd, &rct);
2136 STDMETHODIMP COverlappedWindow::get_ClientHeight(long *pVal)
2140 ::GetClientRect(m_hPopupWnd, &rct);
2145 STDMETHODIMP COverlappedWindow::get_innerWidth(double *pVal)
2149 ::GetClientRect(m_hPopupWnd, &rct);
2150 POINT pt = {rct.right, 0 - rct.bottom};
2151 HDC hdc = ::GetWindowDC(m_hPopupWnd);
2152 int md = ::GetMapMode(hdc);
2153 ::SetMapMode(hdc, MM_LOMETRIC);
2154 ::DPtoLP(hdc, &pt, 1);
2155 ::SetMapMode(hdc, md);
2156 ::ReleaseDC(m_hPopupWnd, hdc);
2161 STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal)
2165 ::GetClientRect(m_hPopupWnd, &rct);
2166 POINT pt = {rct.right, 0 - rct.bottom};
2167 HDC hdc = ::GetWindowDC(m_hPopupWnd);
2168 int md = ::GetMapMode(hdc);
2169 ::SetMapMode(hdc, MM_LOMETRIC);
2170 ::DPtoLP(hdc, &pt, 1);
2171 ::SetMapMode(hdc, md);
2172 ::ReleaseDC(m_hPopupWnd, hdc);
2177 STDMETHODIMP COverlappedWindow::get_AutoReleaseClassObject(BOOL *pVal)
2179 *pVal = m_bAutoReleaseClassObject ? VB_TRUE : VB_FALSE;
2183 STDMETHODIMP COverlappedWindow::put_AutoReleaseClassObject(BOOL newVal)
2185 m_bAutoReleaseClassObject = newVal;
2189 STDMETHODIMP COverlappedWindow::get_DefaultAction(BOOL *pVal)
2191 *pVal = m_bDefaultAction ? VB_TRUE : VB_FALSE;
2195 STDMETHODIMP COverlappedWindow::put_DefaultAction(BOOL newVal)
2197 m_bDefaultAction = newVal;
2201 STDMETHODIMP COverlappedWindow::SetClipboardText(BSTR text)
2204 if (::OpenClipboard(m_hPopupWnd)) {
2207 int len = SysStringByteLen(text);
2208 HGLOBAL hGlobal = GlobalAlloc(GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
2209 LPWSTR p = (LPWSTR)GlobalLock(hGlobal);
2210 StringCchCopyW(p, len + 1, text);
2211 GlobalUnlock(hGlobal);
2212 ::SetClipboardData(CF_UNICODETEXT, hGlobal);
2219 STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText)
2222 ::VariantInit(pVarText);
2223 if (::OpenClipboard(m_hPopupWnd)) {
2224 if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
2225 // UNICODE
\95¶
\8e\9a\97ñ
\82ª
\82 \82ê
\82Î
\81A
\82»
\82¿
\82ç
\82ð
\97D
\90æ
\82µ
\82Ä
\8eæ
\93¾
\82·
\82é
2226 HGLOBAL hGlobal = ::GetClipboardData(CF_UNICODETEXT);
2228 LPWSTR p = (LPWSTR)GlobalLock(hGlobal);
2231 GlobalUnlock(hGlobal);
2232 pVarText->bstrVal = wstr.Detach();
2233 pVarText->vt = VT_BSTR;
2237 else if (IsClipboardFormatAvailable(CF_TEXT)) {
2238 // UNICODE
\95¶
\8e\9a\97ñ
\82ª
\82È
\82¢
\8fê
\8d\87
2239 HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT);
2241 LPCSTR p = (LPSTR)GlobalLock(hGlobal);
2244 GlobalUnlock(hGlobal);
2245 pVarText->bstrVal = wstr.Detach();
2246 pVarText->vt = VT_BSTR;