X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/18a1f588e7f9c71b4941da549a9ff4370675818c..41286fd1def19641be3ae5bb9666c84a1c0b5525:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 3ada51d847..10d88547e1 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -118,7 +118,6 @@ #endif #endif - // --------------------------------------------------------------------------- // global variables // --------------------------------------------------------------------------- @@ -2562,7 +2561,10 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam break; #endif // __WIN32__ -#ifdef __WXUNIVERSAL__ + // unfortunately this doesn't really work as then window which + // doesn't accept focus doesn't get any mouse events neither which + // means it can't get any input at all +#if 0 //def __WXUNIVERSAL__ case WM_NCHITTEST: // we shouldn't allow the windows which don't want to get focus to // get it @@ -2591,14 +2593,11 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam // wxWindow <-> HWND map // ---------------------------------------------------------------------------- -wxList *wxWinHandleList = NULL; +wxWinHashTable *wxWinHandleHash = NULL; wxWindow *wxFindWinFromHandle(WXHWND hWnd) { - wxNode *node = wxWinHandleList->Find((long)hWnd); - if ( !node ) - return NULL; - return (wxWindow *)node->Data(); + return wxWinHandleHash->Get((long)hWnd); } void wxAssociateWinWithHandle(HWND hWnd, wxWindowMSW *win) @@ -2619,13 +2618,13 @@ void wxAssociateWinWithHandle(HWND hWnd, wxWindowMSW *win) #endif // __WXDEBUG__ if (!oldWin) { - wxWinHandleList->Append((long)hWnd, win); + wxWinHandleHash->Put((long)hWnd, win); } } void wxRemoveHandleAssociation(wxWindowMSW *win) { - wxWinHandleList->DeleteObject(win); + wxWinHandleHash->Delete((long)win->GetHWND()); } // ---------------------------------------------------------------------------- @@ -2692,29 +2691,32 @@ bool wxWindowMSW::MSWGetCreateWindowCoords(const wxPoint& pos, nonDefault = TRUE; } - if ( size.x == -1 || size.y == -1 ) + /* + NB: there used to be some code here which set the initial size of the + window to the client size of the parent if no explicit size was + specified. This was wrong because wxWindows programs often assume + that they get a WM_SIZE (EVT_SIZE) upon creation, however this broke + it. To see why, you should understand that Windows sends WM_SIZE from + inside ::CreateWindow() anyhow. However, ::CreateWindow() is called + from some base class ctor and so this WM_SIZE is not processed in the + real class' OnSize() (because it's not fully constructed yet and the + event goes to some base class OnSize() instead). So the WM_SIZE we + rely on is the one sent when the parent frame resizes its children + but here is the problem: if the child already has just the right + size, nothing will happen as both wxWindows and Windows check for + this and ignore any attempts to change the window size to the size it + already has - so no WM_SIZE would be sent. + */ + if ( size.x == -1 ) { - // Find parent's size, if it exists, to set up a possible default panel - // size the size of the parent window - wxWindow *parent = GetParent(); - if ( parent ) - { - RECT rectParent; - ::GetClientRect(GetHwndOf(parent), &rectParent); - - w = size.x == -1 ? rectParent.right - rectParent.left : size.x; - h = size.y == -1 ? rectParent.bottom - rectParent.top : size.y; - } - else - { - w = - h = CW_USEDEFAULT; - } + // as abobe, h is not used at all in this case anyhow + w = + h = CW_USEDEFAULT; } else { w = size.x; - h = size.y; + h = size.y == -1 ? CW_USEDEFAULT : size.y; nonDefault = TRUE; } @@ -3061,11 +3063,9 @@ bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam) { #ifndef __WXMICROWIN__ HDROP hFilesInfo = (HDROP) wParam; - POINT dropPoint; - DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint); // Get the total number of files dropped - WORD gwFilesDropped = (WORD)::DragQueryFile + UINT gwFilesDropped = ::DragQueryFile ( (HDROP)hFilesInfo, (UINT)-1, @@ -3074,24 +3074,28 @@ bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam) ); wxString *files = new wxString[gwFilesDropped]; - int wIndex; - for (wIndex=0; wIndex < (int)gwFilesDropped; wIndex++) + for ( UINT wIndex = 0; wIndex < gwFilesDropped; wIndex++ ) { - DragQueryFile (hFilesInfo, wIndex, (LPTSTR) wxBuffer, 1000); - files[wIndex] = wxBuffer; + // first get the needed buffer length (+1 for terminating NUL) + size_t len = ::DragQueryFile(hFilesInfo, wIndex, NULL, 0) + 1; + + // and now get the file name + ::DragQueryFile(hFilesInfo, wIndex, + files[wIndex].GetWriteBuf(len), len); + + files[wIndex].UngetWriteBuf(); } DragFinish (hFilesInfo); wxDropFilesEvent event(wxEVT_DROP_FILES, gwFilesDropped, files); event.m_eventObject = this; + + POINT dropPoint; + DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint); event.m_pos.x = dropPoint.x; event.m_pos.y = dropPoint.y; - bool rc = GetEventHandler()->ProcessEvent(event); - - delete[] files; - - return rc; + return GetEventHandler()->ProcessEvent(event); #else // __WXMICROWIN__ return FALSE; #endif @@ -3520,7 +3524,7 @@ bool wxWindowMSW::HandleGetMinMaxInfo(void *mmInfo) bool wxWindowMSW::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) { #if wxUSE_MENUS_NATIVE - if ( wxCurrentPopupMenu ) + if ( !cmd && wxCurrentPopupMenu ) { wxMenu *popupMenu = wxCurrentPopupMenu; wxCurrentPopupMenu = NULL; @@ -3529,14 +3533,14 @@ bool wxWindowMSW::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) } #endif // wxUSE_MENUS_NATIVE - wxWindow *win = (wxWindow*) NULL; + wxWindow *win = NULL; if ( cmd == 0 || cmd == 1 ) // menu or accel - use id { // must cast to a signed type before comparing with other ids! win = FindItem((signed short)id); } - if (!win && control) + if ( !win && control ) { // find it from HWND - this works even with the broken programs using // the same ids for different controls