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 windowParam.SetWindowPlacement(CW_USEDEFAULT,CW_USEDEFAULT,300,300);
37 windowParam.noclose = false;
38 windowParam.doublebuffer = true;
39 windowParam.automessageloop = true;
40 //
\83o
\83b
\83N
\83O
\83\89\83E
\83\93\83h
\83u
\83\89\83V
41 m_dwBackColor = ::GetSysColor(COLOR_WINDOW);
42 m_hBkBrush = CreateSolidBrush(COLORREF(m_dwBackColor));
43 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\8dì
\90¬
48 //
\83\86\81[
\83U
\81[
\83\82\81[
\83h
\82Ì
\8f\89\8aú
\89»
49 m_bQuit = false; //
\95Â
\82¶
\82ç
\82ê
\82Ä
\82¢
\82È
\82¢
\82±
\82Æ
\82ð
\8e¦
\82·
50 m_dModalExitCode = 0; //
\83\82\81[
\83_
\83\8b\95Ô
\93\9a\83R
\81[
\83h
52 m_bDefaultAction = true; //
\83f
\83B
\83t
\83H
\83\8b\83g
\82ÌOK/CANCEL
\83A
\83N
\83V
\83\87\83\93\82Å
\95Â
\82¶
\82é
54 //
\83t
\83H
\81[
\83\80\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8dì
\90¬
56 m_hLastFocusControl = NULL;
57 if(m_pForm->CreateInstance(&m_pForm) == S_OK){
59 m_pForm->SetWindowSize(windowParam.width,windowParam.height,true);
61 //
\95`
\89æ
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\90¶
\90¬
63 if(m_pCanvas->CreateInstance(&m_pCanvas) == S_OK){
66 //
\83\86\81[
\83U
\81[
\92è
\8b`
\98A
\91z
\94z
\97ñ
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\90¶
\90¬
68 if(m_pObject->CreateInstance(&m_pObject) == S_OK){
71 //
\83E
\83F
\83C
\83g
\83J
\81[
\83\
\83\8b\82Ì
\8f\89\8aú
\89»
75 HRESULT COverlappedWindow::FinalConstruct()
77 return CoCreateFreeThreadedMarshaler(
78 GetControllingUnknown(), &m_pUnkMarshaler.p);
81 void COverlappedWindow::FinalRelease()
83 //
\83E
\83B
\83\93\83h
\83E
\82ª
\94j
\8aü
\82³
\82ê
\82é
\82±
\82Æ
\82ð
\92Ê
\92m
\82·
\82é
\83C
\83x
\83\93\83g
85 ClassObjectInvoke(L"ExitWindow");
87 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\95ú
\8aü
89 m_pClassDisp->Release();
93 //
\83A
\83C
\83R
\83\93\82Ì
\94j
\8aü
95 ::DestroyIcon(m_hIcon);
97 //
\83`
\83\83\83C
\83\8b\83h
\83|
\83b
\83v
\83A
\83b
\83v
\82Ì
\94j
\8aü
98 list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
99 while(pWnd != m_lstChild.end()){
102 pWnd = m_lstChild.erase(pWnd);
104 //
\83C
\83x
\83\93\83g
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
110 //
\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ü
112 m_pCanvas->DetachOwner();
113 m_pCanvas->Release();
116 //
\83t
\83H
\81[
\83\80\82Ì
\94j
\8aü
118 m_pForm->DetachOwner();
122 //
\83\86\81[
\83U
\81[
\92è
\8b`
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
124 m_pObject->Release();
128 //
\94w
\8ci
\83u
\83\89\83V
\82Ì
\89ð
\95ú
130 DeleteObject(m_hBkBrush);
133 EnterCriticalSection(&m_objEventDataProtection);
134 //
\83C
\83x
\83\93\83g
\83f
\81[
\83^
\82Ì
\89ð
\95ú
135 list<CComObject<CEvent>*>::iterator pEv = m_lstEvent.begin();
136 while(pEv != m_lstEvent.end()){
138 pEv = m_lstEvent.erase(pEv);
140 LeaveCriticalSection(&m_objEventDataProtection);
142 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82Ì
\89ð
\95ú
144 CloseHandle(m_hWaitEvent);
147 //
\83\81\83j
\83\85\81[
\82Ì
\94j
\8aü
149 DestroyMenu(m_hMenu);
152 //
\83\81\83C
\83\93\83E
\83B
\83\93\83h
\83E
\82Ì
\94j
\8aü
154 ::DestroyWindow(m_hPopupWnd);
157 //
\83N
\83\8a\83e
\83B
\83J
\83\8b\83Z
\83b
\83V
\83\87\83\93\82Ì
\94j
\8aü
158 DeleteCriticalSection(&m_objEventDataProtection);
160 m_pUnkMarshaler.Release();
161 ATLTRACE("COverlappedWindow::FinalRelease\r\n");
164 STDMETHODIMP COverlappedWindow::get_Caption(BSTR* pVal)
166 *pVal = SysAllocString(m_bstrCaption);
170 STDMETHODIMP COverlappedWindow::put_Caption(BSTR newVal)
172 SysReAllocString(&m_bstrCaption,newVal);
177 STDMETHODIMP COverlappedWindow::get_backColor(long *pVal)
179 *pVal = m_dwBackColor;
183 STDMETHODIMP COverlappedWindow::put_backColor(long newVal)
185 m_dwBackColor = newVal;
187 DeleteObject(m_hBkBrush);
189 m_hBkBrush = CreateSolidBrush(COLORREF(newVal));
191 ::InvalidateRect(m_hPopupWnd,NULL,true);
192 ::UpdateWindow(m_hPopupWnd);
197 HWND COverlappedWindow::SafeCreateWnd()
199 //
\90¶
\90¬
\8dÏ
\82Ý
\82Å
\82 \82ê
\82Î
\89½
\82à
\82µ
\82È
\82¢
\81B
203 //
\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Ý
204 //
\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¤
206 if(windowParam.noclose){
207 //
\95Â
\82¶
\82é
\83{
\83^
\83\93\82È
\82µ
\83^
\83C
\83v
208 windowParam.SetWindowClassName("SeraphyScriptToolsOverlappedWindowNC");
209 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_NOCLOSE;
212 windowParam.SetWindowClassName("SeraphyScriptToolsOverlappedWindow");
213 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
216 WNDCLASSEX wcex = {0};
217 wcex.cbSize = sizeof(WNDCLASSEX);
218 wcex.lpfnWndProc = (WNDPROC)WindowProc;
221 wcex.hInstance = _Module.m_hInst;
222 wcex.hIcon = NULL;//(HICON)LoadImage(NULL,"SETUPICON.ICO",IMAGE_ICON,16,16,LR_LOADFROMFILE);//LoadIcon(hInstance, (LPCTSTR)IDI_INSTPAC);
223 wcex.hIconSm = m_hIcon;//LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
224 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
225 wcex.hbrBackground = NULL;
226 wcex.lpszMenuName = NULL;
227 wcex.lpszClassName = windowParam.szClassName;
228 wcex.style = windowParam.wndstyle;
229 ATOM atm = RegisterClassEx( &wcex );
231 HWND hWnd = CreateWindowEx(
233 windowParam.szClassName,
235 windowParam.GetStyle(),
241 NULL, _Module.m_hInst, this);
242 ::SetWindowLong(hWnd,GWL_USERDATA,(LONG)this); //
\83N
\83\89\83X
\82Æ
\8aÖ
\98A
\95t
\82¯
\82é
244 //
\83E
\83B
\83\93\83h
\83E
\83X
\83^
\83C
\83\8b\82Ì
\8dÄ
\90Ý
\92è
245 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.GetStyle());
248 //
\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é
249 HMENU hMenu = ::GetSystemMenu(m_hPopupWnd,false);
250 int cnt = ::GetMenuItemCount(hMenu);
251 MENUITEMINFO minfo = {0};
252 minfo.cbSize = sizeof(MENUITEMINFO);
253 minfo.fMask = MIIM_TYPE|MIIM_ID;
254 minfo.fType = MFT_STRING;
255 minfo.wID = WM_MOVENEXT_OVERLAPPED;
256 minfo.dwTypeData = "
\8e\9f\82Ì
\83E
\83B
\83\93\83h
\83E
\82É
\88Ú
\93®\tF6";
257 ::InsertMenuItem(hMenu,cnt,true,&minfo);
259 //
\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é
261 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\82Ì
\8e\96\91O
\8dì
\90¬
\95ª
\82à
\8e©
\93®
\90¶
\90¬
\82³
\82ê
\82é
262 m_pForm->AttachOwner(m_hPopupWnd);
265 //
\83E
\83B
\83\93\83h
\83E
\82ª
\90¶
\90¬
\82³
\82ê
\82½
\83C
\83x
\83\93\83g
\82ð
\94
\8ds
\82·
\82é
267 ClassObjectInvoke(L"InitWindow");
272 LRESULT CALLBACK COverlappedWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
274 COverlappedWindow* me = (COverlappedWindow*)::GetWindowLong(hWnd,GWL_USERDATA);
276 //
\8bÙ
\8b}
\92â
\8e~
\82Ì
\94»
\92è
277 if(GetAsyncKeyState(VK_PAUSE) & 0x8000){
278 ::EnableWindow(hWnd,true);
280 me->m_dModalExitCode = 3;
285 case WM_MOVENEXT_OVERLAPPED:
287 me->MoveNextOverlapped();
292 //
\83f
\83B
\83t
\83H
\83\8b\83g
\82Ì
\93®
\8dì
\82ð
\8ds
\82¤
299 ::GetClientRect( hWnd, &rt );
300 HDC hdc = ::BeginPaint (hWnd, &ps);
303 BOOL bDblBuf = me->windowParam.doublebuffer;
305 //
\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
306 hdc2 = ::CreateCompatibleDC(NULL);
307 bmp = ::CreateCompatibleBitmap(hdc,rt.right,rt.bottom);
308 ::SelectObject(hdc2,bmp);
310 //
\94w
\8ci
\82ð
\93h
\82è
\82Â
\82Ô
\82·
311 ::SetBkColor(hdc2,COLORREF(me->m_dwBackColor));
312 ::SetBkMode(hdc2,TRANSPARENT);
313 ::SetPolyFillMode(hdc2,ALTERNATE);
314 FillRect(hdc2,&rt,me->m_hBkBrush);
316 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83f
\81[
\83^
\81[
\82Ì
\95`
\89æ
318 me->m_pCanvas->Draw(hdc2,rt);
322 //
\83_
\83u
\83\8b\83o
\83b
\83t
\83@
\82Ì
\93]
\91\97
323 ::BitBlt(hdc,0,0,rt.right,rt.bottom,hdc2,0,0,SRCCOPY);
327 ::EndPaint( hWnd, &ps );
332 if(wParam == SC_CLOSE){
333 if(me->windowParam.autoclose){
337 me->m_dModalExitCode = IDABORT;
338 me->AddEventSingle(WM_COMMAND,IDABORT,0);
341 else if(wParam == WM_MOVENEXT_OVERLAPPED){
342 SendMessage(hWnd,WM_MOVENEXT_OVERLAPPED,0,0);
349 me->AddEventSingle(WM_MOUSEMOVE,0,0);
352 case WM_LBUTTONDBLCLK:
354 me->AddEvent(WM_LBUTTONDBLCLK,0,0);
357 case WM_RBUTTONDBLCLK:
359 me->AddEvent(WM_RBUTTONDBLCLK,0,0);
364 if(me->m_dCaptureMode == 0){
365 me->AddEvent(WM_LBUTTONDOWN,0,0);
367 me->m_dCaptureMode |= 0x01;
376 if(me->m_dCaptureMode & 0x01){
377 me->AddEvent(WM_LBUTTONUP,0,0);
378 me->m_dCaptureMode &= ~0x01;
385 if(me->m_dCaptureMode == 0){
386 me->AddEvent(WM_RBUTTONDOWN,0,0);
388 me->m_dCaptureMode |= 0x02;
397 if(me->m_dCaptureMode & 0x02){
398 me->AddEvent(WM_RBUTTONUP,0,0);
399 me->m_dCaptureMode &= ~0x02;
404 case WM_CAPTURECHANGED:
406 if(me->m_dCaptureMode & 0x01){
407 me->AddEvent(WM_CAPTURECHANGED,1,0);
409 if(me->m_dCaptureMode & 0x02){
410 me->AddEvent(WM_CAPTURECHANGED,2,0);
412 me->m_dCaptureMode = 0;
417 me->AddEventSingle(WM_SIZE,0,0);
423 me->AddEventSingle(WM_TIMER,0,0);
429 HDROP hDrop = (HDROP)wParam;
430 me->m_dropfiles.DropFiles(hDrop);
431 me->AddEvent(WM_DROPFILES,0,0);
437 if(GetKeyState(VK_SHIFT ) & 0x8000) st |= 0x01;
438 if(GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02;
439 if(GetKeyState(VK_MENU ) & 0x8000) st |= 0x04;
440 me->AddEventSingle(WM_KEYDOWN,wParam,st);
446 if(GetKeyState(VK_SHIFT ) & 0x8000) st |= 0x01;
447 if(GetKeyState(VK_CONTROL) & 0x8000) st |= 0x02;
448 if(GetKeyState(VK_MENU ) & 0x8000) st |= 0x04;
449 me->AddEventSingle(WM_KEYDOWN_EX,wParam,st);
456 wsprintf(mes,"command=%d:%d\n",HIWORD(wParam),LOWORD(wParam));
457 OutputDebugString(mes);
459 HWND hControl = (HWND)lParam;
460 int nID = LOWORD(wParam);
461 int notify = HIWORD(wParam);
464 // IDABORT
\82Æ
\93¯
\88ê
\82È
\82çquit
\82ð
\97§
\82Ä
\82é
467 me->AddEventSingle(WM_COMMAND,nID,0);
470 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\92Ê
\92m
477 // 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é
478 me->m_hLastFocusControl = hControl;
481 // LISTBOX
\82ª
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82³
\82ê
\82½
482 me->AddEvent(WM_COMMAND,nID,0);
491 NMHDR* notify = (NMHDR*)lParam;
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 DWORD addr = ::GetWindowLong(pnmv->hdr.hwndFrom,GWL_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 DWORD addr = ::GetWindowLong(lpnmh->hwndFrom,GWL_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())
666 Fire_OnKeydownEx(pUnk);
667 ClassObjectInvoke(L"OnKeydown");
673 Fire_OnKeydown2Ex(pUnk);
674 ClassObjectInvoke(L"OnKeydown2");
680 Fire_OnMouseMoveEx(pUnk);
681 ClassObjectInvoke(L"OnMouseMove");
684 case WM_LBUTTONDBLCLK:
687 Fire_OnDblClickEx(pUnk);
688 ClassObjectInvoke(L"OnDblClick");
694 Fire_OnClickEx(pUnk);
695 ClassObjectInvoke(L"OnClick");
698 case WM_RBUTTONDBLCLK:
701 Fire_OnRDblClickEx(pUnk);
702 ClassObjectInvoke(L"OnRDblClick");
708 Fire_OnRClickEx(pUnk);
709 ClassObjectInvoke(L"OnRClick");
715 Fire_OnClickOutEx(pUnk);
716 ClassObjectInvoke(L"OnClickOut");
722 Fire_OnRClickOutEx(pUnk);
723 ClassObjectInvoke(L"OnRClickOut");
726 case WM_CAPTURECHANGED:
728 if(pEv->GetParam() == 1){
729 Fire_OnClickCancel();
730 Fire_OnClickCancelEx(pUnk);
731 ClassObjectInvoke(L"OnClickCancel");
734 Fire_OnRClickCancel();
735 Fire_OnRClickCancelEx(pUnk);
736 ClassObjectInvoke(L"OnRClickCancel");
744 ClassObjectInvoke(L"OnSize");
749 int nID = pEv->GetParam();
753 if(m_bDefaultAction){
756 m_dModalExitCode = IDOK;
759 ClassObjectInvoke(L"OnOK");
762 if(m_bDefaultAction){
765 m_dModalExitCode = IDCANCEL;
767 Fire_OnCancelEx(pUnk);
768 ClassObjectInvoke(L"OnCancel");
772 m_dModalExitCode = IDABORT;
775 ClassObjectInvoke(L"OnExit");
779 Fire_OnCommandEx(pUnk);
780 ClassObjectInvoke(L"OnCommand");
782 //
\8aÖ
\98A
\82Ã
\82¯
\82ç
\82ê
\82½
\83R
\83\93\83g
\83\8d\81[
\83\8b\82ª
\82 \82é
\82Ì
\82©
\81H
784 BSTR eventname = NULL;
785 if(m_pForm->FindControlEventName(nID,&eventname)){
786 if(SysStringLen(eventname) > 0){
787 ClassObjectInvoke(eventname);
789 SysFreeString(eventname);
792 //
\83\81\83j
\83\85\81[
\82Ì
\8c\9f\8dõ
793 if(m_hMenu && nID >= 100){
794 map<int,_bstr_t>::iterator p;
795 p = m_cMenuMap.find(nID);
796 if(p != m_cMenuMap.end()){
797 //
\94
\8c©
\82³
\82ê
\82½
798 ClassObjectInvoke(p->second);
806 Fire_OnDropFilesEx(pUnk);
807 ClassObjectInvoke(L"OnDropFiles");
812 switch(pEv->GetLParam())
815 Fire_OnContextDelete();
816 Fire_OnContextDeleteEx(pUnk);
817 ClassObjectInvoke(L"OnContextDelete");
820 Fire_OnContextMenu();
821 Fire_OnContextMenuEx(pUnk);
822 ClassObjectInvoke(L"OnContextMenu");
828 //
\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é
833 //
\8f\88\97\9d\82³
\82ê
\82½
\83C
\83x
\83\93\83g
\82Í
\89ð
\95ú
\82·
\82é
837 //
\83C
\83x
\83\93\83g
\82ª
\82È
\82¢
\8fê
\8d\87\82Í
\83C
\83x
\83\93\83g
\82Ì
\83N
\83\8a\83A
839 //
\8cÃ
\82¢
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\94j
\8aü
844 //
\83C
\83x
\83\93\83g
\83R
\81[
\83h
\82ð
\96ß
\82·
\81B
845 ret.Detach(varResult);
849 void COverlappedWindow::AddEventSingle(int message, WPARAM wParam, LPARAM lParam)
851 //
\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
853 EnterCriticalSection(&m_objEventDataProtection);
854 list<CComObject<CEvent>*>::iterator p = m_lstEvent.begin();
855 while(p != m_lstEvent.end()){
856 if((*p)->GetMessage() == message && (*p)->GetParam() == wParam){
862 LeaveCriticalSection(&m_objEventDataProtection);
864 //
\93¯
\88ê
\83C
\83x
\83\93\83g
\82ª
\82È
\82¯
\82ê
\82Î
\83C
\83x
\83\93\83g
\82Ì
\94
\8ds
\82ð
\8ds
\82¤
865 AddEvent(message,wParam,lParam);
869 void COverlappedWindow::AddEvent(int message,WPARAM wParam,LPARAM lParam)
871 //
\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é
873 DWORD pos = GetMessagePos();
878 ::ScreenToClient(m_hPopupWnd,&pt);
879 //
\8dÀ
\95W
\8cn
\82Ì
\95Ï
\8a·
881 HDC hdc = ::GetDC(m_hPopupWnd);
884 ::GetClientRect(m_hPopupWnd,&rct);
885 ::SetViewportOrgEx(hdc,0,rct.bottom,&org);
886 int md = ::GetMapMode(hdc);
887 ::SetMapMode(hdc,MM_LOMETRIC);
889 ::SetMapMode(hdc,md);
890 ::SetViewportOrgEx(hdc,org.x,org.y,NULL);
891 ::ReleaseDC(m_hPopupWnd,hdc);
894 //
\83C
\83x
\83\93\83g
\82Ì
\90Ï
\82Ý
\8fã
\82°
895 EnterCriticalSection(&m_objEventDataProtection);
896 CComObject<CEvent>* pEvent;
897 if(pEvent->CreateInstance(&pEvent) == S_OK){
899 pEvent->SetData(message,wParam,lParam,pt,lp);
900 m_lstEvent.push_back(pEvent);
902 LeaveCriticalSection(&m_objEventDataProtection);
904 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\8b\82ð
\83V
\83O
\83i
\83\8b\82É
\82·
\82é
905 SetEvent(m_hWaitEvent);
907 if(windowParam.automessageloop){
908 //
\82½
\82¾
\82¿
\82É
\83C
\83x
\83\93\83g
\8f\88\97\9d\82ð
\8ds
\82¤
915 STDMETHODIMP COverlappedWindow::Draw()
919 ::InvalidateRect(m_hPopupWnd,NULL,true);
920 ::UpdateWindow(m_hPopupWnd);
926 STDMETHODIMP COverlappedWindow::get_IsEventEmpty(BOOL *pVal)
928 //
\83C
\83x
\83\93\83g
\82ª
\8bó
\82È
\82çtrue
929 *pVal = m_lstEvent.empty()?VB_TRUE:VB_FALSE;
933 STDMETHODIMP COverlappedWindow::Open(VARIANT caption,VARIANT* pvarUnk)
937 if((caption.vt != VT_ERROR && caption.vt != VT_NULL) && tmp.ChangeType(VT_BSTR,&caption) == S_OK){
938 put_Caption(tmp.bstrVal);
943 m_dModalExitCode = 0; //
\83\82\81[
\83_
\83\8b\95Ô
\93\9a\83R
\81[
\83h
944 CreateThisInterface(pvarUnk);
948 STDMETHODIMP COverlappedWindow::Close()
950 //
\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é
951 list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
952 while(pWnd != m_lstChild.end()){
956 //
\82±
\82Ì
\83E
\83B
\83\93\83h
\83E
\82ð
\94ñ
\95\
\8e¦
\82É
\82·
\82é
960 //
\83N
\83\89\83X
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\95ú
\8aü
961 if( m_pClassDisp && m_bAutoReleaseClassObject){
962 m_pClassDisp->Release();
966 //
\83t
\83H
\81[
\83J
\83X
\82ð
\88Ú
\93®
\82·
\82é
968 ::SetActiveWindow(m_hParentWnd);
969 ::SetFocus(m_hParentWnd);
972 MoveNextOverlapped();
977 STDMETHODIMP COverlappedWindow::get_DoubleBuffer(BOOL *pVal)
979 *pVal = windowParam.doublebuffer?VB_TRUE:VB_FALSE;
983 STDMETHODIMP COverlappedWindow::put_DoubleBuffer(BOOL newVal)
985 windowParam.doublebuffer = newVal;
990 STDMETHODIMP COverlappedWindow::get_TopMost(BOOL *pVal)
993 DWORD exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
994 *pVal = (exstyle & WS_EX_TOPMOST)?VB_TRUE:VB_FALSE;
998 STDMETHODIMP COverlappedWindow::put_TopMost(BOOL newVal)
1001 ::SetWindowPos(m_hPopupWnd,newVal?HWND_TOPMOST:HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
1005 STDMETHODIMP COverlappedWindow::get_PosX(short *pVal)
1008 WINDOWPLACEMENT pls = {0};
1009 pls.length = sizeof(WINDOWPLACEMENT);
1010 ::GetWindowPlacement(m_hPopupWnd,&pls);
1011 windowParam.posX = (int)pls.rcNormalPosition.left;
1013 *pVal = windowParam.posX;
1017 STDMETHODIMP COverlappedWindow::put_PosX(short newVal)
1019 windowParam.posX = newVal;
1021 WINDOWPLACEMENT pls = {0};
1022 pls.length = sizeof(WINDOWPLACEMENT);
1023 ::GetWindowPlacement(m_hPopupWnd,&pls);
1024 ::SetWindowPos(m_hPopupWnd,NULL,
1026 pls.rcNormalPosition.top,
1027 0,0,SWP_NOZORDER|SWP_NOSIZE);
1032 STDMETHODIMP COverlappedWindow::get_PosY(short *pVal)
1035 WINDOWPLACEMENT pls = {0};
1036 pls.length = sizeof(WINDOWPLACEMENT);
1037 ::GetWindowPlacement(m_hPopupWnd,&pls);
1038 windowParam.posY = (int)pls.rcNormalPosition.top;
1040 *pVal = windowParam.posY;
1044 STDMETHODIMP COverlappedWindow::put_PosY(short newVal)
1046 windowParam.posY = newVal;
1048 WINDOWPLACEMENT pls = {0};
1049 pls.length = sizeof(WINDOWPLACEMENT);
1050 ::GetWindowPlacement(m_hPopupWnd,&pls);
1051 ::SetWindowPos(m_hPopupWnd,NULL,
1052 pls.rcNormalPosition.left,
1054 0,0,SWP_NOZORDER|SWP_NOSIZE);
1059 STDMETHODIMP COverlappedWindow::get_Width(short *pVal)
1062 WINDOWPLACEMENT pls = {0};
1063 pls.length = sizeof(WINDOWPLACEMENT);
1064 ::GetWindowPlacement(m_hPopupWnd,&pls);
1065 windowParam.width = (int)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1067 *pVal = windowParam.width;
1071 STDMETHODIMP COverlappedWindow::put_Width(short newVal)
1073 windowParam.width = newVal;
1075 WINDOWPLACEMENT pls = {0};
1076 pls.length = sizeof(WINDOWPLACEMENT);
1077 ::GetWindowPlacement(m_hPopupWnd,&pls);
1078 ::SetWindowPos(m_hPopupWnd,NULL,
1081 pls.rcNormalPosition.bottom - pls.rcNormalPosition.top,SWP_NOZORDER|SWP_NOMOVE);
1084 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1085 m_pForm->SetWindowSize(windowParam.width,windowParam.height,windowParam.GetStyle() & WS_THICKFRAME);
1090 STDMETHODIMP COverlappedWindow::get_Height(short *pVal)
1093 WINDOWPLACEMENT pls = {0};
1094 pls.length = sizeof(WINDOWPLACEMENT);
1095 ::GetWindowPlacement(m_hPopupWnd,&pls);
1096 windowParam.height = (short)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1098 *pVal = windowParam.height;
1102 STDMETHODIMP COverlappedWindow::put_Height(short newVal)
1104 windowParam.height = newVal;
1106 WINDOWPLACEMENT pls = {0};
1107 pls.length = sizeof(WINDOWPLACEMENT);
1108 ::GetWindowPlacement(m_hPopupWnd,&pls);
1109 ::SetWindowPos(m_hPopupWnd,NULL,0,0,
1110 pls.rcNormalPosition.right - pls.rcNormalPosition.left,
1112 SWP_NOZORDER|SWP_NOMOVE);
1115 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1116 m_pForm->SetWindowSize(windowParam.width,windowParam.height,windowParam.GetStyle() & WS_THICKFRAME);
1121 STDMETHODIMP COverlappedWindow::get_AcceptFiles(BOOL *pVal)
1124 DWORD exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
1125 *pVal = (exstyle & WS_EX_ACCEPTFILES)?VB_TRUE:VB_FALSE;
1129 STDMETHODIMP COverlappedWindow::put_AcceptFiles(BOOL newVal)
1132 DWORD exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
1133 exstyle &= ~WS_EX_ACCEPTFILES;
1134 exstyle |= newVal?WS_EX_ACCEPTFILES:0;
1135 ::SetWindowLong(m_hPopupWnd,GWL_EXSTYLE,exstyle);
1139 STDMETHODIMP COverlappedWindow::SetForegroundWindow()
1142 ::SetForegroundWindow(m_hPopupWnd);
1146 STDMETHODIMP COverlappedWindow::SetFocus()
1149 ::SetFocus(m_hPopupWnd);
1153 STDMETHODIMP COverlappedWindow::get_Enable(BOOL *pVal)
1156 *pVal = ::IsWindowEnabled(m_hPopupWnd)?VB_TRUE:VB_FALSE;
1160 STDMETHODIMP COverlappedWindow::put_Enable(BOOL newVal)
1163 ::EnableWindow(m_hPopupWnd,newVal);
1165 m_pForm->EnableAllControl(newVal);
1166 ::SetActiveWindow(m_hPopupWnd);
1172 STDMETHODIMP COverlappedWindow::get_Iconic(BOOL *pVal)
1175 *pVal = ::IsIconic(m_hPopupWnd)?VB_TRUE:VB_FALSE;
1179 STDMETHODIMP COverlappedWindow::put_Iconic(BOOL newVal)
1182 ::ShowWindow(m_hPopupWnd,newVal?SW_MINIMIZE:SW_SHOWNORMAL);
1187 STDMETHODIMP COverlappedWindow::get_Zoomed(BOOL *pVal)
1190 *pVal = ::IsZoomed(m_hPopupWnd)?VB_TRUE:VB_FALSE;
1194 STDMETHODIMP COverlappedWindow::put_Zoomed(BOOL newVal)
1197 ::ShowWindow(m_hPopupWnd,newVal?SW_SHOWMAXIMIZED:SW_SHOWNORMAL);
1201 STDMETHODIMP COverlappedWindow::get_Visible(BOOL *pVal)
1204 if(::IsWindow(m_hPopupWnd)){
1205 //
\83E
\83B
\83\93\83h
\83E
\82ª
\8dì
\90¬
\8dÏ
\82Ý
\82Å
\82 \82ê
\82Î
\92²
\8d¸
\82·
\82é
1206 DWORD style = ::GetWindowLong(m_hPopupWnd,GWL_STYLE);
1207 *pVal = (style & WS_VISIBLE)?VB_TRUE:VB_FALSE;
1212 STDMETHODIMP COverlappedWindow::put_Visible(BOOL newVal)
1214 if(!newVal && !::IsWindow(m_hPopupWnd)){
1215 // FALSE
\82È
\82ç
\81A
\82 \82¦
\82Ä
\8dì
\90¬
\82Í
\8e\8e\82Ý
\82È
\82¢
1219 ::ShowWindow(m_hPopupWnd,newVal?SW_SHOWNORMAL:SW_HIDE);
1220 ::SetActiveWindow(m_hPopupWnd);
1224 STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim,BOOL* pRet)
1229 //
\91Ò
\8b@
\8e\9e\8aÔ
\82Ì
\8eæ
\93¾
1230 DWORD sleeptim = 1000;
1232 if(tim.ChangeType(VT_I4,&varTim) == S_OK){
1233 sleeptim = (DWORD)tim.lVal;
1236 sleeptim = INFINITE;
1239 HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = { NULL };
1240 HWND hWnd [MAXIMUM_WAIT_OBJECTS] = { NULL };
1242 SetWaitParam(&cnt,hWnd,hEvent);
1243 *pRet = MessageLoop(sleeptim,cnt,hWnd,hEvent)?VB_TRUE:VB_FALSE;
1248 STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt)
1251 HRESULT hRet = S_OK;
1253 if(tmp.ChangeType(VT_BSTR,&fmt) == S_OK){
1254 UINT len = SysStringByteLen(tmp.bstrVal)+1;
1255 LPSTR pBuf = new CHAR[len];
1256 int cnt = WideCharToMultiByte(GetACP(),0,tmp.bstrVal,-1,pBuf,len,NULL,NULL);
1258 //
\8cÃ
\82¢
\83\81\83j
\83\85\81[
\82ð
\94j
\8aü
\82·
\82é
1261 ::SetMenu(m_hPopupWnd,NULL);
1262 DestroyMenu(m_hMenu);
1266 //
\8d\80\96Ú
\82ª
\82 \82ê
\82Î
\83\81\83j
\83\85\81[
\96¼
\82ð
\83p
\81[
\83X
\82·
\82é
1267 m_hMenu = CreateMenu();
1268 TCHAR menuname[MAX_PATH];
1269 TCHAR szSubmenu[MAX_PATH];
1271 HMENU hPopupMenu = NULL;
1276 while(*p == ' ' || *p == '\t')p++; //
\83u
\83\89\83\93\83N
\83X
\83L
\83b
\83v
1279 //
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1281 //
\8aù
\91¶
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\82ð
\96\84\82ß
\8d\9e\82Þ
1282 MENUITEMINFO inf = {0};
1283 inf.cbSize = sizeof(MENUITEMINFO);
1284 inf.fMask = MIIM_SUBMENU | MIIM_TYPE;
1285 inf.fType = MFT_STRING;
1286 inf.dwTypeData = szSubmenu;
1287 inf.hSubMenu = hPopupMenu;
1288 InsertMenuItem(m_hMenu,lv1,true,&inf);
1293 hPopupMenu = CreatePopupMenu();
1295 while(*p && *p != ',' && *p != '/' && *p != ':'){
1298 ZeroMemory(szSubmenu,MAX_PATH);
1299 CopyMemory(szSubmenu,d,p-d);
1300 if(*p == ',' || *p == ':'){
1305 //
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1308 while(*p && *p != ',' && *p != '/' && *p != ':'){
1311 ZeroMemory(menuname,MAX_PATH);
1312 CopyMemory(menuname,d,p-d);
1313 //
\83R
\83}
\83\93\83h
\83Z
\83p
\83\8c\81[
\83^
\81[
\82ð
\8c\9f\8d¸
\82·
\82é
1315 LPSTR findcmd = strchr(menuname,'@');
1318 eventname = (LPCSTR)(findcmd + 1);
1322 wsprintf(tmp,"OnMenu%d",lv1*100+cmd);
1325 m_cMenuMap.insert(pair<int,_bstr_t>(lv1*100+cmd,eventname));
1326 //
\83\81\83j
\83\85\81[
\82Ì
\8dì
\90¬
1327 MENUITEMINFO inf = {0};
1328 inf.cbSize = sizeof(MENUITEMINFO);
1329 inf.fMask = MIIM_TYPE|MIIM_ID;
1330 inf.fType = MFT_STRING;
1331 inf.wID = lv1 * 100 + cmd;
1332 inf.dwTypeData = menuname;
1333 InsertMenuItem(hPopupMenu,lv2,true,&inf);
1336 //
\83Z
\83p
\83\8c\81[
\83^
\81[
\82Ì
\8ew
\92è
\82©?
1341 MENUITEMINFO inf = {0};
1342 inf.cbSize = sizeof(MENUITEMINFO);
1343 inf.fMask = MIIM_TYPE;
1344 inf.fType = MFT_SEPARATOR;
1345 InsertMenuItem(hPopupMenu,lv2,true,&inf);
1352 //
\96¢
\91}
\93ü
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\91}
\93ü
1354 //
\8aù
\91¶
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\82ð
\96\84\82ß
\8d\9e\82Þ
1355 MENUITEMINFO inf = {0};
1356 inf.cbSize = sizeof(MENUITEMINFO);
1357 inf.fMask = MIIM_SUBMENU | MIIM_TYPE;
1358 inf.fType = MFT_STRING;
1359 inf.dwTypeData = szSubmenu;
1360 inf.hSubMenu = hPopupMenu;
1361 InsertMenuItem(m_hMenu,lv1,true,&inf);
1363 ::SetMenu(m_hPopupWnd,m_hMenu);
1370 STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd,VARIANT* pRet)
1374 CComVariant varText;
1379 if(varCmd.ChangeType(VT_I2,&cmd) == S_OK){
1380 nCommand = varCmd.iVal;
1382 if(varText.ChangeType(VT_BSTR,&text) == S_OK){
1383 TCHAR menuname[MAX_PATH];
1384 UINT len = SysStringByteLen(varText.bstrVal)+1;
1385 LPSTR pBuf = new CHAR[len];
1386 int cnt = WideCharToMultiByte(GetACP(),0,varText.bstrVal,-1,pBuf,len,NULL,NULL);
1391 HMENU hPopupMenu = CreatePopupMenu();
1394 while(*p == ' ' || *p == '\t'){
1397 while(*p && *p != ',' && *p != '/' && *p != ':'){
1400 ZeroMemory(menuname,MAX_PATH);
1401 CopyMemory(menuname,d,p-d);
1402 MENUITEMINFO inf = {0};
1403 inf.cbSize = sizeof(MENUITEMINFO);
1404 inf.fMask = MIIM_TYPE|MIIM_ID;
1405 inf.fType = MFT_STRING;
1407 inf.wID = nCommand + cmd;
1410 //
\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
1411 // 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
1412 inf.wID = nCommand + cmd + 1;
1414 inf.dwTypeData = menuname;
1415 InsertMenuItem(hPopupMenu,lv,true,&inf);
1418 if(*p == ',' || *p == '/'){
1422 inf.fMask = MIIM_TYPE;
1423 inf.fType = MFT_SEPARATOR;
1424 InsertMenuItem(hPopupMenu,lv,true,&inf);
1431 DWORD pos = GetMessagePos();
1432 ::SetFocus(m_hPopupWnd);
1433 varRet = (SHORT)::TrackPopupMenuEx(hPopupMenu
1434 ,TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON |
1435 (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
1436 ,LOWORD(pos),HIWORD(pos),m_hPopupWnd,NULL);
1437 DestroyMenu(hPopupMenu);
1439 varRet.Detach(pRet);
1443 STDMETHODIMP COverlappedWindow::get_HWND(long *pVal)
1445 *pVal = (LONG)m_hPopupWnd;
1449 STDMETHODIMP COverlappedWindow::GetSysColor(VARIANT typ, VARIANT *col)
1451 //
\83V
\83X
\83e
\83\80\83J
\83\89\81[
\82Ì
\8eæ
\93¾
1452 CComVariant varType;
1454 varType.ChangeType(VT_I2,&typ);
1455 varRet = (long)::GetSysColor(varType.iVal);
1460 STDMETHODIMP COverlappedWindow::SetTimer(VARIANT tim,BOOL* pVal)
1466 if(varTim.ChangeType(VT_I4,&tim) == S_OK){
1467 timer = varTim.lVal;
1470 *pVal = ::SetTimer(m_hPopupWnd,1,timer,NULL)?VB_TRUE:VB_FALSE;
1473 *pVal = ::KillTimer(m_hPopupWnd,1)?VB_TRUE:VB_FALSE;
1479 STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode)
1483 ErrorInfo(IDS_ERR_NOCREATEMENU);
1484 return DISP_E_EXCEPTION;
1488 CComVariant varCmd,varMode;
1489 if(varCmd.ChangeType(VT_I2,&cmd) == S_OK){
1492 if(varMode.ChangeType(VT_I2,&mode) == S_OK){
1493 nMode = varMode.iVal;
1496 //
\83\81\83j
\83\85\81[
\83R
\83}
\83\93\83h
\82Í100
\88È
\8fã
\82Å
\82 \82é
\82Ì
\82Å
\81B
1497 MENUITEMINFO inf = {0};
1498 inf.cbSize = sizeof(MENUITEMINFO);
1499 inf.fMask = MIIM_STATE;
1500 inf.fState = nMode?MFS_CHECKED:MFS_UNCHECKED;
1501 ::SetMenuItemInfo(m_hMenu,nCmd,false,&inf);
1506 STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode)
1510 ErrorInfo(IDS_ERR_NOCREATEMENU);
1511 return DISP_E_EXCEPTION;
1515 CComVariant varCmd,varMode;
1516 if(varCmd.ChangeType(VT_I2,&cmd) == S_OK){
1519 if(varMode.ChangeType(VT_I2,&mode) == S_OK){
1520 nMode = varMode.iVal;
1523 //
\83\81\83j
\83\85\81[
\83R
\83}
\83\93\83h
\82Í100
\88È
\8fã
\82Å
\82 \82é
\82Ì
\82Å
\81B
1524 MENUITEMINFO inf = {0};
1525 inf.cbSize = sizeof(MENUITEMINFO);
1526 inf.fMask = MIIM_STATE;
1527 inf.fState = nMode?MFS_ENABLED:MFS_GRAYED;
1528 ::SetMenuItemInfo(m_hMenu,nCmd,false,&inf);
1533 STDMETHODIMP COverlappedWindow::get_CreateNoCloseWindow(BOOL *pVal)
1535 //
\83N
\83\8d\81[
\83Y
\8bÖ
\8e~
\83E
\83B
\83\93\83h
\83E?
1536 *pVal = windowParam.noclose?VB_TRUE:VB_FALSE;
1540 STDMETHODIMP COverlappedWindow::put_CreateNoCloseWindow(BOOL newVal)
1543 //
\83E
\83B
\83\93\83h
\83E
\8dì
\90¬
\8cã
\82É
\82Í
\8ew
\92è
\82Å
\82«
\82È
\82¢
1544 ErrorInfo(IDS_ERR_CREATEDWND);
1545 return DISP_E_EXCEPTION;
1547 windowParam.noclose = newVal;
1551 STDMETHODIMP COverlappedWindow::get_Canvas(VARIANT *pVal)
1553 //
\83h
\83\8d\81[
\83C
\83\93\83O
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\93n
\82·
1554 ::VariantInit(pVal);
1555 IUnknown* pUnk = NULL;
1557 m_pCanvas->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1558 pVal->vt = VT_UNKNOWN;
1559 pVal->punkVal = pUnk;
1564 STDMETHODIMP COverlappedWindow::get_Event(VARIANT *pVal)
1566 ::VariantInit(pVal);
1568 //
\83C
\83x
\83\93\83g
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8eæ
\93¾
1569 IUnknown* pUnk = NULL;
1570 if(m_pEvent->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1571 pVal->vt = VT_UNKNOWN;
1572 pVal->punkVal = pUnk;
1578 STDMETHODIMP COverlappedWindow::get_DropFiles(VARIANT *pVal)
1580 m_dropfiles.GetPathArray(pVal);
1584 STDMETHODIMP COverlappedWindow::get_Quit(BOOL *pVal)
1586 *pVal = m_bQuit?VB_TRUE:VB_FALSE;
1590 STDMETHODIMP COverlappedWindow::put_Quit(BOOL newVal)
1594 //
\83C
\83x
\83\93\83g
\82ð
\94
\90¶
\82³
\82¹
\91Ò
\8b@
\8fó
\91Ô
\82ð
\89ð
\82
1595 SetEvent(m_hWaitEvent);
1600 STDMETHODIMP COverlappedWindow::get_Form(VARIANT *pVal)
1602 //
\83t
\83H
\81[
\83\80\82Ì
\8cö
\8aJ
1603 ::VariantInit(pVal);
1605 IUnknown* pUnk = NULL;
1606 if(m_pForm->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1607 pVal->vt = VT_UNKNOWN;
1608 pVal->punkVal = pUnk;
1614 STDMETHODIMP COverlappedWindow::get_Style(long *pVal)
1617 windowParam.style = ::GetWindowLong(m_hPopupWnd,GWL_STYLE);
1619 *pVal = (long)windowParam.style;
1623 STDMETHODIMP COverlappedWindow::put_Style(long newVal)
1625 windowParam.style = (DWORD)newVal;
1627 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.style);
1632 STDMETHODIMP COverlappedWindow::get_Exstyle(long *pVal)
1635 windowParam.exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
1637 *pVal = (long)windowParam.exstyle;
1641 STDMETHODIMP COverlappedWindow::put_Exstyle(long newVal)
1643 windowParam.exstyle = (DWORD)newVal;
1645 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.exstyle);
1650 STDMETHODIMP COverlappedWindow::get_WindowClassName(BSTR *pVal)
1652 WCHAR wmes[MAX_PATH];
1653 MultiByteToWideChar(GetACP(),0,windowParam.szClassName,-1,wmes,MAX_PATH);
1654 *pVal = SysAllocString(wmes);
1658 STDMETHODIMP COverlappedWindow::Refresh()
1661 ::SetWindowPos(m_hPopupWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_NOCOPYBITS);
1666 void COverlappedWindow::SetTitle()
1671 TCHAR szTitle[MAX_PATH] = {0};
1672 WideCharToMultiByte(GetACP(),0,m_bstrCaption,-1,szTitle,MAX_PATH,NULL,NULL);
1673 ::SetWindowText(m_hPopupWnd,szTitle);
1676 STDMETHODIMP COverlappedWindow::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VARIANT h, VARIANT *pvarUnk)
1678 //
\83T
\83C
\83Y
\95Ï
\8dX
1679 CComVariant varX,varY,varW,varH;
1680 UINT flag = SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE;
1681 if((x.vt != VT_EMPTY && x.vt != VT_NULL && x.vt != VT_ERROR) && varX.ChangeType(VT_I2,&x) == S_OK){
1682 windowParam.posX = varX.iVal;
1683 flag &= ~SWP_NOMOVE;
1685 if((y.vt != VT_EMPTY && y.vt != VT_NULL && y.vt != VT_ERROR) && varY.ChangeType(VT_I2,&y) == S_OK){
1686 windowParam.posY = varY.iVal;
1687 flag &= ~SWP_NOMOVE;
1689 if((w.vt != VT_EMPTY && w.vt != VT_NULL && w.vt != VT_ERROR) && varW.ChangeType(VT_I2,&w) == S_OK){
1690 windowParam.width = varW.iVal;
1691 flag &= ~SWP_NOSIZE;
1693 if((h.vt != VT_EMPTY && h.vt != VT_NULL && h.vt != VT_ERROR) && varH.ChangeType(VT_I2,&h) == S_OK){
1694 windowParam.height = varH.iVal;
1695 flag &= ~SWP_NOSIZE;
1697 //
\83E
\83B
\83\93\83h
\83E
\82ª
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82ê
\82Î
\82½
\82¾
\82¿
\82É
\94½
\89f
1699 ::SetWindowPos(m_hPopupWnd,NULL,windowParam.posX,windowParam.posY,windowParam.width,windowParam.height,flag);
1702 //
\83t
\83H
\81[
\83\80\82Ì
\83T
\83C
\83Y
\82ð
\95Ï
\8dX
\82·
\82é
1703 m_pForm->SetWindowSize(windowParam.width,windowParam.height,windowParam.GetStyle() & WS_THICKFRAME);
1705 CreateThisInterface(pvarUnk);
1709 void COverlappedWindow::CreateThisInterface(VARIANT* pvarUnk)
1711 //
\82±
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
1712 ::VariantInit(pvarUnk);
1713 IUnknown* pUnk = NULL;
1714 if(QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1715 pvarUnk->vt = VT_UNKNOWN;
1716 pvarUnk->punkVal = pUnk;
1720 STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT caption_system, VARIANT maxmin, VARIANT *pvarUnk)
1722 CComVariant varFrametype,varCaptionSystem,varMaxMin;
1723 if(frametype.vt != VT_EMPTY && frametype.vt != VT_ERROR && frametype.vt != VT_NULL
1724 && varFrametype.ChangeType(VT_I2,&frametype) == S_OK){
1725 windowParam.frametype = varFrametype.iVal;
1727 if(caption_system.vt != VT_EMPTY && caption_system.vt != VT_ERROR && caption_system.vt != VT_NULL
1728 && varCaptionSystem.ChangeType(VT_I2,&caption_system) == S_OK){
1729 windowParam.captionbar = (varCaptionSystem.iVal > 0);
1730 windowParam.systemmenu = (varCaptionSystem.iVal > 1);
1732 if(maxmin.vt != VT_EMPTY && maxmin.vt != VT_ERROR && maxmin.vt != VT_NULL
1733 && varMaxMin.ChangeType(VT_I2,&maxmin) == S_OK){
1734 windowParam.minbox = (varMaxMin.iVal & 0x01);
1735 windowParam.maxbox = (varMaxMin.iVal & 0x02);
1738 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.GetStyle());
1741 CreateThisInterface(pvarUnk);
1745 STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
1748 ::VariantInit(pvarUnk);
1749 //
\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¤
1750 list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1751 while(p != m_lstChild.end()){
1752 DWORD refCount = (*p)->m_dwRef;
1753 if((*p)->m_dwRef == 1){
1754 //
\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
1755 BOOL bVisible = false;
1756 (*p)->get_Visible(&bVisible);
1758 //
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82È
\82¯
\82ê
\82Î
\8fÁ
\82µ
\82Ä
\82æ
\82µ
\81B
1760 p = m_lstChild.erase(p);
1767 CComObject<COverlappedWindow>* pChild = NULL;
1768 if(pChild->CreateInstance(&pChild) == S_OK){
1770 pChild->SetParent(m_hPopupWnd);
1771 pChild->put_WaitCursor(m_dWaitCursor);
1772 m_lstChild.push_back(pChild);
1773 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
1774 IUnknown* pUnk = NULL;
1775 if(pChild->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1776 pvarUnk->vt = VT_UNKNOWN;
1777 pvarUnk->punkVal = pUnk;
1783 void COverlappedWindow::SetParent(HWND hParent)
1785 m_hParentWnd = hParent;
1788 HANDLE COverlappedWindow::GetEventHandle()
1790 return m_hWaitEvent;
1793 void COverlappedWindow::SetWaitParam(int *count, HWND *hWnd, HANDLE *hEvent)
1795 //
\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¾
1796 if(*count < MAXIMUM_WAIT_OBJECTS){
1797 //
\8e©
\95ª
\8e©
\90g
\82ð
\93o
\98^
1798 hEvent[*count] = m_hWaitEvent;
1799 hWnd [*count] = m_hPopupWnd;
1801 //
\83`
\83\83\83C
\83\8b\83h
\82ð
\93o
\98^
1802 list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1803 while( (p != m_lstChild.end()) && (*count < MAXIMUM_WAIT_OBJECTS) ){
1804 //
\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·
1805 (*p)->SetWaitParam(count,hWnd,hEvent);
1811 DWORD COverlappedWindow::MessageLoop(DWORD sleeptim,int cnt, HWND *hWnd, HANDLE* hEvent)
1813 //
\83\81\83b
\83Z
\81[
\83W
\83\8b\81[
\83v
\82ð
\8f\88\97\9d\82·
\82é
1815 DWORD retWait = MsgWaitForMultipleObjects(cnt,hEvent,false,sleeptim,QS_ALLEVENTS|QS_ALLINPUT);
1817 if(retWait != WAIT_TIMEOUT){
1819 if(retWait >= WAIT_OBJECT_0 && retWait < WAIT_OBJECT_0 + cnt){
1820 //
\83C
\83x
\83\93\83g
\82Ì
\94
\90¶
\82µ
\82½
\83n
\83\93\83h
\83\8b\82ð
\8e¯
\95Ê
\82·
\82é
1821 ret = retWait - WAIT_OBJECT_0 + 1;
1825 while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)){
1826 BOOL bTranslated = false;
1829 //
\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·
1830 HWND hParent = msg.hwnd;
1831 while(!hOwner && hParent){
1833 for(i=0 ; i<cnt && hWnd[i] ; i++){
1834 if(hParent == hWnd[i]){
1839 hParent = ::GetParent(hParent);
1843 BOOL bTranslatedDlg = false;
1844 if(msg.message == WM_KEYDOWN){
1845 //
\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é
1846 ::SendMessage(hOwner,WM_KEYDOWN_EX,msg.wParam,msg.lParam);
1848 //
\83_
\83C
\83A
\83\8d\83O
\82à
\82Ç
\82«
\8f\88\97\9d\82ð
\8ds
\82¤
1849 BOOL bShift = GetKeyState(VK_SHIFT ) & 0x8000;
1850 BOOL bCtrl = GetKeyState(VK_CONTROL) & 0x8000;
1851 if(msg.wParam == VK_TAB){
1854 HWND hNextFocus = ::GetNextDlgTabItem(hOwner,GetFocus(),bShift);
1856 ::SetFocus(hNextFocus);
1859 bTranslatedDlg = true;
1861 else if(msg.wParam == VK_F6){
1863 SendMessage(hOwner,WM_MOVENEXT_OVERLAPPED,0,0);
1864 bTranslatedDlg = true;
1867 if(!bTranslatedDlg){
1868 bTranslated |= ::IsDialogMessage(hOwner,&msg);
1872 ::TranslateMessage( &msg );
1873 ::DispatchMessage( &msg );
1880 STDMETHODIMP COverlappedWindow::get_AutoMessageLoop(BOOL *pVal)
1882 *pVal = windowParam.automessageloop?VB_TRUE:VB_FALSE;
1886 STDMETHODIMP COverlappedWindow::put_AutoMessageLoop(BOOL newVal)
1888 windowParam.automessageloop = newVal;
1892 STDMETHODIMP COverlappedWindow::DoModal(VARIANT* pRetCode)
1894 CComVariant dmy,retdmy;
1896 dmy.scode = DISP_E_PARAMNOTFOUND;
1899 CComVariant tim = (short)1000;
1901 while(!m_bQuit && ::IsWindow(m_hPopupWnd)){
1902 WaitEvent(tim,&ret);
1909 ::VariantInit(pRetCode);
1910 pRetCode->vt = VT_I2;
1911 pRetCode->iVal = m_dModalExitCode;
1915 STDMETHODIMP COverlappedWindow::get_AutoClose(BOOL *pVal)
1917 *pVal = windowParam.autoclose?VB_TRUE:VB_FALSE;
1921 STDMETHODIMP COverlappedWindow::put_AutoClose(BOOL newVal)
1923 windowParam.autoclose = newVal;
1927 void COverlappedWindow::CreateWindowList(list<HWND>& lstWnd,BOOL bSearchRoot)
1930 if(m_hParentWnd && bSearchRoot){
1931 //
\8dª
\8c³
\82Å
\82È
\82¯
\82ê
\82Î
\81A
\82³
\82ç
\82É
\96â
\82¢
\8d\87\82í
\82¹
\82é
1932 COverlappedWindow* pParent = (COverlappedWindow*)::GetWindowLong(m_hParentWnd,GWL_USERDATA);
1934 pParent->CreateWindowList(lstWnd,true);
1938 //
\82±
\82±
\82ª
\8dª
\8c³
\82Å
\82 \82é
1939 list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
1940 DWORD stl = ::GetWindowLong(m_hPopupWnd,GWL_STYLE);
1941 if(stl & WS_VISIBLE){
1942 //
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82é
\83E
\83B
\83\93\83h
\83E
\82Ì
\82Ý
\82ð
\93o
\98^
\82·
\82é
1943 lstWnd.push_back(m_hPopupWnd);
1945 while(p != m_lstChild.end()){
1946 //
\82·
\82×
\82Ä
\82Ì
\8eq
\83I
\81[
\83o
\81[
\83\89\83b
\83v
\82ð
\97ñ
\8b\93\82·
\82é
1948 (*p)->get_HWND((long*)&hWnd);
1949 if(hWnd && ::IsWindow(hWnd)){
1950 (*p)->CreateWindowList(lstWnd,false);
1957 void COverlappedWindow::MoveNextOverlapped()
1959 //
\8f\87\8f\98\83\8a\83X
\83g
\82Ì
\90¶
\90¬
\82ð
\88Ë
\97\8a\82·
\82é
1961 CreateWindowList(lstWnd,true);
1962 //
\8c»
\8dÝ
\88Ê
\92u
\82ð
\94c
\88¬
\82·
\82é
1963 HWND hActiveWnd = ::GetActiveWindow();
1964 list<HWND>::iterator p = lstWnd.begin();
1965 while(p != lstWnd.end()){
1967 if(hActiveWnd == *p){
1968 //
\83A
\83N
\83e
\83B
\83u
\83E
\83B
\83\93\83h
\83E
\82ð
\94
\8c©
\82µ
\82½
1970 HWND hNext = lstWnd.front();
1971 if(p != lstWnd.end()){
1974 // ::SetActiveWindow(hNext);
1982 STDMETHODIMP COverlappedWindow::get_Object(VARIANT idx, VARIANT *pVal)
1984 //
\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ñ
1985 ::VariantInit(pVal);
1986 pVal->vt = VT_UNKNOWN;
1987 m_pObject->QueryInterface(IID_IUnknown,(void**)&(pVal->punkVal));
1992 STDMETHODIMP COverlappedWindow::get_ExitCode(short *pVal)
1994 *pVal = (short)m_dModalExitCode;
1998 STDMETHODIMP COverlappedWindow::put_ExitCode(short newVal)
2000 m_dModalExitCode = newVal;
2004 STDMETHODIMP COverlappedWindow::get_WaitCursor(short *pVal)
2006 *pVal = (short)m_dWaitCursor;
2010 STDMETHODIMP COverlappedWindow::put_WaitCursor(short newVal)
2012 m_dWaitCursor = newVal;
2014 ::SendMessage(m_hPopupWnd,WM_SETCURSOR,(WPARAM)m_hPopupWnd,0);
2016 //
\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é
2017 list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
2018 while(pWnd != m_lstChild.end()){
2019 (*pWnd)->put_WaitCursor(newVal);
2025 STDMETHODIMP COverlappedWindow::LoadIcon(VARIANT text)
2027 CHAR szPath[MAX_PATH];
2028 CComVariant varText;
2029 if(varText.ChangeType(VT_BSTR,&text) != S_OK){
2030 return DISP_E_TYPEMISMATCH;
2032 WideCharToMultiByte(GetACP(),0,varText.bstrVal,-1,szPath,MAX_PATH,NULL,NULL);
2034 DestroyIcon(m_hIcon);
2037 m_hIcon = (HICON)LoadImage(NULL,szPath,IMAGE_ICON
2038 ,GetSystemMetrics(SM_CXSMICON)
2039 ,GetSystemMetrics(SM_CYSMICON),LR_LOADFROMFILE);
2040 if(m_hIcon && m_hPopupWnd){
2041 ::SendMessage(m_hPopupWnd, WM_SETICON, false, (LPARAM)m_hIcon);
2046 STDMETHODIMP COverlappedWindow::CenterWindow()
2051 //
\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é
2052 ::GetWindowRect(m_hParentWnd,&rct);
2055 HWND hwnd = ::GetDesktopWindow();
2059 ::GetWindowRect(hwnd,&rct);
2061 int x = rct.left + (rct.right - rct.left)/2 - windowParam.width / 2;
2062 int y = rct.top + (rct.bottom - rct.top )/2 - windowParam.height / 2;
2063 WINDOWPLACEMENT pls = { 0 };
2064 pls.length = sizeof(WINDOWPLACEMENT);
2065 pls.rcNormalPosition.top = y;
2066 pls.rcNormalPosition.left = x;
2067 pls.rcNormalPosition.bottom = y + windowParam.height;
2068 pls.rcNormalPosition.right = x + windowParam.width;
2069 ::SetWindowPlacement(m_hPopupWnd,&pls);
2073 STDMETHODIMP COverlappedWindow::get_ClassObject(VARIANT* pVal)
2075 ::VariantInit(pVal);
2077 m_pClassDisp->AddRef();
2078 pVal->pdispVal = m_pClassDisp;
2079 pVal->vt = VT_UNKNOWN;
2084 STDMETHODIMP COverlappedWindow::put_ClassObject(VARIANT newVal)
2087 m_pClassDisp->Release();
2089 if(newVal.vt == VT_DISPATCH){
2090 m_pClassDisp = newVal.pdispVal;
2091 m_pClassDisp->AddRef();
2093 else if(!(newVal.vt == VT_EMPTY || newVal.vt == VT_ERROR || newVal.vt == VT_NULL)){
2094 return DISP_E_TYPEMISMATCH;
2099 void COverlappedWindow::ClassObjectInvoke(LPCWSTR handler)
2105 if(m_pClassDisp->GetIDsOfNames(IID_NULL,(LPWSTR*)&handler,1,LOCALE_SYSTEM_DEFAULT,&dispid) != S_OK){
2108 DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
2109 m_pClassDisp->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispparamsNoArgs,NULL,NULL,NULL);
2112 STDMETHODIMP COverlappedWindow::get_ClientWidth(long *pVal)
2116 ::GetClientRect(m_hPopupWnd,&rct);
2121 STDMETHODIMP COverlappedWindow::get_ClientHeight(long *pVal)
2125 ::GetClientRect(m_hPopupWnd,&rct);
2130 STDMETHODIMP COverlappedWindow::get_innerWidth(double *pVal)
2134 ::GetClientRect(m_hPopupWnd,&rct);
2135 POINT pt = {rct.right,0-rct.bottom};
2136 HDC hdc = ::GetWindowDC(m_hPopupWnd);
2137 int md = ::GetMapMode(hdc);
2138 ::SetMapMode(hdc,MM_LOMETRIC);
2139 ::DPtoLP(hdc,&pt,1);
2140 ::SetMapMode(hdc,md);
2141 ::ReleaseDC(m_hPopupWnd,hdc);
2146 STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal)
2150 ::GetClientRect(m_hPopupWnd,&rct);
2151 POINT pt = {rct.right,0-rct.bottom};
2152 HDC hdc = ::GetWindowDC(m_hPopupWnd);
2153 int md = ::GetMapMode(hdc);
2154 ::SetMapMode(hdc,MM_LOMETRIC);
2155 ::DPtoLP(hdc,&pt,1);
2156 ::SetMapMode(hdc,md);
2157 ::ReleaseDC(m_hPopupWnd,hdc);
2162 STDMETHODIMP COverlappedWindow::get_AutoReleaseClassObject(BOOL *pVal)
2164 *pVal = m_bAutoReleaseClassObject?VB_TRUE:VB_FALSE;
2168 STDMETHODIMP COverlappedWindow::put_AutoReleaseClassObject(BOOL newVal)
2170 m_bAutoReleaseClassObject = newVal;
2174 STDMETHODIMP COverlappedWindow::get_DefaultAction(BOOL *pVal)
2176 *pVal = m_bDefaultAction?VB_TRUE:VB_FALSE;
2180 STDMETHODIMP COverlappedWindow::put_DefaultAction(BOOL newVal)
2182 m_bDefaultAction = newVal;
2186 STDMETHODIMP COverlappedWindow::SetClipboardText(BSTR text)
2189 if(::OpenClipboard(m_hPopupWnd)){
2191 int len = SysStringByteLen(text);
2192 HGLOBAL hGlobal = GlobalAlloc(GMEM_DDESHARE,len + 1);
2193 LPSTR p = (LPSTR)GlobalLock(hGlobal);
2194 WideCharToMultiByte(GetACP(),0,text,-1,p,len,NULL,NULL);
2196 GlobalUnlock(hGlobal);
2197 ::SetClipboardData(CF_TEXT,hGlobal);
2203 STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText)
2206 ::VariantInit(pVarText);
2207 if(::OpenClipboard(m_hPopupWnd)){
2208 if(IsClipboardFormatAvailable(CF_TEXT)){
2209 HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT);
2211 LPCSTR p = (LPSTR)GlobalLock(hGlobal);
2213 int len = GlobalSize(hGlobal);
2215 GlobalUnlock(hGlobal);
2216 pVarText->bstrVal = wstr.copy();
2217 pVarText->vt = VT_BSTR;