- // restore
- m_lastMsg = lastMsg;
- m_lastWParam = lastWParam;
- m_lastLParam = lastLParam;
-
- return bProcessed;
-}
-
-// Hook for new window just as it's being created,
-// when the window isn't yet associated with the handle
-wxWindow *wxWndHook = NULL;
-
-// Main window proc
-LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd);
-
- if (!wnd && wxWndHook)
- {
- wxAssociateWinWithHandle(hWnd, wxWndHook);
- wnd = wxWndHook;
- wxWndHook = NULL;
- wnd->m_hWnd = (WXHWND) hWnd;
- }
-
- // Stop right here if we don't have a valid handle
- // in our wxWnd object.
- if (wnd && !wnd->m_hWnd) {
- // wxDebugMsg("Warning: could not find a valid handle, wx_win.cc/wxWndProc.\n");
- wnd->m_hWnd = (WXHWND) hWnd;
- long res = wnd->MSWDefWindowProc(message, wParam, lParam );
- wnd->m_hWnd = 0;
- return res;
- }
-
- if (wnd) {
- wnd->m_lastMsg = message;
- wnd->m_lastWParam = wParam;
- wnd->m_lastLParam = lParam;
- }
- if (wnd)
- return wnd->MSWWindowProc(message, wParam, lParam);
- else
- return DefWindowProc( hWnd, message, wParam, lParam );
-}
-
-// Should probably have a test for 'genuine' NT
-#if defined(__WIN32__)
- #define DIMENSION_TYPE short
-#else
- #define DIMENSION_TYPE int
-#endif
-
-// Main Windows 3 window proc
-long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
- wxASSERT( m_lastMsg == message &&
- m_lastWParam == wParam && m_lastLParam == lParam );
-
-#ifdef __WXDEBUG__
- wxLogTrace(wxTraceMessages, "Processing %s(%lx, %lx)",
- wxGetMessageName(message), wParam, lParam);
-#endif // __WXDEBUG__
-
- HWND hWnd = (HWND)m_hWnd;
-
- switch (message)
- {
- case WM_ACTIVATE:
- {
-#ifdef __WIN32__
- WORD state = LOWORD(wParam);
- WORD minimized = HIWORD(wParam);
- HWND hwnd = (HWND)lParam;
-#else
- WORD state = (WORD)wParam;
- WORD minimized = LOWORD(lParam);
- HWND hwnd = (HWND)HIWORD(lParam);
-#endif
- MSWOnActivate(state, (minimized != 0), (WXHWND) hwnd);
- return 0;
- break;
- }
- case WM_SETFOCUS:
- {
- HWND hwnd = (HWND)wParam;
- // return OnSetFocus(hwnd);
-
- if (MSWOnSetFocus((WXHWND) hwnd))
- return 0;
- else return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
- case WM_KILLFOCUS:
- {
- HWND hwnd = (HWND)lParam;
- // return OnKillFocus(hwnd);
- if (MSWOnKillFocus((WXHWND) hwnd))
- return 0;
- else
- return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
- case WM_CREATE:
- {
- MSWOnCreate((WXLPCREATESTRUCT) (LPCREATESTRUCT)lParam);
- return 0;
- break;
- }
- case WM_SHOWWINDOW:
- {
- MSWOnShow((wParam != 0), (int) lParam);
- break;
- }
- case WM_PAINT:
- {
- if (MSWOnPaint())
- return 0;
- else return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
- case WM_QUERYDRAGICON:
- {
- HICON hIcon = (HICON)MSWOnQueryDragIcon();
- if ( hIcon )
- return (long)hIcon;
- else
- return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
-
- case WM_SIZE:
- {
- int width = LOWORD(lParam);
- int height = HIWORD(lParam);
- MSWOnSize(width, height, wParam);
- break;
- }
-
- case WM_MOVE:
- {
- wxMoveEvent event(wxPoint(LOWORD(lParam), HIWORD(lParam)),
- m_windowId);
- event.SetEventObject(this);
- if ( !GetEventHandler()->ProcessEvent(event) )
- Default();
- }
- break;
-
- case WM_WINDOWPOSCHANGING:
- {
- MSWOnWindowPosChanging((void *)lParam);
- break;
- }
-
- case WM_RBUTTONDOWN:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnRButtonDown(x, y, wParam);
- break;
- }
- case WM_RBUTTONUP:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnRButtonUp(x, y, wParam);
- break;
- }
- case WM_RBUTTONDBLCLK:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnRButtonDClick(x, y, wParam);
- break;
- }
- case WM_MBUTTONDOWN:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnMButtonDown(x, y, wParam);
- break;
- }
- case WM_MBUTTONUP:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnMButtonUp(x, y, wParam);
- break;
- }
- case WM_MBUTTONDBLCLK:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnMButtonDClick(x, y, wParam);
- break;
- }
- case WM_LBUTTONDOWN:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnLButtonDown(x, y, wParam);
- break;
- }
- case WM_LBUTTONUP:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnLButtonUp(x, y, wParam);
- break;
- }
- case WM_LBUTTONDBLCLK:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnLButtonDClick(x, y, wParam);
- break;
- }
- case WM_MOUSEMOVE:
- {
- int x = (DIMENSION_TYPE) LOWORD(lParam);
- int y = (DIMENSION_TYPE) HIWORD(lParam);
- MSWOnMouseMove(x, y, wParam);
- break;
- }
- case MM_JOY1BUTTONDOWN:
- {
- int x = LOWORD(lParam);
- int y = HIWORD(lParam);
- MSWOnJoyDown(wxJOYSTICK1, x, y, wParam);
- break;
- }
- case MM_JOY2BUTTONDOWN:
- {
- int x = LOWORD(lParam);
- int y = HIWORD(lParam);
- MSWOnJoyDown(wxJOYSTICK2, x, y, wParam);
- break;
- }
- case MM_JOY1BUTTONUP:
- {
- int x = LOWORD(lParam);
- int y = HIWORD(lParam);
- MSWOnJoyUp(wxJOYSTICK1, x, y, wParam);
- break;
- }
- case MM_JOY2BUTTONUP:
- {
- int x = LOWORD(lParam);
- int y = HIWORD(lParam);
- MSWOnJoyUp(wxJOYSTICK2, x, y, wParam);
- break;
- }
- case MM_JOY1MOVE:
- {
- int x = LOWORD(lParam);
- int y = HIWORD(lParam);
- MSWOnJoyMove(wxJOYSTICK1, x, y, wParam);
- break;
- }
- case MM_JOY2MOVE:
- {
- int x = LOWORD(lParam);
- int y = HIWORD(lParam);
- MSWOnJoyMove(wxJOYSTICK2, x, y, wParam);
- break;
- }
- case MM_JOY1ZMOVE:
- {
- int z = LOWORD(lParam);
- MSWOnJoyZMove(wxJOYSTICK1, z, wParam);
- break;
- }
- case MM_JOY2ZMOVE:
- {
- int z = LOWORD(lParam);
- MSWOnJoyZMove(wxJOYSTICK2, z, wParam);
- break;
- }
- case WM_DESTROY:
- {
- if (MSWOnDestroy())
- return 0;
- else return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
- case WM_SYSCOMMAND:
- {
- return MSWOnSysCommand(wParam, lParam);
- break;
- }
- case WM_COMMAND:
- {
-#ifdef __WIN32__
- WORD id = LOWORD(wParam);
- HWND hwnd = (HWND)lParam;
- WORD cmd = HIWORD(wParam);
-#else
- WORD id = (WORD)wParam;
- HWND hwnd = (HWND)LOWORD(lParam) ;
- WORD cmd = HIWORD(lParam);
-#endif
- if (!MSWOnCommand(id, cmd, (WXHWND) hwnd))
- return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
-#if defined(__WIN95__)
- case WM_NOTIFY:
- {
- // for some messages (TVN_ITEMEXPANDING for example), the return
- // value of WM_NOTIFY handler is important, so don't just return 0
- // if we processed the message
- return MSWOnNotify(wParam, lParam);
- }
-#endif
- case WM_MENUSELECT:
- {
-#ifdef __WIN32__
- WORD flags = HIWORD(wParam);
- HMENU sysmenu = (HMENU)lParam;
-#else
- WORD flags = LOWORD(lParam);
- HMENU sysmenu = (HMENU)HIWORD(lParam);
-#endif
- MSWOnMenuHighlight((WORD)wParam, flags, (WXHMENU) sysmenu);
- break;
- }
- case WM_INITMENUPOPUP:
- {
- MSWOnInitMenuPopup((WXHMENU) (HMENU)wParam, (int)LOWORD(lParam), (HIWORD(lParam) != 0));
- break;
- }
- case WM_DRAWITEM:
- {
- return MSWOnDrawItem((int)wParam, (WXDRAWITEMSTRUCT *)lParam);
- break;
- }
- case WM_MEASUREITEM:
- {
- return MSWOnMeasureItem((int)wParam, (WXMEASUREITEMSTRUCT *)lParam);
- break;
- }
-
-#if 0
- case WM_KEYDOWN:
- {
- MSWOnKeyDown((WORD) wParam, lParam);
- // we consider these message "not interesting"
- if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
- return Default();
-
- // Avoid duplicate messages to OnChar
- if ( (wParam != VK_ESCAPE) && (wParam != VK_SPACE) &&
- (wParam != VK_RETURN) && (wParam != VK_BACK) &&
- (wParam != VK_TAB) )
- {
- MSWOnChar((WORD)wParam, lParam);
- if ( ::GetKeyState(VK_CONTROL) & 0x100 )
- return Default();
- }
- else if ( ::GetKeyState(VK_CONTROL) & 0x100 )
- MSWOnChar((WORD)wParam, lParam);
- else
- return Default();
- break;
- }
-#endif
-
- case WM_KEYUP:
- {
- MSWOnKeyUp((WORD) wParam, lParam);
- break;
- }
- case WM_CHAR: // Always an ASCII character
- {
- MSWOnChar((WORD)wParam, lParam, TRUE);
- break;
- }
-
- case WM_HSCROLL:
- {
-#ifdef __WIN32__
- WORD code = LOWORD(wParam);
- WORD pos = HIWORD(wParam);
- HWND control = (HWND)lParam;
-#else
- WORD code = (WORD)wParam;
- WORD pos = LOWORD(lParam);
- HWND control = (HWND)HIWORD(lParam);
-#endif
- MSWOnHScroll(code, pos, (WXHWND) control);
- break;
- }
- case WM_VSCROLL:
- {
-#ifdef __WIN32__
- WORD code = LOWORD(wParam);
- WORD pos = HIWORD(wParam);
- HWND control = (HWND)lParam;
-#else
- WORD code = (WORD)wParam;
- WORD pos = LOWORD(lParam);
- HWND control = (HWND)HIWORD(lParam);
-#endif
- MSWOnVScroll(code, pos, (WXHWND) control);
- break;
- }
-#ifdef __WIN32__
- case WM_CTLCOLORBTN:
- {
- int nCtlColor = CTLCOLOR_BTN;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
- case WM_CTLCOLORDLG:
- {
- int nCtlColor = CTLCOLOR_DLG;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);\
- break;
- }
- case WM_CTLCOLORLISTBOX:
- {
- int nCtlColor = CTLCOLOR_LISTBOX;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
- case WM_CTLCOLORMSGBOX:
- {
- int nCtlColor = CTLCOLOR_MSGBOX;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
- case WM_CTLCOLORSCROLLBAR:
- {
- int nCtlColor = CTLCOLOR_SCROLLBAR;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
- case WM_CTLCOLORSTATIC:
- {
- int nCtlColor = CTLCOLOR_STATIC;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
- case WM_CTLCOLOREDIT:
- {
- int nCtlColor = CTLCOLOR_EDIT;
- HWND control = (HWND)lParam;
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
-#else
- case WM_CTLCOLOR:
- {
- HWND control = (HWND)LOWORD(lParam);
- int nCtlColor = (int)HIWORD(lParam);
- HDC pDC = (HDC)wParam;
- return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
- message, wParam, lParam);
- break;
- }
-#endif
- case WM_SYSCOLORCHANGE:
- {
- // Return value of 0 means, we processed it.
- if (MSWOnColorChange((WXHWND) hWnd, message, wParam, lParam) == 0)
- return 0;
- else
- return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
- case WM_PALETTECHANGED:
- {
- return MSWOnPaletteChanged((WXHWND) (HWND) wParam);
- break;
- }
- case WM_QUERYNEWPALETTE:
- {
- return MSWOnQueryNewPalette();
- break;
- }
- case WM_ERASEBKGND:
- {
- // Prevents flicker when dragging
- if (IsIconic(hWnd)) return 1;
-
- if (!MSWOnEraseBkgnd((WXHDC) (HDC)wParam))
- return 0; // Default(); MSWDefWindowProc(message, wParam, lParam );
- else return 1;
- break;
- }
- case WM_MDIACTIVATE:
- {
-#ifdef __WIN32__
- HWND hWndActivate = GET_WM_MDIACTIVATE_HWNDACTIVATE(wParam,lParam);
- HWND hWndDeactivate = GET_WM_MDIACTIVATE_HWNDDEACT(wParam,lParam);
- BOOL activate = GET_WM_MDIACTIVATE_FACTIVATE(hWnd,wParam,lParam);
- return MSWOnMDIActivate((long) activate, (WXHWND) hWndActivate, (WXHWND) hWndDeactivate);
-#else
- return MSWOnMDIActivate((BOOL)wParam, (HWND)LOWORD(lParam),
- (HWND)HIWORD(lParam));
-#endif
- }
- case WM_DROPFILES:
- {
- MSWOnDropFiles(wParam);
- break;
- }
- case WM_INITDIALOG:
- {
- return 0; // MSWOnInitDialog((WXHWND)(HWND)wParam);
- break;
- }
- case WM_QUERYENDSESSION:
- {
- // Same as WM_CLOSE, but inverted results. Thx Microsoft :-)
- // return MSWOnClose();
-
- return MSWOnQueryEndSession(lParam);
- break;
- }
- case WM_ENDSESSION:
- {
- // Same as WM_CLOSE, but inverted results. Thx Microsoft :-)
- MSWOnEndSession((wParam != 0), lParam);
- return 0L;
- break;
- }
- case WM_CLOSE:
- {
- if (MSWOnClose())
- return 0L;
- else
- return 1L;
- break;
- }
-
- case WM_GETMINMAXINFO:
- {
- MINMAXINFO *info = (MINMAXINFO *)lParam;
- if (m_minSizeX != -1)
- info->ptMinTrackSize.x = (int)m_minSizeX;
- if (m_minSizeY != -1)
- info->ptMinTrackSize.y = (int)m_minSizeY;
- if (m_maxSizeX != -1)
- info->ptMaxTrackSize.x = (int)m_maxSizeX;
- if (m_maxSizeY != -1)
- info->ptMaxTrackSize.y = (int)m_maxSizeY;
- return MSWDefWindowProc(message, wParam, lParam );
- break;
- }
-
- case WM_GETDLGCODE:
- return MSWGetDlgCode();
-
- default:
- return MSWDefWindowProc(message, wParam, lParam );
- }
- return 0; // Success: we processed this command.
-}
-
-// Dialog window proc
-LONG APIENTRY _EXPORT
-wxDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- return 0;
-}
-
-wxList *wxWinHandleList = NULL;
-wxWindow *wxFindWinFromHandle(WXHWND hWnd)
-{
- wxNode *node = wxWinHandleList->Find((long)hWnd);
- if (!node)
- return NULL;
- return (wxWindow *)node->Data();
-}
-
-void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win)
-{
- // adding NULL hWnd is (first) surely a result of an error and
- // (secondly) breaks menu command processing
- wxCHECK_RET( hWnd != (HWND) NULL, "attempt to add a NULL hWnd to window list" );
-
- if ( !wxWinHandleList->Find((long)hWnd) )
- wxWinHandleList->Append((long)hWnd, win);
-}
-
-void wxRemoveHandleAssociation(wxWindow *win)
-{
- wxWinHandleList->DeleteObject(win);
-}
-
-// Default destroyer - override if you destroy it in some other way
-// (e.g. with MDI child windows)
-void wxWindow::MSWDestroyWindow()
-{
-}
-
-void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow *wx_win, const char *title,
- int x, int y, int width, int height,
- WXDWORD style, const char *dialog_template, WXDWORD extendedStyle)
-{
- bool is_dialog = (dialog_template != NULL);
- int x1 = CW_USEDEFAULT;
- int y1 = 0;
- int width1 = CW_USEDEFAULT;
- int height1 = 100;
-
- // Find parent's size, if it exists, to set up a possible default
- // panel size the size of the parent window
- RECT parent_rect;
- if (parent)
- {
- // Was GetWindowRect: JACS 5/5/95
- ::GetClientRect((HWND) parent->GetHWND(), &parent_rect);
-
- width1 = parent_rect.right - parent_rect.left;
- height1 = parent_rect.bottom - parent_rect.top;
- }
-
- if (x > -1) x1 = x;
- if (y > -1) y1 = y;
- if (width > -1) width1 = width;
- if (height > -1) height1 = height;
-
- HWND hParent = NULL;
- if (parent)
- hParent = (HWND) parent->GetHWND();
-
- wxWndHook = this;
-
- if (is_dialog)
- {
- // MakeProcInstance doesn't seem to be needed in C7. Is it needed for
- // other compilers???
- // VZ: it's always needed for Win16 and never for Win32
-#ifdef __WIN32__
- m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
- (DLGPROC)wxDlgProc);
-#else
- // N.B.: if we _don't_ use this form,
- // then with VC++ 1.5, it crashes horribly.
-#if 1
- m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
- (DLGPROC)wxDlgProc);
-#else
- // Crashes when we use this.
- DLGPROC dlgproc = (DLGPROC)MakeProcInstance((DLGPROC)wxWndProc, wxGetInstance());
-
- m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
- (DLGPROC)dlgproc);
-#endif
-#endif
-
- if (m_hWnd == 0)
- MessageBox(NULL, "Can't find dummy dialog template!\nCheck resource include path for finding wx.rc.",
- "wxWindows Error", MB_ICONEXCLAMATION | MB_OK);
- else MoveWindow((HWND) m_hWnd, x1, y1, width1, height1, FALSE);
- }
- else
- {
- int controlId = 0;
- if (style & WS_CHILD)
- controlId = id;
- if (!title)
- title = "";
-
- m_hWnd = (WXHWND)CreateWindowEx(extendedStyle, wclass,
- title,
- style,
- x1, y1,
- width1, height1,
- hParent, (HMENU)controlId, wxGetInstance(),
- NULL);
-
- if ( !m_hWnd ) {
- wxLogError("Can't create window of class %s!\n"
- "Possible Windows 3.x compatibility problem?", wclass);
- }
- }
-
- wxWndHook = NULL;
- wxWinHandleList->Append((long)m_hWnd, this);
-}
-
-void wxWindow::MSWOnCreate(WXLPCREATESTRUCT WXUNUSED(cs))
-{
-}
-
-bool wxWindow::MSWOnClose()
-{
- return FALSE;
-}
-
-// Some compilers don't define this
-#ifndef ENDSESSION_LOGOFF
-#define ENDSESSION_LOGOFF 0x80000000
-#endif
-
-// Return TRUE to end session, FALSE to veto end session.
-bool wxWindow::MSWOnQueryEndSession(long logOff)
-{
- wxCloseEvent event(wxEVT_QUERY_END_SESSION, -1);
- event.SetEventObject(wxTheApp);
- event.SetCanVeto(TRUE);
- event.SetLoggingOff( (logOff == ENDSESSION_LOGOFF) );
- if ((this == wxTheApp->GetTopWindow()) && // Only send once
- wxTheApp->ProcessEvent(event) && event.GetVeto())
- {
- return FALSE; // Veto!
- }
- else
- {
- return TRUE; // Don't veto
- }
-}
-
-bool wxWindow::MSWOnEndSession(bool endSession, long logOff)
-{
- wxCloseEvent event(wxEVT_END_SESSION, -1);
- event.SetEventObject(wxTheApp);
- event.SetCanVeto(FALSE);
- event.SetLoggingOff( (logOff == ENDSESSION_LOGOFF) );
- if (endSession && // No need to send if the session isn't ending
- (this == wxTheApp->GetTopWindow()) && // Only send once
- wxTheApp->ProcessEvent(event))
- {
- }
- return TRUE;
-}
-
-bool wxWindow::MSWOnDestroy()
-{
- // delete our drop target if we've got one
-#if wxUSE_DRAG_AND_DROP
- if ( m_pDropTarget != NULL ) {
- m_pDropTarget->Revoke(m_hWnd);
-
- delete m_pDropTarget;
- m_pDropTarget = NULL;
- }
-#endif
-
- return TRUE;
-}
-
-// Deal with child commands from buttons etc.
-
-long wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam)
-{
-#if defined(__WIN95__)
- // Find a child window to send the notification to, e.g. a toolbar.
- // There's a problem here. NMHDR::hwndFrom doesn't give us the
- // handle of the toolbar; it's probably the handle of the tooltip
- // window (anyway, it's parent is also the toolbar's parent).
- // So, since we don't know which hWnd or wxWindow originated the
- // WM_NOTIFY, we'll need to go through all the children of this window
- // trying out MSWNotify.
- // This won't work now, though, because any number of controls
- // could respond to the same generic messages :-(
-
- /* This doesn't work for toolbars, but try for other controls first.
- */
- NMHDR *hdr = (NMHDR *)lParam;
- HWND hWnd = (HWND)hdr->hwndFrom;
- wxWindow *win = wxFindWinFromHandle((WXHWND) hWnd);
-
- WXLPARAM result = 0;
-
- if ( win )
- {
- if ( win->MSWNotify(wParam, lParam, &result) )
- return result;
- }
- else
- {
- // Rely on MSWNotify to check whether the message
- // belongs to the window or not
- wxNode *node = GetChildren().First();
- while (node)
- {
- wxWindow *child = (wxWindow *)node->Data();
- if ( child->MSWNotify(wParam, lParam, &result) )
- return result;
- node = node->Next();
- }
-
- // finally try this window too (catches toolbar case)
- if ( MSWNotify(wParam, lParam, &result) )
- return result;
- }
-#endif // Win95
-
- // not processed
- return FALSE;
-}
-
-void wxWindow::MSWOnMenuHighlight(WXWORD WXUNUSED(item), WXWORD WXUNUSED(flags), WXHMENU WXUNUSED(sysmenu))
-{
-}
-
-void wxWindow::MSWOnInitMenuPopup(WXHMENU menu, int pos, bool isSystem)
-{
-}
-
-bool wxWindow::MSWOnActivate(int state, bool WXUNUSED(minimized), WXHWND WXUNUSED(activate))
-{
- wxActivateEvent event(wxEVT_ACTIVATE, ((state == WA_ACTIVE) || (state == WA_CLICKACTIVE)),
- m_windowId);
- event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
- return 0;
-}
-
-bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd))
-{
- // Deal with caret
- if (m_caretEnabled && (m_caretWidth > 0) && (m_caretHeight > 0))
- {
- ::CreateCaret((HWND) GetHWND(), NULL, m_caretWidth, m_caretHeight);
- if (m_caretShown)
- ::ShowCaret((HWND) GetHWND());
- }
-
- wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
- event.SetEventObject(this);
- if (!GetEventHandler()->ProcessEvent(event))
- Default();
- return TRUE;
-}
-
-bool wxWindow::MSWOnKillFocus(WXHWND WXUNUSED(hwnd))
-{
- // Deal with caret
- if (m_caretEnabled)
- {
- ::DestroyCaret();
- }
-
- wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId);
- event.SetEventObject(this);
- if (!GetEventHandler()->ProcessEvent(event))
- Default();
- return TRUE;
-}
-
-void wxWindow::MSWOnDropFiles(WXWPARAM wParam)
-{
-
- HDROP hFilesInfo = (HDROP) wParam;
- POINT dropPoint;
- DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint);
-
- // Get the total number of files dropped
- WORD gwFilesDropped = (WORD)DragQueryFile ((HDROP)hFilesInfo,
- (UINT)-1,
- (LPSTR)0,
- (UINT)0);
-
- wxString *files = new wxString[gwFilesDropped];
- int wIndex;
- for (wIndex=0; wIndex < (int)gwFilesDropped; wIndex++)
- {
- DragQueryFile (hFilesInfo, wIndex, (LPSTR) wxBuffer, 1000);
- files[wIndex] = wxBuffer;
- }
- DragFinish (hFilesInfo);
-
- wxDropFilesEvent event(wxEVT_DROP_FILES, gwFilesDropped, files);
- event.m_eventObject = this;
- event.m_pos.x = dropPoint.x; event.m_pos.x = dropPoint.y;
-
- if (!GetEventHandler()->ProcessEvent(event))
- Default();
-
- delete[] files;
-}
-
-bool wxWindow::MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *itemStruct)
-{
-#if wxUSE_OWNER_DRAWN
- if ( id == 0 ) { // is it a menu item?
- DRAWITEMSTRUCT *pDrawStruct = (DRAWITEMSTRUCT *)itemStruct;
- wxMenuItem *pMenuItem = (wxMenuItem *)(pDrawStruct->itemData);
- wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
-
- // prepare to call OnDrawItem()
- wxDC dc;
- dc.SetHDC((WXHDC)pDrawStruct->hDC, FALSE);
- wxRect rect(pDrawStruct->rcItem.left, pDrawStruct->rcItem.top,
- pDrawStruct->rcItem.right - pDrawStruct->rcItem.left,
- pDrawStruct->rcItem.bottom - pDrawStruct->rcItem.top);
- return pMenuItem->OnDrawItem(
- dc, rect,
- (wxOwnerDrawn::wxODAction)pDrawStruct->itemAction,
- (wxOwnerDrawn::wxODStatus)pDrawStruct->itemState
- );
- }
-#endif // owner-drawn menus
-
- wxWindow *item = FindItem(id);
-#if wxUSE_DYNAMIC_CLASSES
- if (item && item->IsKindOf(CLASSINFO(wxControl)))
- {
- return ((wxControl *)item)->MSWOnDraw(itemStruct);
- }
- else
-#endif
- return FALSE;
-}
-
-bool wxWindow::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct)
-{
-#if wxUSE_OWNER_DRAWN
- if ( id == 0 ) { // is it a menu item?
- MEASUREITEMSTRUCT *pMeasureStruct = (MEASUREITEMSTRUCT *)itemStruct;
- wxMenuItem *pMenuItem = (wxMenuItem *)(pMeasureStruct->itemData);
- wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
-
- return pMenuItem->OnMeasureItem(&pMeasureStruct->itemWidth,
- &pMeasureStruct->itemHeight);
- }
-#endif // owner-drawn menus
-
- wxWindow *item = FindItem(id);
-#if wxUSE_DYNAMIC_CLASSES
- if (item && item->IsKindOf(CLASSINFO(wxControl)))
- {
- return ((wxControl *)item)->MSWOnMeasure(itemStruct);
- }
- else
-#endif
- return FALSE;
-}
-
-WXHBRUSH wxWindow::MSWOnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
- WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
- if (nCtlColor == CTLCOLOR_DLG)
- {
- return OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam);
- }
-
- wxControl *item = (wxControl *)FindItemByHWND(pWnd, TRUE);
-
- WXHBRUSH hBrush = 0;
-
- if ( item )
- hBrush = item->OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam);
-
- // I think that even for dialogs, we may need to call DefWindowProc (?)
- // Or maybe just rely on the usual default behaviour.
- if ( !hBrush )
- hBrush = (WXHBRUSH) MSWDefWindowProc(message, wParam, lParam);
-
- return hBrush ;
-}
-
-// Define for each class of dialog and control
-WXHBRUSH wxWindow::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
- WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
- return (WXHBRUSH) MSWDefWindowProc(message, wParam, lParam);
-}
-
-bool wxWindow::MSWOnColorChange(WXHWND hWnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
- wxSysColourChangedEvent event;
- event.SetEventObject(this);
-
- // Check if app handles this.
- if (GetEventHandler()->ProcessEvent(event))
- return 0;
-
- // We didn't process it
- return 1;
-}
-
-long wxWindow::MSWOnPaletteChanged(WXHWND hWndPalChange)
-{
- wxPaletteChangedEvent event(GetId());
- event.SetEventObject(this);
- event.SetChangedWindow(wxFindWinFromHandle(hWndPalChange));
- GetEventHandler()->ProcessEvent(event);
- return 0;
-}
-
-long wxWindow::MSWOnQueryNewPalette()
-{
- wxQueryNewPaletteEvent event(GetId());
- event.SetEventObject(this);
- if (!GetEventHandler()->ProcessEvent(event) || !event.GetPaletteRealized())
- {
- return (long) FALSE;
- }
- else
- return (long) TRUE;
-}
-
-// Responds to colour changes: passes event on to children.
-void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event)
-{
- wxNode *node = GetChildren().First();
- while ( node )
- {
- // Only propagate to non-top-level windows
- wxWindow *win = (wxWindow *)node->Data();
- if ( win->GetParent() )
- {
- wxSysColourChangedEvent event2;
- event.m_eventObject = win;
- win->GetEventHandler()->ProcessEvent(event2);
- }
-
- node = node->Next();
- }
-}
-
-long wxWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
-{
- if ( m_oldWndProc )
- return ::CallWindowProc(CASTWNDPROC m_oldWndProc, (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam);
- else
- return ::DefWindowProc((HWND) GetHWND(), nMsg, wParam, lParam);
-}
-
-long wxWindow::Default()
-{
- // Ignore 'fake' events (perhaps generated as a result of a separate real event)
- if (m_lastMsg == 0)
- return 0;
-
-#ifdef __WXDEBUG__
- wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.",
- wxGetMessageName(m_lastMsg));
-#endif // __WXDEBUG__
-
- return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
-}
-
-bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
-{
- if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) {
- // intercept dialog navigation keys
- MSG *msg = (MSG *)pMsg;
- bool bProcess = TRUE;
- if ( msg->message != WM_KEYDOWN )
- bProcess = FALSE;
-
- if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
- bProcess = FALSE;
-
- bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0;
-
- // WM_GETDLGCODE: if the control wants it for itself, don't process it
- // (except for Ctrl-Tab combination which is always processed)
- LONG lDlgCode = 0;
- if ( bProcess && !bCtrlDown ) {
- lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0);
- }
-
- bool bForward = TRUE,
- bWindowChange = FALSE;
- if ( bProcess ) {
- switch ( msg->wParam ) {
- case VK_TAB:
- if ( lDlgCode & DLGC_WANTTAB ) {
- bProcess = FALSE;
- }
- else {
- // Ctrl-Tab cycles thru notebook pages
- bWindowChange = bCtrlDown;
- bForward = !(::GetKeyState(VK_SHIFT) & 0x100);
- }
- break;
-
- case VK_UP:
- case VK_LEFT:
- if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown )
- bProcess = FALSE;
- else
- bForward = FALSE;
- break;
-
- case VK_DOWN:
- case VK_RIGHT:
- if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown )
- bProcess = FALSE;
- break;
-
- case VK_RETURN:
- // if there is a default button, Enter should press it
- if ( !GetDefaultItem() ) {
- // but if there is not it makes sense to make it work
- // like a TAB
-
- // nothing to do - all variables are already set
-
- break;
- }
- //else: fall through and don't process the message
-
- default:
- bProcess = FALSE;
- }
- }
-
- if ( bProcess ) {
- wxNavigationKeyEvent event;
- event.SetDirection(bForward);
- event.SetWindowChange(bWindowChange);
- event.SetEventObject(this);
-
- if ( GetEventHandler()->ProcessEvent(event) )
- return TRUE;
- }
-
- return ::IsDialogMessage((HWND)GetHWND(), msg) != 0;
- }
-#if wxUSE_TOOLTIPS
- else if ( m_tooltip ) {
- // relay mouse move events to the tooltip control
- MSG *msg = (MSG *)pMsg;
- if ( msg->message == WM_MOUSEMOVE )
- m_tooltip->RelayEvent(pMsg);
- }
-#endif // wxUSE_TOOLTIPS
-
- return FALSE;
-}
-
-bool wxWindow::MSWTranslateMessage(WXMSG* pMsg)
-{
- if (m_acceleratorTable.Ok() &&
- ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), (MSG *)pMsg))
- return TRUE;
- else
- return FALSE;