OSDN Git Service

20021009版ソース
[seraphyscrtools/SeraphyScriptTools.git] / OverlappedWindow.cpp
1 // OverlappedWindow.cpp : COverlappedWindow \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2
3
4 // /D "_ATL_MIN_CRT" \82ð\8aO\82·
5
6 #include "stdafx.h"
7 #include "SeraphyScriptTools.h"
8 #include "OverlappedWindow.h"
9 #include "generic.h"
10 #include <list>
11 #include <stack>
12
13 /////////////////////////////////////////////////////////////////////////////
14 // COverlappedWindow
15
16
17 COverlappedWindow::COverlappedWindow()
18 {
19         m_pUnkMarshaler = NULL;
20
21         // \83A\83C\83R\83\93\82Ì\8f\89\8aú\89»
22         m_hIcon = NULL;
23
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);
28
29         // \83C\83x\83\93\83g\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8f\89\8aú\89»
30         m_pEvent  = NULL;
31         // \83N\83\89\83X\83I\83u\83W\83F\83N\83g\82Ì\8f\89\8aú\89»
32         m_pClassDisp = NULL;
33         m_bAutoReleaseClassObject = true;
34
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¬
44         m_hParentWnd    = NULL;
45         m_hPopupWnd     = NULL;
46         m_hMenu         = NULL;
47
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
51         m_dCaptureMode = 0;
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é
53
54         // \83t\83H\81[\83\80\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8dì\90¬
55         m_pForm = NULL;
56         m_hLastFocusControl = NULL;
57         if(m_pForm->CreateInstance(&m_pForm) == S_OK){
58                 m_pForm->AddRef();
59                 m_pForm->SetWindowSize(windowParam.width,windowParam.height,true);
60         }
61         // \95`\89æ\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
62         m_pCanvas = NULL;
63         if(m_pCanvas->CreateInstance(&m_pCanvas) == S_OK){
64                 m_pCanvas->AddRef();
65         }
66         // \83\86\81[\83U\81[\92è\8b`\98A\91z\94z\97ñ\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
67         m_pObject = NULL;
68         if(m_pObject->CreateInstance(&m_pObject) == S_OK){
69                 m_pObject->AddRef();
70         }
71         // \83E\83F\83C\83g\83J\81[\83\\83\8b\82Ì\8f\89\8aú\89»
72         m_dWaitCursor = 0;
73 }
74
75 HRESULT COverlappedWindow::FinalConstruct()
76 {
77         return CoCreateFreeThreadedMarshaler(
78                 GetControllingUnknown(), &m_pUnkMarshaler.p);
79 }
80
81 void COverlappedWindow::FinalRelease()
82 {
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
84         Fire_ExitWindow();
85         ClassObjectInvoke(L"ExitWindow");
86
87         // \83N\83\89\83X\83I\83u\83W\83F\83N\83g\82Ì\95ú\8aü
88         if(     m_pClassDisp ){
89                 m_pClassDisp->Release();
90                 m_pClassDisp = NULL;
91         }
92
93         // \83A\83C\83R\83\93\82Ì\94j\8aü
94         if(m_hIcon){
95                 ::DestroyIcon(m_hIcon);
96         }
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()){
100                 (*pWnd)->Close();
101                 (*pWnd)->Release();
102                 pWnd = m_lstChild.erase(pWnd);
103         }
104         // \83C\83x\83\93\83g\83I\83u\83W\83F\83N\83g\82Ì\94j\8aü
105         if(m_pEvent){
106                 m_pEvent->Release();
107                 m_pEvent = NULL;
108         }
109
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ü
111         if(m_pCanvas){
112                 m_pCanvas->DetachOwner();
113                 m_pCanvas->Release();
114                 m_pCanvas = NULL;
115         }
116         // \83t\83H\81[\83\80\82Ì\94j\8aü
117         if(m_pForm){
118                 m_pForm->DetachOwner();
119                 m_pForm->Release();
120                 m_pForm = NULL;
121         }
122         // \83\86\81[\83U\81[\92è\8b`\98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82Ì\94j\8aü
123         if(m_pObject){
124                 m_pObject->Release();
125                 m_pObject = NULL;
126         }
127
128         // \94w\8ci\83u\83\89\83V\82Ì\89ð\95ú
129         if(m_hBkBrush){
130                 DeleteObject(m_hBkBrush);
131         }
132
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()){
137                 (*pEv)->Release();
138                 pEv = m_lstEvent.erase(pEv);
139         }
140         LeaveCriticalSection(&m_objEventDataProtection);
141
142         // \83C\83x\83\93\83g\83n\83\93\83h\83\8b\82Ì\89ð\95ú
143         if(m_hWaitEvent){
144                 CloseHandle(m_hWaitEvent);
145                 m_hWaitEvent = NULL;
146         }
147         // \83\81\83j\83\85\81[\82Ì\94j\8aü
148         if(m_hMenu){
149                 DestroyMenu(m_hMenu);
150                 m_hMenu = NULL;
151         }
152         // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Ì\94j\8aü
153         if(m_hPopupWnd){
154                 ::DestroyWindow(m_hPopupWnd);
155                 m_hPopupWnd = NULL;
156         }
157         // \83N\83\8a\83e\83B\83J\83\8b\83Z\83b\83V\83\87\83\93\82Ì\94j\8aü
158         DeleteCriticalSection(&m_objEventDataProtection);
159
160         m_pUnkMarshaler.Release();
161         ATLTRACE("COverlappedWindow::FinalRelease\r\n");
162 }
163
164 STDMETHODIMP COverlappedWindow::get_Caption(BSTR* pVal)
165 {
166         *pVal = SysAllocString(m_bstrCaption);
167         return S_OK;
168 }
169
170 STDMETHODIMP COverlappedWindow::put_Caption(BSTR newVal)
171 {
172         SysReAllocString(&m_bstrCaption,newVal);
173         SetTitle();
174         return S_OK;
175 }
176
177 STDMETHODIMP COverlappedWindow::get_backColor(long *pVal)
178 {
179         *pVal = m_dwBackColor;
180         return S_OK;
181 }
182
183 STDMETHODIMP COverlappedWindow::put_backColor(long newVal)
184 {
185         m_dwBackColor = newVal;
186         if(m_hBkBrush){
187                 DeleteObject(m_hBkBrush);
188         }
189         m_hBkBrush  = CreateSolidBrush(COLORREF(newVal));
190         if(m_hPopupWnd){
191                 ::InvalidateRect(m_hPopupWnd,NULL,true);
192                 ::UpdateWindow(m_hPopupWnd);
193         }
194         return S_OK;
195 }
196
197 HWND COverlappedWindow::SafeCreateWnd()
198 {
199         // \90\90¬\8dÏ\82Ý\82Å\82 \82ê\82Î\89½\82à\82µ\82È\82¢\81B
200         if(m_hPopupWnd){
201                 return m_hPopupWnd;
202         }
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¤
205
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;
210         }
211         else{
212                 windowParam.SetWindowClassName("SeraphyScriptToolsOverlappedWindow");
213                 windowParam.wndstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
214         }
215         
216         WNDCLASSEX wcex = {0};
217         wcex.cbSize = sizeof(WNDCLASSEX); 
218         wcex.lpfnWndProc        = (WNDPROC)WindowProc;
219         wcex.cbClsExtra         = 0;
220         wcex.cbWndExtra         = 0;
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 );
230
231         HWND hWnd = CreateWindowEx(
232                 WS_EX_CONTROLPARENT,
233                 windowParam.szClassName,
234                 "", // \83_\83~\81[
235                 windowParam.GetStyle(),
236                 CW_USEDEFAULT,
237                 CW_USEDEFAULT,
238                 windowParam.width,
239                 windowParam.height,
240                 m_hParentWnd,
241                 NULL, _Module.m_hInst, this);
242         ::SetWindowLong(hWnd,GWL_USERDATA,(LONG)this); // \83N\83\89\83X\82Æ\8aÖ\98A\95t\82¯\82é
243         m_hPopupWnd = hWnd;
244         // \83E\83B\83\93\83h\83E\83X\83^\83C\83\8b\82Ì\8dÄ\90Ý\92è
245         ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.GetStyle());
246         Refresh();
247
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);
258         
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é
260         if(m_pForm){
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);
263         }
264
265         // \83E\83B\83\93\83h\83E\82ª\90\90¬\82³\82ê\82½\83C\83x\83\93\83g\82ð\94­\8ds\82·\82é
266         Fire_InitWindow();
267         ClassObjectInvoke(L"InitWindow");
268
269         return hWnd;
270 }
271
272 LRESULT CALLBACK COverlappedWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
273 {
274         COverlappedWindow* me = (COverlappedWindow*)::GetWindowLong(hWnd,GWL_USERDATA);
275
276         // \8bÙ\8b}\92â\8e~\82Ì\94»\92è
277         if(GetAsyncKeyState(VK_PAUSE) & 0x8000){
278                 ::EnableWindow(hWnd,true);
279                 me->m_bQuit = 1;
280                 me->m_dModalExitCode = 3;
281         }
282
283         switch(uMsg)
284         {
285         case WM_MOVENEXT_OVERLAPPED:
286                 {
287                         me->MoveNextOverlapped();
288                         return 0;
289                 }
290         case WM_CREATE:
291                 {
292                         // \83f\83B\83t\83H\83\8b\83g\82Ì\93®\8dì\82ð\8ds\82¤
293                         break;
294                 }
295         case WM_PAINT:
296                 {
297                         PAINTSTRUCT ps;
298                         RECT rt;
299                         ::GetClientRect( hWnd, &rt );
300                         HDC hdc  = ::BeginPaint (hWnd, &ps);
301                         HDC hdc2 = hdc;
302                         HBITMAP bmp;
303                         BOOL bDblBuf = me->windowParam.doublebuffer;
304                         if(bDblBuf){
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);
309                         }
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);
315
316                         // \83h\83\8d\81[\83C\83\93\83O\83f\81[\83^\81[\82Ì\95`\89æ
317                         if(me->m_pCanvas){
318                                 me->m_pCanvas->Draw(hdc2,rt);
319                         }
320
321                         if(bDblBuf){
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);
324                                 DeleteDC(hdc2);
325                                 DeleteObject(bmp);
326                         }
327                         ::EndPaint( hWnd, &ps );
328                         break;
329                 }
330         case WM_SYSCOMMAND:
331                 {
332                         if(wParam == SC_CLOSE){
333                                 if(me->windowParam.autoclose){
334                                         me->Close();
335                                 }
336                                 me->m_bQuit = true;
337                                 me->m_dModalExitCode = IDABORT;
338                                 me->AddEventSingle(WM_COMMAND,IDABORT,0);
339                                 return false;
340                         }
341                         else if(wParam == WM_MOVENEXT_OVERLAPPED){
342                                 SendMessage(hWnd,WM_MOVENEXT_OVERLAPPED,0,0);
343                                 return 0;
344                         }
345                         break;
346                 }
347         case WM_MOUSEMOVE:
348                 {
349                         me->AddEventSingle(WM_MOUSEMOVE,0,0);
350                         break;
351                 }
352         case WM_LBUTTONDBLCLK:
353                 {
354                         me->AddEvent(WM_LBUTTONDBLCLK,0,0);
355                         break;
356                 }
357         case WM_RBUTTONDBLCLK:
358                 {
359                         me->AddEvent(WM_RBUTTONDBLCLK,0,0);
360                         break;
361                 }
362         case WM_LBUTTONDOWN:
363                 {
364                         if(me->m_dCaptureMode == 0){
365                                 me->AddEvent(WM_LBUTTONDOWN,0,0);
366                                 ::SetCapture(hWnd);
367                                 me->m_dCaptureMode |= 0x01;
368                         }
369                         else{
370                                 ReleaseCapture();
371                         }
372                         break;
373                 }
374         case WM_LBUTTONUP:
375                 {
376                         if(me->m_dCaptureMode & 0x01){
377                                 me->AddEvent(WM_LBUTTONUP,0,0);
378                                 me->m_dCaptureMode &= ~0x01;
379                                 ReleaseCapture();
380                         }
381                         break;
382                 }
383         case WM_RBUTTONDOWN:
384                 {
385                         if(me->m_dCaptureMode == 0){
386                                 me->AddEvent(WM_RBUTTONDOWN,0,0);
387                                 ::SetCapture(hWnd);
388                                 me->m_dCaptureMode |= 0x02;
389                         }
390                         else{
391                                 ReleaseCapture();
392                         }
393                         break;
394                 }
395         case WM_RBUTTONUP:
396                 {
397                         if(me->m_dCaptureMode & 0x02){
398                                 me->AddEvent(WM_RBUTTONUP,0,0);
399                                 me->m_dCaptureMode &= ~0x02;
400                                 ReleaseCapture();
401                         }
402                         break;
403                 }
404         case WM_CAPTURECHANGED:
405                 {
406                         if(me->m_dCaptureMode & 0x01){
407                                 me->AddEvent(WM_CAPTURECHANGED,1,0);
408                         }
409                         if(me->m_dCaptureMode & 0x02){
410                                 me->AddEvent(WM_CAPTURECHANGED,2,0);
411                         }
412                         me->m_dCaptureMode = 0;
413                         break;
414                 }
415         case WM_SIZE:
416                 {
417                         me->AddEventSingle(WM_SIZE,0,0);
418                         break;
419                 }
420         case WM_TIMER:
421                 {
422                         if(wParam == 1){
423                                 me->AddEventSingle(WM_TIMER,0,0);
424                         }
425                         break;
426                 }
427         case WM_DROPFILES:
428                 {
429                         HDROP hDrop = (HDROP)wParam;
430                         me->m_dropfiles.DropFiles(hDrop);
431                         me->AddEvent(WM_DROPFILES,0,0);
432                         break;
433                 }
434         case WM_KEYDOWN:
435                 {
436                         DWORD st = 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);
441                         return 0;
442                 }
443         case WM_KEYDOWN_EX:
444                 {
445                         DWORD st = 0;
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);
450                         return 0;
451                 }
452         case WM_COMMAND:
453                 {
454 #ifdef _DEBUG
455                         TCHAR mes[MAX_PATH];
456                         wsprintf(mes,"command=%d:%d\n",HIWORD(wParam),LOWORD(wParam));
457                         OutputDebugString(mes);
458 #endif
459                         HWND hControl = (HWND)lParam;
460                         int nID    = LOWORD(wParam);
461                         int notify = HIWORD(wParam);
462                         if(!notify){
463                                 if(nID == IDABORT){
464                                         // IDABORT\82Æ\93¯\88ê\82È\82çquit\82ð\97§\82Ä\82é
465                                         me->m_bQuit = true;
466                                 }
467                                 me->AddEventSingle(WM_COMMAND,nID,0);
468                         }
469                         else{
470                                 // \83R\83\93\83g\83\8d\81[\83\8b\92Ê\92m
471                                 switch(notify)
472                                 {
473                                 case CBN_SETFOCUS:
474                                 case LBN_SETFOCUS:
475                                 case EN_SETFOCUS:
476                                 case BN_SETFOCUS:
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;
479                                         break;
480                                 case LBN_DBLCLK:
481                                         // LISTBOX\82ª\83_\83u\83\8b\83N\83\8a\83b\83N\82³\82ê\82½
482                                         me->AddEvent(WM_COMMAND,nID,0);
483                                 default:
484                                         break;
485                                 }
486                         }
487                         break;
488                 }
489         case WM_NOTIFY:
490                 {
491                         NMHDR* notify = (NMHDR*)lParam;
492                         switch(notify->code)
493                         {
494                         case NM_SETFOCUS:
495                                 {
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;
498                                         return 0;
499                                 }
500                         case TVN_SELCHANGED:
501                                 {
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);
505                                         return 0;
506                                 }
507                         case NM_DBLCLK:
508                                 {
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);
512                                         return 0;
513                                 }
514                         case LVN_COLUMNCLICK:
515                                 {
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);
519                                         if(addr){
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);
523                                         }
524                                         return 0;
525                                 }
526                         case LVN_ENDLABELEDIT:
527                                 {
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);
532                                         }
533                                         return 0;
534                                 }
535                         case LVN_KEYDOWN:
536                                 {
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);
542                                         }
543                                         else if(pnkd->wVKey == VK_DELETE){
544                                                 // \83f\83\8a\81[\83g
545                                                 me->AddEvent(WM_NOTIFY,pnkd->hdr.idFrom,VK_DELETE);
546                                         }
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);
551                                         }
552                                         return 0;
553                                 }
554                         case TVN_KEYDOWN:
555                                 {
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);
560                                         }
561                                         return 0;
562                                 }
563                         case NM_RCLICK:
564                                 {
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);
568                                         if(addr){
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é
571                                         }
572                                         me->AddEvent(WM_NOTIFY,lpnmh->idFrom,VK_RBUTTON);
573                                         return 0;
574                                 }
575                         default:
576                                 break;
577                         }
578                         break;
579                 }
580         case WM_CTLCOLORSTATIC:
581                 {
582                         HDC hdc = (HDC)wParam;
583                         ::SetBkColor(hdc,me->m_dwBackColor);
584                         ::SetTextColor(hdc,::GetSysColor(COLOR_WINDOWTEXT));
585                         return (LPARAM)me->m_hBkBrush;
586                 }
587         case WM_CTLCOLOREDIT:
588         case WM_CTLCOLORLISTBOX:
589         case WM_CTLCOLORMSGBOX:
590                 {
591                         if(me->m_pForm){
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();
597                         }
598                         break;
599                 }
600         case WM_SETCURSOR:
601                 {
602                         if(me->m_dWaitCursor > 0){
603                                 ::SetCursor(::LoadCursor(NULL,IDC_WAIT));
604                                 return true;
605                         }
606                         break;
607                 }
608         }
609         return ::DefWindowProc( hWnd, uMsg, wParam, lParam );
610 }
611
612 STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult)
613 {
614         SafeCreateWnd();
615
616         CComVariant ret;
617         ret = 0;
618
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();
626         }
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);
630         }
631         else{
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);
634         }
635         LeaveCriticalSection(&m_objEventDataProtection);
636
637         // \8eæ\82è\8fo\82µ\82½\83C\83x\83\93\83g\82Ì\8f\88\97\9d
638         if(pEv){
639                 // \95Ô\93\9a\83C\83x\83\93\83g\83R\81[\83h
640                 ret = pEv->GetMessage();
641                 //
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
645                         Fire_OnTimer();
646                         ClassObjectInvoke(L"OnTimer");
647                 }
648                 else{
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é
650                         if(m_pEvent){
651                                 // \8cÃ\82¢\83I\83u\83W\83F\83N\83g\82Ì\94j\8aü
652                                 m_pEvent->Release();
653                                 m_pEvent = NULL;
654                         }
655                         m_pEvent = pEv;
656                         m_pEvent->AddRef();
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())
662                         {
663                         case WM_KEYDOWN:
664                                 {
665                                         Fire_OnKeydown();
666                                         Fire_OnKeydownEx(pUnk);
667                                         ClassObjectInvoke(L"OnKeydown");
668                                         break;
669                                 }
670                         case WM_KEYDOWN_EX:
671                                 {
672                                         Fire_OnKeydown2();
673                                         Fire_OnKeydown2Ex(pUnk);
674                                         ClassObjectInvoke(L"OnKeydown2");
675                                         break;
676                                 }
677                         case WM_MOUSEMOVE:
678                                 {
679                                         Fire_OnMouseMove();
680                                         Fire_OnMouseMoveEx(pUnk);
681                                         ClassObjectInvoke(L"OnMouseMove");
682                                         break;
683                                 }
684                         case WM_LBUTTONDBLCLK:
685                                 {
686                                         Fire_OnDblClick();
687                                         Fire_OnDblClickEx(pUnk);
688                                         ClassObjectInvoke(L"OnDblClick");
689                                         break;
690                                 }
691                         case WM_LBUTTONDOWN:
692                                 {
693                                         Fire_OnClick();
694                                         Fire_OnClickEx(pUnk);
695                                         ClassObjectInvoke(L"OnClick");
696                                         break;
697                                 }
698                         case WM_RBUTTONDBLCLK:
699                                 {
700                                         Fire_OnRDblClick();
701                                         Fire_OnRDblClickEx(pUnk);
702                                         ClassObjectInvoke(L"OnRDblClick");
703                                         break;
704                                 }
705                         case WM_RBUTTONDOWN:
706                                 {
707                                         Fire_OnRClick();
708                                         Fire_OnRClickEx(pUnk);
709                                         ClassObjectInvoke(L"OnRClick");
710                                         break;
711                                 }
712                         case WM_LBUTTONUP:
713                                 {
714                                         Fire_OnClickOut();
715                                         Fire_OnClickOutEx(pUnk);
716                                         ClassObjectInvoke(L"OnClickOut");
717                                         break;
718                                 }
719                         case WM_RBUTTONUP:
720                                 {
721                                         Fire_OnRClickOut();
722                                         Fire_OnRClickOutEx(pUnk);
723                                         ClassObjectInvoke(L"OnRClickOut");
724                                         break;
725                                 }
726                         case WM_CAPTURECHANGED:
727                                 {
728                                         if(pEv->GetParam() == 1){
729                                                 Fire_OnClickCancel();
730                                                 Fire_OnClickCancelEx(pUnk);
731                                                 ClassObjectInvoke(L"OnClickCancel");
732                                         }
733                                         else{
734                                                 Fire_OnRClickCancel();
735                                                 Fire_OnRClickCancelEx(pUnk);
736                                                 ClassObjectInvoke(L"OnRClickCancel");
737                                         }
738                                         break;
739                                 }
740                         case WM_SIZE:
741                                 {
742                                         Fire_OnSize();
743                                         Fire_OnSizeEx(pUnk);
744                                         ClassObjectInvoke(L"OnSize");
745                                         break;
746                                 }
747                         case WM_COMMAND:
748                                 {
749                                         int nID = pEv->GetParam();
750                                         switch(nID)
751                                         {
752                                         case IDOK:
753                                                 if(m_bDefaultAction){
754                                                         m_bQuit = true;
755                                                 }
756                                                 m_dModalExitCode = IDOK;
757                                                 Fire_OnOK();
758                                                 Fire_OnOKEx(pUnk);
759                                                 ClassObjectInvoke(L"OnOK");
760                                                 break;
761                                         case IDCANCEL:
762                                                 if(m_bDefaultAction){
763                                                         m_bQuit = true;
764                                                 }
765                                                 m_dModalExitCode = IDCANCEL;
766                                                 Fire_OnCancel();
767                                                 Fire_OnCancelEx(pUnk);
768                                                 ClassObjectInvoke(L"OnCancel");
769                                                 break;
770                                         case IDABORT:
771                                                 m_bQuit = true;
772                                                 m_dModalExitCode = IDABORT;
773                                                 Fire_OnExit();
774                                                 Fire_OnExitEx(pUnk);
775                                                 ClassObjectInvoke(L"OnExit");
776                                                 break;
777                                         default:
778                                                 Fire_OnCommand();
779                                                 Fire_OnCommandEx(pUnk);
780                                                 ClassObjectInvoke(L"OnCommand");
781                                         }
782                                         // \8aÖ\98A\82Ã\82¯\82ç\82ê\82½\83R\83\93\83g\83\8d\81[\83\8b\82ª\82 \82é\82Ì\82©\81H
783                                         if(m_pForm){
784                                                 BSTR eventname = NULL;
785                                                 if(m_pForm->FindControlEventName(nID,&eventname)){
786                                                         if(SysStringLen(eventname) > 0){
787                                                                 ClassObjectInvoke(eventname);
788                                                         }
789                                                         SysFreeString(eventname);
790                                                 }
791                                         }
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);
799                                                 }
800                                         }
801                                         break;
802                                 }
803                         case WM_DROPFILES:
804                                 {
805                                         Fire_OnDropFiles();
806                                         Fire_OnDropFilesEx(pUnk);
807                                         ClassObjectInvoke(L"OnDropFiles");
808                                         break;
809                                 }
810                         case WM_NOTIFY:
811                                 {
812                                         switch(pEv->GetLParam())
813                                         {
814                                         case VK_DELETE:
815                                                 Fire_OnContextDelete();
816                                                 Fire_OnContextDeleteEx(pUnk);
817                                                 ClassObjectInvoke(L"OnContextDelete");
818                                                 break;
819                                         case VK_RBUTTON:
820                                                 Fire_OnContextMenu();
821                                                 Fire_OnContextMenuEx(pUnk);
822                                                 ClassObjectInvoke(L"OnContextMenu");
823                                                 break;
824                                         }
825                                         break;
826                                 }
827                         }
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é
829                         if(pUnk){
830                                 pUnk->Release();
831                         }
832                 }
833                 // \8f\88\97\9d\82³\82ê\82½\83C\83x\83\93\83g\82Í\89ð\95ú\82·\82é
834                 pEv->Release();
835         }
836         else{
837                 // \83C\83x\83\93\83g\82ª\82È\82¢\8fê\8d\87\82Í\83C\83x\83\93\83g\82Ì\83N\83\8a\83A
838                 if(m_pEvent){
839                         // \8cÃ\82¢\83I\83u\83W\83F\83N\83g\82Ì\94j\8aü
840                         m_pEvent->Release();
841                         m_pEvent = NULL;
842                 }
843         }
844         // \83C\83x\83\93\83g\83R\81[\83h\82ð\96ß\82·\81B
845         ret.Detach(varResult);
846         return S_OK;
847 }
848
849 void COverlappedWindow::AddEventSingle(int message, WPARAM wParam, LPARAM lParam)
850 {
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
852         BOOL bFind = false;
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){
857                         bFind = true;
858                         break;
859                 }
860                 p++;
861         }
862         LeaveCriticalSection(&m_objEventDataProtection);
863         if(!bFind){
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);
866         }
867 }
868
869 void COverlappedWindow::AddEvent(int message,WPARAM wParam,LPARAM lParam)
870 {
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é
872         POINT pt,lp;
873         DWORD pos = GetMessagePos();
874         pt.x = LOWORD(pos);
875         pt.y = HIWORD(pos);
876         lp.x = lp.y = 0;
877         if(m_hPopupWnd){
878                 ::ScreenToClient(m_hPopupWnd,&pt);
879                 // \8dÀ\95W\8cn\82Ì\95Ï\8a·
880                 lp = pt;
881                 HDC hdc = ::GetDC(m_hPopupWnd);
882                 POINT org;
883                 RECT rct;
884                 ::GetClientRect(m_hPopupWnd,&rct);
885                 ::SetViewportOrgEx(hdc,0,rct.bottom,&org);
886                 int md = ::GetMapMode(hdc);
887                 ::SetMapMode(hdc,MM_LOMETRIC);
888                 ::DPtoLP(hdc,&lp,1);
889                 ::SetMapMode(hdc,md);
890                 ::SetViewportOrgEx(hdc,org.x,org.y,NULL);
891                 ::ReleaseDC(m_hPopupWnd,hdc);
892         }
893
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){
898                 pEvent->AddRef();
899                 pEvent->SetData(message,wParam,lParam,pt,lp);
900                 m_lstEvent.push_back(pEvent);
901         }
902         LeaveCriticalSection(&m_objEventDataProtection);
903
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);
906
907         if(windowParam.automessageloop){
908                 // \82½\82¾\82¿\82É\83C\83x\83\93\83g\8f\88\97\9d\82ð\8ds\82¤
909                 CComVariant tmp;
910                 DoEvent(&tmp);
911         }
912 }
913
914
915 STDMETHODIMP COverlappedWindow::Draw()
916 {
917         // \95`\89æ\82·\82é
918         if(m_hPopupWnd){
919                 ::InvalidateRect(m_hPopupWnd,NULL,true);
920                 ::UpdateWindow(m_hPopupWnd);
921         }
922         return S_OK;
923 }
924
925
926 STDMETHODIMP COverlappedWindow::get_IsEventEmpty(BOOL *pVal)
927 {
928         // \83C\83x\83\93\83g\82ª\8bó\82È\82çtrue
929         *pVal = m_lstEvent.empty()?VB_TRUE:VB_FALSE;
930         return S_OK;
931 }
932
933 STDMETHODIMP COverlappedWindow::Open(VARIANT caption,VARIANT* pvarUnk)
934 {
935         SafeCreateWnd();
936         CComVariant tmp;
937         if((caption.vt != VT_ERROR && caption.vt != VT_NULL) && tmp.ChangeType(VT_BSTR,&caption) == S_OK){
938                 put_Caption(tmp.bstrVal);
939         }
940         put_Enable(true);
941         put_Visible(true);
942         m_bQuit          = false;
943         m_dModalExitCode = 0;     // \83\82\81[\83_\83\8b\95Ô\93\9a\83R\81[\83h
944         CreateThisInterface(pvarUnk);
945         return S_OK;
946 }
947
948 STDMETHODIMP COverlappedWindow::Close()
949 {
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()){
953                 (*pWnd)->Close();
954                 pWnd++;
955         }
956         // \82±\82Ì\83E\83B\83\93\83h\83E\82ð\94ñ\95\\8e¦\82É\82·\82é
957         put_Visible(false);
958         m_bQuit = true;
959
960         // \83N\83\89\83X\83I\83u\83W\83F\83N\83g\82Ì\95ú\8aü
961         if(     m_pClassDisp && m_bAutoReleaseClassObject){
962                 m_pClassDisp->Release();
963                 m_pClassDisp = NULL;
964         }
965
966         // \83t\83H\81[\83J\83X\82ð\88Ú\93®\82·\82é
967         if(m_hParentWnd){
968                 ::SetActiveWindow(m_hParentWnd);
969                 ::SetFocus(m_hParentWnd);
970         }
971         else{
972                 MoveNextOverlapped();
973         }
974         return S_OK;
975 }
976
977 STDMETHODIMP COverlappedWindow::get_DoubleBuffer(BOOL *pVal)
978 {
979         *pVal = windowParam.doublebuffer?VB_TRUE:VB_FALSE;
980         return S_OK;
981 }
982
983 STDMETHODIMP COverlappedWindow::put_DoubleBuffer(BOOL newVal)
984 {
985         windowParam.doublebuffer = newVal;
986         return S_OK;
987 }
988
989
990 STDMETHODIMP COverlappedWindow::get_TopMost(BOOL *pVal)
991 {
992         SafeCreateWnd();
993         DWORD exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
994         *pVal = (exstyle & WS_EX_TOPMOST)?VB_TRUE:VB_FALSE;
995         return S_OK;
996 }
997
998 STDMETHODIMP COverlappedWindow::put_TopMost(BOOL newVal)
999 {
1000         SafeCreateWnd();
1001         ::SetWindowPos(m_hPopupWnd,newVal?HWND_TOPMOST:HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
1002         return S_OK;
1003 }
1004
1005 STDMETHODIMP COverlappedWindow::get_PosX(short *pVal)
1006 {
1007         if(m_hPopupWnd){
1008                 WINDOWPLACEMENT pls = {0};
1009                 pls.length = sizeof(WINDOWPLACEMENT);
1010                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1011                 windowParam.posX = (int)pls.rcNormalPosition.left;
1012         }
1013         *pVal = windowParam.posX;
1014         return S_OK;
1015 }
1016
1017 STDMETHODIMP COverlappedWindow::put_PosX(short newVal)
1018 {
1019         windowParam.posX = newVal;
1020         if(m_hPopupWnd){
1021                 WINDOWPLACEMENT pls = {0};
1022                 pls.length = sizeof(WINDOWPLACEMENT);
1023                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1024                 ::SetWindowPos(m_hPopupWnd,NULL,
1025                         windowParam.posX,
1026                         pls.rcNormalPosition.top,
1027                         0,0,SWP_NOZORDER|SWP_NOSIZE);
1028         }
1029         return S_OK;
1030 }
1031
1032 STDMETHODIMP COverlappedWindow::get_PosY(short *pVal)
1033 {
1034         if(m_hPopupWnd){
1035                 WINDOWPLACEMENT pls = {0};
1036                 pls.length = sizeof(WINDOWPLACEMENT);
1037                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1038                 windowParam.posY = (int)pls.rcNormalPosition.top;
1039         }
1040         *pVal = windowParam.posY;
1041         return S_OK;
1042 }
1043
1044 STDMETHODIMP COverlappedWindow::put_PosY(short newVal)
1045 {
1046         windowParam.posY = newVal;
1047         if(m_hPopupWnd){
1048                 WINDOWPLACEMENT pls = {0};
1049                 pls.length = sizeof(WINDOWPLACEMENT);
1050                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1051                 ::SetWindowPos(m_hPopupWnd,NULL,
1052                         pls.rcNormalPosition.left,
1053                         windowParam.posY,
1054                         0,0,SWP_NOZORDER|SWP_NOSIZE);
1055         }
1056         return S_OK;
1057 }
1058
1059 STDMETHODIMP COverlappedWindow::get_Width(short *pVal)
1060 {
1061         if(m_hPopupWnd){
1062                 WINDOWPLACEMENT pls = {0};
1063                 pls.length = sizeof(WINDOWPLACEMENT);
1064                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1065                 windowParam.width = (int)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1066         }
1067         *pVal = windowParam.width;
1068         return S_OK;
1069 }
1070
1071 STDMETHODIMP COverlappedWindow::put_Width(short newVal)
1072 {
1073         windowParam.width = newVal;
1074         if(m_hPopupWnd){
1075                 WINDOWPLACEMENT pls = {0};
1076                 pls.length = sizeof(WINDOWPLACEMENT);
1077                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1078                 ::SetWindowPos(m_hPopupWnd,NULL,
1079                         0,0,
1080                         windowParam.width,
1081                         pls.rcNormalPosition.bottom - pls.rcNormalPosition.top,SWP_NOZORDER|SWP_NOMOVE);
1082         }
1083         if(m_pForm){
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);
1086         }
1087         return S_OK;
1088 }
1089
1090 STDMETHODIMP COverlappedWindow::get_Height(short *pVal)
1091 {
1092         if(m_hPopupWnd){
1093                 WINDOWPLACEMENT pls = {0};
1094                 pls.length = sizeof(WINDOWPLACEMENT);
1095                 ::GetWindowPlacement(m_hPopupWnd,&pls);
1096                 windowParam.height = (short)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
1097         }
1098         *pVal = windowParam.height;
1099         return S_OK;
1100 }
1101
1102 STDMETHODIMP COverlappedWindow::put_Height(short newVal)
1103 {
1104         windowParam.height = newVal;
1105         if(m_hPopupWnd){
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,
1111                         windowParam.height,
1112                         SWP_NOZORDER|SWP_NOMOVE);
1113         }
1114         if(m_pForm){
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);
1117         }
1118         return S_OK;
1119 }
1120
1121 STDMETHODIMP COverlappedWindow::get_AcceptFiles(BOOL *pVal)
1122 {
1123         SafeCreateWnd();
1124         DWORD exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
1125         *pVal = (exstyle & WS_EX_ACCEPTFILES)?VB_TRUE:VB_FALSE;
1126         return S_OK;
1127 }
1128
1129 STDMETHODIMP COverlappedWindow::put_AcceptFiles(BOOL newVal)
1130 {
1131         SafeCreateWnd();
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);
1136         return S_OK;
1137 }
1138
1139 STDMETHODIMP COverlappedWindow::SetForegroundWindow()
1140 {
1141         SafeCreateWnd();
1142         ::SetForegroundWindow(m_hPopupWnd);
1143         return S_OK;
1144 }
1145
1146 STDMETHODIMP COverlappedWindow::SetFocus()
1147 {
1148         SafeCreateWnd();
1149         ::SetFocus(m_hPopupWnd);
1150         return S_OK;
1151 }
1152
1153 STDMETHODIMP COverlappedWindow::get_Enable(BOOL *pVal)
1154 {
1155         SafeCreateWnd();
1156         *pVal = ::IsWindowEnabled(m_hPopupWnd)?VB_TRUE:VB_FALSE;
1157         return S_OK;
1158 }
1159
1160 STDMETHODIMP COverlappedWindow::put_Enable(BOOL newVal)
1161 {
1162         SafeCreateWnd();
1163         ::EnableWindow(m_hPopupWnd,newVal);
1164         if(m_pForm){
1165                 m_pForm->EnableAllControl(newVal);
1166                 ::SetActiveWindow(m_hPopupWnd);
1167         }
1168         return S_OK;
1169 }
1170
1171
1172 STDMETHODIMP COverlappedWindow::get_Iconic(BOOL *pVal)
1173 {
1174         SafeCreateWnd();
1175         *pVal = ::IsIconic(m_hPopupWnd)?VB_TRUE:VB_FALSE;
1176         return S_OK;
1177 }
1178
1179 STDMETHODIMP COverlappedWindow::put_Iconic(BOOL newVal)
1180 {
1181         SafeCreateWnd();
1182         ::ShowWindow(m_hPopupWnd,newVal?SW_MINIMIZE:SW_SHOWNORMAL);
1183         return S_OK;
1184 }
1185
1186
1187 STDMETHODIMP COverlappedWindow::get_Zoomed(BOOL *pVal)
1188 {
1189         SafeCreateWnd();
1190         *pVal = ::IsZoomed(m_hPopupWnd)?VB_TRUE:VB_FALSE;
1191         return S_OK;
1192 }
1193
1194 STDMETHODIMP COverlappedWindow::put_Zoomed(BOOL newVal)
1195 {
1196         SafeCreateWnd();
1197         ::ShowWindow(m_hPopupWnd,newVal?SW_SHOWMAXIMIZED:SW_SHOWNORMAL);
1198         return S_OK;
1199 }
1200
1201 STDMETHODIMP COverlappedWindow::get_Visible(BOOL *pVal)
1202 {
1203         *pVal = VB_FALSE;
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;
1208         }
1209         return S_OK;
1210 }
1211
1212 STDMETHODIMP COverlappedWindow::put_Visible(BOOL newVal)
1213 {
1214         if(!newVal && !::IsWindow(m_hPopupWnd)){
1215                 // FALSE\82È\82ç\81A\82 \82¦\82Ä\8dì\90¬\82Í\8e\8e\82Ý\82È\82¢
1216                 return S_OK;
1217         }
1218         SafeCreateWnd();
1219         ::ShowWindow(m_hPopupWnd,newVal?SW_SHOWNORMAL:SW_HIDE);
1220         ::SetActiveWindow(m_hPopupWnd);
1221         return S_OK;
1222 }
1223
1224 STDMETHODIMP COverlappedWindow::WaitEvent(VARIANT varTim,BOOL* pRet)
1225 {
1226         SafeCreateWnd();
1227         *pRet = false;
1228
1229         // \91Ò\8b@\8e\9e\8aÔ\82Ì\8eæ\93¾
1230         DWORD sleeptim = 1000;
1231         CComVariant tim;
1232         if(tim.ChangeType(VT_I4,&varTim) == S_OK){
1233                 sleeptim = (DWORD)tim.lVal;
1234         }
1235         if(sleeptim == 0){
1236                 sleeptim = INFINITE;
1237         }
1238
1239         HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = { NULL };
1240         HWND   hWnd  [MAXIMUM_WAIT_OBJECTS] = { NULL };
1241         int cnt = 0;
1242         SetWaitParam(&cnt,hWnd,hEvent);
1243         *pRet = MessageLoop(sleeptim,cnt,hWnd,hEvent)?VB_TRUE:VB_FALSE;
1244
1245         return S_OK;
1246 }
1247
1248 STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt)
1249 {
1250         SafeCreateWnd();
1251         HRESULT hRet = S_OK;
1252         CComVariant tmp;
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);
1257                 pBuf[cnt - 1] = 0;
1258                 // \8cÃ\82¢\83\81\83j\83\85\81[\82ð\94j\8aü\82·\82é
1259                 if(m_hMenu){
1260                         m_cMenuMap.clear();
1261                         ::SetMenu(m_hPopupWnd,NULL);
1262                         DestroyMenu(m_hMenu);
1263                         m_hMenu = NULL;
1264                 }
1265                 if(cnt > 1){
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];
1270                         LPSTR p = pBuf;
1271                         HMENU hPopupMenu = NULL;
1272                         int lv1 = 0;
1273                         int lv2 = 0;
1274                         int cmd = 0;
1275                         while(*p){
1276                                 while(*p == ' ' || *p == '\t')p++; // \83u\83\89\83\93\83N\83X\83L\83b\83v
1277                                 if(*p == '/'){
1278                                         p++;
1279                                         // \83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\82Ì\8dì\90¬
1280                                         if(hPopupMenu){
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);
1289                                         }
1290                                         lv1++;
1291                                         lv2 = 0;
1292                                         cmd = 0;
1293                                         hPopupMenu = CreatePopupMenu();
1294                                         LPSTR d = p;
1295                                         while(*p && *p != ',' && *p != '/' && *p != ':'){
1296                                                 p = CharNext(p);
1297                                         }
1298                                         ZeroMemory(szSubmenu,MAX_PATH);
1299                                         CopyMemory(szSubmenu,d,p-d);
1300                                         if(*p == ',' || *p == ':'){
1301                                                 p++;
1302                                         }
1303                                 }
1304                                 else{
1305                                         // \83\81\83j\83\85\81[\82Ì\8dì\90¬
1306                                         if(hPopupMenu){
1307                                                 LPSTR d = p;
1308                                                 while(*p && *p != ',' && *p != '/' && *p != ':'){
1309                                                         p = CharNext(p);
1310                                                 }
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é
1314                                                 _bstr_t eventname;
1315                                                 LPSTR findcmd = strchr(menuname,'@');
1316                                                 if(findcmd){
1317                                                         *findcmd = 0;
1318                                                         eventname = (LPCSTR)(findcmd + 1);
1319                                                 }
1320                                                 else{
1321                                                         CHAR tmp[64];
1322                                                         wsprintf(tmp,"OnMenu%d",lv1*100+cmd);
1323                                                         eventname = tmp;
1324                                                 }
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);
1334                                                 lv2++;
1335                                                 cmd++;
1336                                                 // \83Z\83p\83\8c\81[\83^\81[\82Ì\8ew\92è\82©?
1337                                                 if(*p == ','){
1338                                                         p++;
1339                                                 }
1340                                                 else if(*p == ':'){
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);
1346                                                         p++;
1347                                                         lv2++;
1348                                                 }
1349                                         }
1350                                 }
1351                         }
1352                         // \96¢\91}\93ü\82Ì\83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\82Ì\91}\93ü
1353                         if(hPopupMenu){
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);
1362                         }
1363                         ::SetMenu(m_hPopupWnd,m_hMenu);
1364                 }
1365                 delete[]pBuf;
1366         }
1367         return hRet;
1368 }
1369
1370 STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd,VARIANT* pRet)
1371 {
1372         SafeCreateWnd();
1373         CComVariant varCmd;
1374         CComVariant varText;
1375         CComVariant varRet;
1376         varRet = 0;
1377
1378         int nCommand = 0;
1379         if(varCmd.ChangeType(VT_I2,&cmd) == S_OK){
1380                 nCommand = varCmd.iVal;
1381         }
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);
1387                 pBuf[cnt - 1] = 0;
1388                 LPSTR p = pBuf;
1389                 int lv = 0;
1390                 int cmd = 0;
1391                 HMENU hPopupMenu = CreatePopupMenu();
1392                 while(*p){
1393                         LPSTR d = p;
1394                         while(*p == ' ' || *p == '\t'){
1395                                 p++;
1396                         }
1397                         while(*p && *p != ',' && *p != '/' && *p != ':'){
1398                                 p = CharNext(p);
1399                         }
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;
1406                         if(nCommand != 0){
1407                                 inf.wID    = nCommand + cmd;
1408                         }
1409                         else{
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;
1413                         }
1414                         inf.dwTypeData = menuname;
1415                         InsertMenuItem(hPopupMenu,lv,true,&inf);
1416                         lv++;
1417                         cmd++;
1418                         if(*p == ',' || *p == '/'){
1419                                 p++;
1420                         }
1421                         else if(*p == ':'){
1422                                 inf.fMask  = MIIM_TYPE;
1423                                 inf.fType  = MFT_SEPARATOR;
1424                                 InsertMenuItem(hPopupMenu,lv,true,&inf);
1425                                 p++;
1426                                 lv++;
1427                         }
1428                 }
1429                 delete[]pBuf;
1430                 // TrackPopupMene
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);
1438         }
1439         varRet.Detach(pRet);
1440         return S_OK;
1441 }
1442
1443 STDMETHODIMP COverlappedWindow::get_HWND(long *pVal)
1444 {
1445         *pVal = (LONG)m_hPopupWnd;
1446         return S_OK;
1447 }
1448
1449 STDMETHODIMP COverlappedWindow::GetSysColor(VARIANT typ, VARIANT *col)
1450 {
1451         // \83V\83X\83e\83\80\83J\83\89\81[\82Ì\8eæ\93¾
1452         CComVariant varType;
1453         CComVariant varRet;
1454         varType.ChangeType(VT_I2,&typ);
1455         varRet = (long)::GetSysColor(varType.iVal);
1456         varRet.Detach(col);
1457         return S_OK;
1458 }
1459
1460 STDMETHODIMP COverlappedWindow::SetTimer(VARIANT tim,BOOL* pVal)
1461 {
1462         SafeCreateWnd();
1463
1464         CComVariant varTim;
1465         long timer = 0;
1466         if(varTim.ChangeType(VT_I4,&tim) == S_OK){
1467                 timer = varTim.lVal;
1468         }
1469         if(timer){
1470                 *pVal = ::SetTimer(m_hPopupWnd,1,timer,NULL)?VB_TRUE:VB_FALSE;
1471         }
1472         else{
1473                 *pVal = ::KillTimer(m_hPopupWnd,1)?VB_TRUE:VB_FALSE;
1474         }
1475         return S_OK;
1476 }
1477
1478
1479 STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode)
1480 {
1481         SafeCreateWnd();
1482         if(!m_hMenu){
1483                 ErrorInfo(IDS_ERR_NOCREATEMENU);
1484                 return DISP_E_EXCEPTION;
1485         }
1486         int nCmd = 0;
1487         int nMode = 0;
1488         CComVariant varCmd,varMode;
1489         if(varCmd.ChangeType(VT_I2,&cmd) == S_OK){
1490                 nCmd = varCmd.iVal;
1491         }
1492         if(varMode.ChangeType(VT_I2,&mode) == S_OK){
1493                 nMode = varMode.iVal;
1494         }
1495         if(nCmd >= 100){
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);
1502         }
1503         return S_OK;
1504 }
1505
1506 STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode)
1507 {
1508         SafeCreateWnd();
1509         if(!m_hMenu){
1510                 ErrorInfo(IDS_ERR_NOCREATEMENU);
1511                 return DISP_E_EXCEPTION;
1512         }
1513         int nCmd = 0;
1514         int nMode = 0;
1515         CComVariant varCmd,varMode;
1516         if(varCmd.ChangeType(VT_I2,&cmd) == S_OK){
1517                 nCmd = varCmd.iVal;
1518         }
1519         if(varMode.ChangeType(VT_I2,&mode) == S_OK){
1520                 nMode = varMode.iVal;
1521         }
1522         if(nCmd >= 100){
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);
1529         }
1530         return S_OK;
1531 }
1532
1533 STDMETHODIMP COverlappedWindow::get_CreateNoCloseWindow(BOOL *pVal)
1534 {
1535         // \83N\83\8d\81[\83Y\8bÖ\8e~\83E\83B\83\93\83h\83E?
1536         *pVal = windowParam.noclose?VB_TRUE:VB_FALSE;
1537         return S_OK;
1538 }
1539
1540 STDMETHODIMP COverlappedWindow::put_CreateNoCloseWindow(BOOL newVal)
1541 {
1542         if(m_hPopupWnd){
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;
1546         }
1547         windowParam.noclose = newVal;
1548         return S_OK;
1549 }
1550
1551 STDMETHODIMP COverlappedWindow::get_Canvas(VARIANT *pVal)
1552 {
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;
1556         if(m_pCanvas &&
1557                 m_pCanvas->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1558                 pVal->vt      = VT_UNKNOWN;
1559                 pVal->punkVal = pUnk;
1560         }
1561         return S_OK;
1562 }
1563
1564 STDMETHODIMP COverlappedWindow::get_Event(VARIANT *pVal)
1565 {
1566         ::VariantInit(pVal);
1567         if(m_pEvent){
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;
1573                 }
1574         }
1575         return S_OK;
1576 }
1577
1578 STDMETHODIMP COverlappedWindow::get_DropFiles(VARIANT *pVal)
1579 {
1580         m_dropfiles.GetPathArray(pVal);
1581         return S_OK;
1582 }
1583
1584 STDMETHODIMP COverlappedWindow::get_Quit(BOOL *pVal)
1585 {
1586         *pVal = m_bQuit?VB_TRUE:VB_FALSE;
1587         return S_OK;
1588 }
1589
1590 STDMETHODIMP COverlappedWindow::put_Quit(BOOL newVal)
1591 {
1592         m_bQuit = newVal;
1593         if(m_hPopupWnd){
1594                 // \83C\83x\83\93\83g\82ð\94­\90\82³\82¹\91Ò\8b@\8fó\91Ô\82ð\89ð\82­
1595                 SetEvent(m_hWaitEvent);
1596         }
1597         return S_OK;
1598 }
1599
1600 STDMETHODIMP COverlappedWindow::get_Form(VARIANT *pVal)
1601 {
1602         // \83t\83H\81[\83\80\82Ì\8cö\8aJ
1603         ::VariantInit(pVal);
1604         if(m_pForm){
1605                 IUnknown* pUnk = NULL;
1606                 if(m_pForm->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
1607                         pVal->vt      = VT_UNKNOWN;
1608                         pVal->punkVal = pUnk;
1609                 }
1610         }
1611         return S_OK;
1612 }
1613
1614 STDMETHODIMP COverlappedWindow::get_Style(long *pVal)
1615 {
1616         if(m_hPopupWnd){
1617                 windowParam.style = ::GetWindowLong(m_hPopupWnd,GWL_STYLE);
1618         }
1619         *pVal = (long)windowParam.style;
1620         return S_OK;
1621 }
1622
1623 STDMETHODIMP COverlappedWindow::put_Style(long newVal)
1624 {
1625         windowParam.style = (DWORD)newVal;
1626         if(m_hPopupWnd){
1627                 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.style);
1628         }
1629         return S_OK;
1630 }
1631
1632 STDMETHODIMP COverlappedWindow::get_Exstyle(long *pVal)
1633 {
1634         if(m_hPopupWnd){
1635                 windowParam.exstyle = ::GetWindowLong(m_hPopupWnd,GWL_EXSTYLE);
1636         }
1637         *pVal = (long)windowParam.exstyle;
1638         return S_OK;
1639 }
1640
1641 STDMETHODIMP COverlappedWindow::put_Exstyle(long newVal)
1642 {
1643         windowParam.exstyle = (DWORD)newVal;
1644         if(m_hPopupWnd){
1645                 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.exstyle);
1646         }
1647         return S_OK;
1648 }
1649
1650 STDMETHODIMP COverlappedWindow::get_WindowClassName(BSTR *pVal)
1651 {
1652         WCHAR wmes[MAX_PATH];
1653         MultiByteToWideChar(GetACP(),0,windowParam.szClassName,-1,wmes,MAX_PATH);
1654         *pVal = SysAllocString(wmes);
1655         return S_OK;
1656 }
1657
1658 STDMETHODIMP COverlappedWindow::Refresh()
1659 {
1660         if(m_hPopupWnd){
1661                 ::SetWindowPos(m_hPopupWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_NOCOPYBITS);
1662         }
1663         return S_OK;
1664 }
1665
1666 void COverlappedWindow::SetTitle()
1667 {
1668         if(!m_hPopupWnd){
1669                 return;
1670         }
1671         TCHAR szTitle[MAX_PATH] = {0};
1672         WideCharToMultiByte(GetACP(),0,m_bstrCaption,-1,szTitle,MAX_PATH,NULL,NULL);
1673         ::SetWindowText(m_hPopupWnd,szTitle);
1674 }
1675
1676 STDMETHODIMP COverlappedWindow::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VARIANT h, VARIANT *pvarUnk)
1677 {
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;
1684         }
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;
1688         }
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;
1692         }
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;
1696         }
1697         // \83E\83B\83\93\83h\83E\82ª\95\\8e¦\82³\82ê\82Ä\82¢\82ê\82Î\82½\82¾\82¿\82É\94½\89f
1698         if(m_hPopupWnd){
1699                 ::SetWindowPos(m_hPopupWnd,NULL,windowParam.posX,windowParam.posY,windowParam.width,windowParam.height,flag);
1700         }
1701         if(m_pForm){
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);
1704         }
1705         CreateThisInterface(pvarUnk);
1706         return S_OK;
1707 }
1708
1709 void COverlappedWindow::CreateThisInterface(VARIANT* pvarUnk)
1710 {
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;
1717         }
1718 }
1719
1720 STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT caption_system, VARIANT maxmin, VARIANT *pvarUnk)
1721 {
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;
1726         }
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);
1731         }
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);
1736         }
1737         if(m_hPopupWnd){
1738                 ::SetWindowLong(m_hPopupWnd,GWL_STYLE,windowParam.GetStyle());
1739                 Refresh();
1740         }
1741         CreateThisInterface(pvarUnk);
1742         return S_OK;
1743 }
1744
1745 STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
1746 {
1747         SafeCreateWnd();
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);
1757                         if(!bVisible){
1758                                 // \95\\8e¦\82³\82ê\82Ä\82¢\82È\82¯\82ê\82Î\8fÁ\82µ\82Ä\82æ\82µ\81B
1759                                 (*p)->Release();
1760                                 p = m_lstChild.erase(p);
1761                                 continue;
1762                         }
1763                 }
1764                 p++;
1765         }
1766         //
1767         CComObject<COverlappedWindow>* pChild = NULL;
1768         if(pChild->CreateInstance(&pChild) == S_OK){
1769                 pChild->AddRef();
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;
1778                 }
1779         }
1780         return S_OK;
1781 }
1782
1783 void COverlappedWindow::SetParent(HWND hParent)
1784 {
1785         m_hParentWnd = hParent;
1786 }
1787
1788 HANDLE COverlappedWindow::GetEventHandle()
1789 {
1790         return m_hWaitEvent;
1791 }
1792
1793 void COverlappedWindow::SetWaitParam(int *count, HWND *hWnd, HANDLE *hEvent)
1794 {
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;
1800                 (*count)++;
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);
1806                         p++;
1807                 }
1808         }
1809 }
1810
1811 DWORD COverlappedWindow::MessageLoop(DWORD sleeptim,int cnt, HWND *hWnd, HANDLE* hEvent)
1812 {
1813         // \83\81\83b\83Z\81[\83W\83\8b\81[\83v\82ð\8f\88\97\9d\82·\82é
1814         DWORD ret = 0;
1815         DWORD retWait = MsgWaitForMultipleObjects(cnt,hEvent,false,sleeptim,QS_ALLEVENTS|QS_ALLINPUT);
1816
1817         if(retWait != WAIT_TIMEOUT){
1818                 ret = 0;
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;
1822                 }
1823                 //
1824                 MSG msg;
1825                 while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)){
1826                         BOOL bTranslated = false;
1827                         HWND hOwner      = NULL;
1828                         if(msg.hwnd){
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){
1832                                         int i;
1833                                         for(i=0 ; i<cnt && hWnd[i]  ; i++){
1834                                                 if(hParent == hWnd[i]){
1835                                                         hOwner = hWnd[i];
1836                                                         break;
1837                                                 }
1838                                         }
1839                                         hParent = ::GetParent(hParent);
1840                                 }
1841                         }
1842                         if(hOwner){
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);
1847                                         bTranslated = true;
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){
1852                                                 // TAB = MOVE FOCUS 
1853                                                 if(!bCtrl){
1854                                                         HWND hNextFocus = ::GetNextDlgTabItem(hOwner,GetFocus(),bShift);
1855                                                         if(hNextFocus){
1856                                                                 ::SetFocus(hNextFocus);
1857                                                         }
1858                                                 }
1859                                                 bTranslatedDlg = true;
1860                                         }
1861                                         else if(msg.wParam == VK_F6){
1862                                                 // ESCAPE = CANCEL
1863                                                 SendMessage(hOwner,WM_MOVENEXT_OVERLAPPED,0,0);
1864                                                 bTranslatedDlg = true;
1865                                         }
1866                                 }
1867                                 if(!bTranslatedDlg){
1868                                         bTranslated |= ::IsDialogMessage(hOwner,&msg);
1869                                 }
1870                         }
1871                         if(!bTranslated){
1872                                 ::TranslateMessage( &msg );
1873                                 ::DispatchMessage( &msg );
1874                         }
1875                 }
1876         }
1877         return ret;
1878 }
1879
1880 STDMETHODIMP COverlappedWindow::get_AutoMessageLoop(BOOL *pVal)
1881 {
1882         *pVal = windowParam.automessageloop?VB_TRUE:VB_FALSE;
1883         return S_OK;
1884 }
1885
1886 STDMETHODIMP COverlappedWindow::put_AutoMessageLoop(BOOL newVal)
1887 {
1888         windowParam.automessageloop = newVal;
1889         return S_OK;
1890 }
1891
1892 STDMETHODIMP COverlappedWindow::DoModal(VARIANT* pRetCode)
1893 {
1894         CComVariant dmy,retdmy;
1895         dmy.vt    = VT_ERROR;
1896         dmy.scode = DISP_E_PARAMNOTFOUND;
1897         Open(dmy,&retdmy);
1898
1899         CComVariant tim = (short)1000;
1900         BOOL ret;
1901         while(!m_bQuit && ::IsWindow(m_hPopupWnd)){
1902                 WaitEvent(tim,&ret);
1903                 if(ret){
1904                         DoEvent(&dmy);
1905                 }
1906         }
1907         Close();
1908
1909         ::VariantInit(pRetCode);
1910         pRetCode->vt   = VT_I2;
1911         pRetCode->iVal = m_dModalExitCode;
1912         return S_OK;
1913 }
1914
1915 STDMETHODIMP COverlappedWindow::get_AutoClose(BOOL *pVal)
1916 {
1917         *pVal = windowParam.autoclose?VB_TRUE:VB_FALSE;
1918         return S_OK;
1919 }
1920
1921 STDMETHODIMP COverlappedWindow::put_AutoClose(BOOL newVal)
1922 {
1923         windowParam.autoclose = newVal;
1924         return S_OK;
1925 }
1926
1927 void COverlappedWindow::CreateWindowList(list<HWND>& lstWnd,BOOL bSearchRoot)
1928 {
1929         HWND* hWnds = NULL;
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);
1933                 if(pParent){
1934                         pParent->CreateWindowList(lstWnd,true);
1935                 }
1936         }
1937         else{
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);
1944                 }
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é
1947                         HWND hWnd = NULL;
1948                         (*p)->get_HWND((long*)&hWnd);
1949                         if(hWnd && ::IsWindow(hWnd)){
1950                                 (*p)->CreateWindowList(lstWnd,false);
1951                         }
1952                         p++;
1953                 }
1954         }
1955 }
1956
1957 void COverlappedWindow::MoveNextOverlapped()
1958 {
1959         // \8f\87\8f\98\83\8a\83X\83g\82Ì\90\90¬\82ð\88Ë\97\8a\82·\82é
1960         list<HWND>lstWnd;
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()){
1966                 // \97ñ\8b\93
1967                 if(hActiveWnd == *p){
1968                         // \83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ð\94­\8c©\82µ\82½
1969                         p++;
1970                         HWND hNext = lstWnd.front();
1971                         if(p != lstWnd.end()){
1972                                 hNext = *p;
1973                         }
1974 //                      ::SetActiveWindow(hNext);
1975                         ::SetFocus(hNext);
1976                         break;
1977                 }
1978                 p++;
1979         }
1980 }
1981
1982 STDMETHODIMP COverlappedWindow::get_Object(VARIANT idx, VARIANT *pVal)
1983 {
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));
1988         return S_OK;
1989 }
1990
1991
1992 STDMETHODIMP COverlappedWindow::get_ExitCode(short *pVal)
1993 {
1994         *pVal = (short)m_dModalExitCode;
1995         return S_OK;
1996 }
1997
1998 STDMETHODIMP COverlappedWindow::put_ExitCode(short newVal)
1999 {
2000         m_dModalExitCode = newVal;
2001         return S_OK;
2002 }
2003
2004 STDMETHODIMP COverlappedWindow::get_WaitCursor(short *pVal)
2005 {
2006         *pVal = (short)m_dWaitCursor;
2007         return S_OK;
2008 }
2009
2010 STDMETHODIMP COverlappedWindow::put_WaitCursor(short newVal)
2011 {
2012         m_dWaitCursor = newVal;
2013         if(m_hPopupWnd){
2014                 ::SendMessage(m_hPopupWnd,WM_SETCURSOR,(WPARAM)m_hPopupWnd,0);
2015         }
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);
2020                 pWnd++;
2021         }
2022         return S_OK;
2023 }
2024
2025 STDMETHODIMP COverlappedWindow::LoadIcon(VARIANT text)
2026 {
2027         CHAR szPath[MAX_PATH];
2028         CComVariant varText;
2029         if(varText.ChangeType(VT_BSTR,&text) != S_OK){
2030                 return DISP_E_TYPEMISMATCH;
2031         }
2032         WideCharToMultiByte(GetACP(),0,varText.bstrVal,-1,szPath,MAX_PATH,NULL,NULL);
2033         if(m_hIcon){
2034                 DestroyIcon(m_hIcon);
2035                 m_hIcon = NULL;
2036         }
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);
2042         }
2043         return S_OK;
2044 }
2045
2046 STDMETHODIMP COverlappedWindow::CenterWindow()
2047 {
2048         SafeCreateWnd();
2049         RECT rct;
2050         if(m_hParentWnd){
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);
2053         }
2054         else{
2055                 HWND hwnd = ::GetDesktopWindow();
2056                 if(!hwnd){
2057                         return S_OK;
2058                 }
2059                 ::GetWindowRect(hwnd,&rct);
2060         }
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);
2070         return S_OK;
2071 }
2072
2073 STDMETHODIMP COverlappedWindow::get_ClassObject(VARIANT* pVal)
2074 {
2075         ::VariantInit(pVal);
2076         if(m_pClassDisp){
2077                 m_pClassDisp->AddRef();
2078                 pVal->pdispVal = m_pClassDisp;
2079                 pVal->vt = VT_UNKNOWN;
2080         }
2081         return S_OK;
2082 }
2083
2084 STDMETHODIMP COverlappedWindow::put_ClassObject(VARIANT newVal)
2085 {
2086         if(m_pClassDisp){
2087                 m_pClassDisp->Release();
2088         }
2089         if(newVal.vt == VT_DISPATCH){
2090                 m_pClassDisp = newVal.pdispVal;
2091                 m_pClassDisp->AddRef();
2092         }
2093         else if(!(newVal.vt == VT_EMPTY || newVal.vt == VT_ERROR || newVal.vt == VT_NULL)){
2094                 return DISP_E_TYPEMISMATCH;
2095         }
2096         return S_OK;
2097 }
2098
2099 void COverlappedWindow::ClassObjectInvoke(LPCWSTR handler)
2100 {
2101         if(!m_pClassDisp){
2102                 return;
2103         }
2104         DISPID dispid;
2105         if(m_pClassDisp->GetIDsOfNames(IID_NULL,(LPWSTR*)&handler,1,LOCALE_SYSTEM_DEFAULT,&dispid) != S_OK){
2106                 return;
2107         }
2108         DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
2109         m_pClassDisp->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dispparamsNoArgs,NULL,NULL,NULL);
2110 }
2111
2112 STDMETHODIMP COverlappedWindow::get_ClientWidth(long *pVal)
2113 {
2114         SafeCreateWnd();
2115         RECT rct;
2116         ::GetClientRect(m_hPopupWnd,&rct);
2117         *pVal = rct.right;
2118         return S_OK;
2119 }
2120
2121 STDMETHODIMP COverlappedWindow::get_ClientHeight(long *pVal)
2122 {
2123         SafeCreateWnd();
2124         RECT rct;
2125         ::GetClientRect(m_hPopupWnd,&rct);
2126         *pVal = rct.bottom;
2127         return S_OK;
2128 }
2129
2130 STDMETHODIMP COverlappedWindow::get_innerWidth(double *pVal)
2131 {
2132         SafeCreateWnd();
2133         RECT rct;
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);
2142         *pVal = pt.x / 10.;
2143         return S_OK;
2144 }
2145
2146 STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal)
2147 {
2148         SafeCreateWnd();
2149         RECT rct;
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);
2158         *pVal = pt.y / 10.;
2159         return S_OK;
2160 }
2161
2162 STDMETHODIMP COverlappedWindow::get_AutoReleaseClassObject(BOOL *pVal)
2163 {
2164         *pVal = m_bAutoReleaseClassObject?VB_TRUE:VB_FALSE;
2165         return S_OK;
2166 }
2167
2168 STDMETHODIMP COverlappedWindow::put_AutoReleaseClassObject(BOOL newVal)
2169 {
2170         m_bAutoReleaseClassObject = newVal;
2171         return S_OK;
2172 }
2173
2174 STDMETHODIMP COverlappedWindow::get_DefaultAction(BOOL *pVal)
2175 {
2176         *pVal = m_bDefaultAction?VB_TRUE:VB_FALSE;
2177         return S_OK;
2178 }
2179
2180 STDMETHODIMP COverlappedWindow::put_DefaultAction(BOOL newVal)
2181 {
2182         m_bDefaultAction = newVal;
2183         return S_OK;
2184 }
2185
2186 STDMETHODIMP COverlappedWindow::SetClipboardText(BSTR text)
2187 {
2188         SafeCreateWnd();
2189         if(::OpenClipboard(m_hPopupWnd)){
2190                 ::EmptyClipboard();
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);
2195                 p[len] = 0;
2196                 GlobalUnlock(hGlobal);
2197                 ::SetClipboardData(CF_TEXT,hGlobal);
2198                 ::CloseClipboard();
2199         }
2200         return S_OK;
2201 }
2202
2203 STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText)
2204 {
2205         SafeCreateWnd();
2206         ::VariantInit(pVarText);
2207         if(::OpenClipboard(m_hPopupWnd)){
2208                 if(IsClipboardFormatAvailable(CF_TEXT)){
2209                         HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT);
2210                         if(hGlobal){
2211                                 LPCSTR p = (LPSTR)GlobalLock(hGlobal);
2212                                 if(p){
2213                                         int len = GlobalSize(hGlobal);
2214                                         _bstr_t wstr(p);
2215                                         GlobalUnlock(hGlobal);
2216                                         pVarText->bstrVal = wstr.copy();
2217                                         pVarText->vt      = VT_BSTR;
2218                                 }
2219                         }
2220                 }
2221                 ::CloseClipboard();
2222         }
2223         return S_OK;
2224 }