X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9145664b28fc7a4a2a9bacf7024f257fe6f15479..683730003ba8f36fa07496b8f298d40733534aea:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 7996c88ecc..48ccd27be1 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -29,6 +29,9 @@ #endif #ifndef WX_PRECOMP + #include + #include "wx/msw/winundef.h" + #include "wx/accel.h" #include "wx/setup.h" #include "wx/menu.h" #include "wx/dc.h" @@ -51,20 +54,26 @@ #endif #if wxUSE_DRAG_AND_DROP + #include "wx/dataobj.h" #include "wx/msw/ole/droptgt.h" #endif #include "wx/menuitem.h" #include "wx/log.h" +#include "wx/msw/private.h" + #if wxUSE_TOOLTIPS #include "wx/tooltip.h" #endif +#if wxUSE_CARET + #include "wx/caret.h" +#endif // wxUSE_CARET + #include "wx/intl.h" #include "wx/log.h" -#include "wx/msw/private.h" #include "wx/textctrl.h" @@ -89,16 +98,14 @@ #endif #endif -#include "wx/msw/winundef.h" - // --------------------------------------------------------------------------- // macros // --------------------------------------------------------------------------- // standard macros missing from some compilers headers #ifndef GET_X_LPARAM - #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) - #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) + #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) + #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #endif // GET_X_LPARAM // --------------------------------------------------------------------------- @@ -112,6 +119,17 @@ wxMenu *wxCurrentPopupMenu = NULL; extern wxList WXDLLEXPORT wxPendingDelete; extern char wxCanvasClassName[]; +#ifdef __WXDEBUG__ + // see comments in dcclient.cpp where g_isPainting is defined + extern bool g_isPainting; + + inline static void wxStartPainting() { g_isPainting = TRUE; } + inline static void wxEndPainting() { g_isPainting = FALSE; } +#else // !debug + inline static void wxStartPainting() { } + inline static void wxEndPainting() { } +#endif // debug/!debug + // --------------------------------------------------------------------------- // private functions // --------------------------------------------------------------------------- @@ -231,12 +249,6 @@ void wxWindow::Init() m_doubleClickAllowed = 0; m_winCaptured = FALSE; - // caret stuff: initially there is no caret at all - m_caretWidth = - m_caretHeight = 0; - m_caretEnabled = - m_caretShown = FALSE; - m_isBeingDeleted = FALSE; m_oldWndProc = 0; m_useCtl3D = FALSE; @@ -891,7 +903,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) return exStyle; } -#if WXWIN_COMPATIBILITY_2 +#if WXWIN_COMPATIBILITY // If nothing defined for this, try the parent. // E.g. we may be a button loaded from a resource, with no callback function // defined. @@ -1006,7 +1018,7 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect) // drag and drop // --------------------------------------------------------------------------- -#if wxUSE_DRAG_AND_DROP +#if wxUSE_DRAG_AND_DROP void wxWindow::SetDropTarget(wxDropTarget *pDropTarget) { @@ -1260,7 +1272,8 @@ int wxWindow::GetCharWidth() const return lpTextMetric.tmAveCharWidth; } -void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, +void wxWindow::GetTextExtent(const wxString& string, + int *x, int *y, int *descent, int *externalLeading, const wxFont *theFont) const { @@ -1296,51 +1309,47 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, if ( externalLeading ) *externalLeading = tm.tmExternalLeading; } +#if wxUSE_CARET && WXWIN_COMPATIBILITY // --------------------------------------------------------------------------- // Caret manipulation // --------------------------------------------------------------------------- void wxWindow::CreateCaret(int w, int h) { - m_caretWidth = w; - m_caretHeight = h; - m_caretEnabled = TRUE; + SetCaret(new wxCaret(this, w, h)); } void wxWindow::CreateCaret(const wxBitmap *WXUNUSED(bitmap)) { - // Not implemented + wxFAIL_MSG("not implemented"); } void wxWindow::ShowCaret(bool show) { - if ( m_caretEnabled ) - { - if ( show ) - ::ShowCaret(GetHwnd()); - else - ::HideCaret(GetHwnd()); - m_caretShown = show; - } + wxCHECK_RET( m_caret, "no caret to show" ); + + m_caret->Show(show); } void wxWindow::DestroyCaret() { - m_caretEnabled = FALSE; + SetCaret(NULL); } void wxWindow::SetCaretPos(int x, int y) { - ::SetCaretPos(x, y); + wxCHECK_RET( m_caret, "no caret to move" ); + + m_caret->Move(x, y); } void wxWindow::GetCaretPos(int *x, int *y) const { - POINT point; - ::GetCaretPos(&point); - *x = point.x; - *y = point.y; + wxCHECK_RET( m_caret, "no caret to get position of" ); + + m_caret->GetPosition(x, y); } +#endif // wxUSE_CARET // =========================================================================== // pre/post message processing @@ -1552,7 +1561,7 @@ void wxWindow::UnpackScroll(WXWPARAM wParam, WXLPARAM lParam, void wxWindow::UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam, WXWORD *nCtlColor, WXHDC *hdc, WXHWND *hwnd) { - *control = (WXHWND)LOWORD(lParam); + *hwnd = (WXHWND)LOWORD(lParam); *nCtlColor = (int)HIWORD(lParam); *hdc = (WXHDC)wParam; } @@ -1679,7 +1688,9 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; case WM_PAINT: + wxStartPainting(); processed = HandlePaint(); + wxEndPainting(); break; case WM_CLOSE: @@ -1768,6 +1779,14 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) } break; + case WM_GETDLGCODE: + if ( GetWindowStyleFlag() & wxWANTS_CHARS ) + { + rc.result = DLGC_WANTARROWS | DLGC_WANTCHARS | DLGC_WANTTAB; + processed = TRUE; + } + break; + case WM_KEYDOWN: // If this has been processed by an event handler, // return 0 now (we've handled it). @@ -1926,7 +1945,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; case WM_GETMINMAXINFO: - processed = HandleGetMinMaxInfo((LPMINMAXINFO)lParam); + processed = HandleGetMinMaxInfo((MINMAXINFO*)lParam); break; case WM_SETCURSOR: @@ -2068,7 +2087,11 @@ bool wxWindow::MSWCreate(int id, if ( width > -1 ) width1 = width; if ( height > -1 ) height1 = height; +#ifdef __WXWINE__ + HWND hParent = (HWND)NULL; +#else HWND hParent = NULL; +#endif if ( parent ) hParent = (HWND) parent->GetHWND(); @@ -2089,7 +2112,22 @@ bool wxWindow::MSWCreate(int id, return FALSE; } - ::MoveWindow(GetHwnd(), x1, y1, width1, height1, FALSE); + // ::SetWindowLong(GWL_EXSTYLE) doesn't work for the dialogs, so try + // to take care of (at least some) extended style flags ourselves + if ( extendedStyle & WS_EX_TOPMOST ) + { + if ( !::SetWindowPos(GetHwnd(), HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE) ) + { + wxLogLastError("SetWindowPos"); + } + } + + // move the dialog to its initial position without forcing repainting + if ( !::MoveWindow(GetHwnd(), x1, y1, width1, height1, FALSE) ) + { + wxLogLastError("MoveWindow"); + } } else { @@ -2277,20 +2315,13 @@ bool wxWindow::HandleActivate(int state, bool wxWindow::HandleSetFocus(WXHWND WXUNUSED(hwnd)) { +#if wxUSE_CARET // Deal with caret - if ( m_caretEnabled && (m_caretWidth > 0) && (m_caretHeight > 0) ) + if ( m_caret ) { - if ( ::CreateCaret(GetHwnd(), NULL, m_caretWidth, m_caretHeight) ) - { - if ( m_caretShown ) - { - if ( !::ShowCaret(GetHwnd()) ) - wxLogLastError("ShowCaret"); - } - } - else - wxLogLastError("CreateCaret"); + m_caret->OnSetFocus(); } +#endif // wxUSE_CARET // panel wants to track the window which was the last to have focus in it wxWindow *parent = GetParent(); @@ -2307,12 +2338,13 @@ bool wxWindow::HandleSetFocus(WXHWND WXUNUSED(hwnd)) bool wxWindow::HandleKillFocus(WXHWND WXUNUSED(hwnd)) { +#if wxUSE_CARET // Deal with caret - if ( m_caretEnabled ) + if ( m_caret ) { - if ( !::DestroyCaret() ) - wxLogLastError("DestroyCaret"); + m_caret->OnKillFocus(); } +#endif // wxUSE_CARET wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId); event.SetEventObject(this); @@ -2426,13 +2458,13 @@ bool wxWindow::HandleSetCursor(WXHWND hWnd, return FALSE; } -#if wxUSE_OWNER_DRAWN // --------------------------------------------------------------------------- // owner drawn stuff // --------------------------------------------------------------------------- bool wxWindow::MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *itemStruct) { +#if wxUSE_OWNER_DRAWN // is it a menu item? if ( id == 0 ) { @@ -2462,11 +2494,14 @@ bool wxWindow::MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *itemStruct) return ((wxControl *)item)->MSWOnDraw(itemStruct); } else +#endif return FALSE; + } bool wxWindow::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct) { +#if wxUSE_OWNER_DRAWN // is it a menu item? if ( id == 0 ) { @@ -2484,10 +2519,9 @@ bool wxWindow::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct) { return ((wxControl *)item)->MSWOnMeasure(itemStruct); } - +#endif // owner-drawn menus return FALSE; } -#endif // owner-drawn menus // --------------------------------------------------------------------------- // colours and palettes