X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34636400a0018eba4a1f63dda18cf32e944b959e..051205e611a461fa3c23d37a1bfa648834b885a0:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 7d1f201647..5a5d8f6434 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -117,18 +117,7 @@ extern MSG s_currentMsg; 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 +extern wxChar wxCanvasClassName[]; // --------------------------------------------------------------------------- // private functions @@ -301,7 +290,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { - wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" ); + wxCHECK_MSG( parent, FALSE, _T("can't create wxWindow without parent") ); CreateBase(parent, id, pos, size, style, name); @@ -328,6 +317,20 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, msflags |= WS_BORDER; } + // calculate the value to return from WM_GETDLGCODE handler + if ( GetWindowStyleFlag() & wxWANTS_CHARS ) + { + // want everything: i.e. all keys and WM_CHAR message + m_lDlgCode = DLGC_WANTARROWS | DLGC_WANTCHARS | + DLGC_WANTTAB | DLGC_WANTMESSAGE; + + } + else + { + // default behaviour + m_lDlgCode = 0; + } + MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL, pos.x, pos.y, WidthDefault(size.x), HeightDefault(size.y), @@ -796,7 +799,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) void wxWindow::SubclassWin(WXHWND hWnd) { - wxASSERT_MSG( !m_oldWndProc, "subclassing window twice?" ); + wxASSERT_MSG( !m_oldWndProc, _T("subclassing window twice?") ); wxAssociateWinWithHandle((HWND)hWnd, this); @@ -903,7 +906,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. @@ -1295,7 +1298,7 @@ void wxWindow::GetTextExtent(const wxString& string, SIZE sizeRect; TEXTMETRIC tm; - GetTextExtentPoint(dc, (const char *)string, (int)string.Length(), &sizeRect); + GetTextExtentPoint(dc, (const wxChar *)string, (int)string.Length(), &sizeRect); GetTextMetrics(dc, &tm); if ( fontToUse && fnt && hfontOld ) @@ -1309,7 +1312,7 @@ void wxWindow::GetTextExtent(const wxString& string, if ( externalLeading ) *externalLeading = tm.tmExternalLeading; } -#if wxUSE_CARET +#if wxUSE_CARET && WXWIN_COMPATIBILITY // --------------------------------------------------------------------------- // Caret manipulation // --------------------------------------------------------------------------- @@ -1421,27 +1424,16 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg) case VK_RETURN: { - if ( lDlgCode & DLGC_WANTMESSAGE ) + if ( (lDlgCode & DLGC_WANTMESSAGE) && !bCtrlDown ) { // control wants to process Enter itself, don't // call IsDialogMessage() which would interpret // it return FALSE; } -#ifndef __WIN16__ - wxButton *btnDefault = GetDefaultItem(); - if ( btnDefault && !bCtrlDown ) - { - // if there is a default button, Enter should - // press it - (void)::SendMessage((HWND)btnDefault->GetHWND(), - BM_CLICK, 0, 0); - return TRUE; - } - // else: but if there is not it makes sense to make it + // else: but if it does not it makes sense to make it // work like a TAB - and that's what we do. // Note that Ctrl-Enter always works this way. -#endif } break; @@ -1561,7 +1553,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; } @@ -1589,7 +1581,7 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA { // trace all messages - useful for the debugging #ifdef __WXDEBUG__ - wxLogTrace(wxTraceMessages, "Processing %s(wParam=%8lx, lParam=%8lx)", + wxLogTrace(wxTraceMessages, _T("Processing %s(wParam=%8lx, lParam=%8lx)"), wxGetMessageName(message), wParam, lParam); #endif // __WXDEBUG__ @@ -1688,9 +1680,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; case WM_PAINT: - wxStartPainting(); processed = HandlePaint(); - wxEndPainting(); break; case WM_CLOSE: @@ -1780,11 +1770,12 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) break; case WM_GETDLGCODE: - if ( GetWindowStyleFlag() & wxWANTS_CHARS ) + if ( m_lDlgCode ) { - rc.result = DLGC_WANTARROWS | DLGC_WANTCHARS | DLGC_WANTTAB; + rc.result = m_lDlgCode; processed = TRUE; } + //else: get the dlg code from the DefWindowProc() break; case WM_KEYDOWN: @@ -1814,7 +1805,10 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) case VK_RETURN: case VK_BACK: case VK_TAB: - processed = TRUE; + // but set processed to FALSE, not TRUE to still pass them to + // the control's default window proc - otherwise built-in + // keyboard handling won't work + processed = FALSE; break; @@ -1945,7 +1939,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: @@ -1966,7 +1960,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) if ( !processed ) { #ifdef __WXDEBUG__ - wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.", + wxLogTrace(wxTraceMessages, _T("Forwarding %s to DefWindowProc."), wxGetMessageName(message)); #endif // __WXDEBUG__ rc.result = MSWDefWindowProc(message, wParam, lParam); @@ -2007,7 +2001,7 @@ 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 ignored" ); + _T("attempt to add a NULL hWnd to window list ignored") ); if ( !wxWinHandleList->Find((long)hWnd) ) wxWinHandleList->Append((long)hWnd, win); @@ -2034,16 +2028,16 @@ void wxWindow::MSWDetachWindowMenu() int i; for (i = 0; i < N; i++) { - char buf[100]; + wxChar buf[100]; int chars = GetMenuString(hMenu, i, buf, 100, MF_BYPOSITION); if ( !chars ) { - wxLogLastError("GetMenuString"); + wxLogLastError(_T("GetMenuString")); continue; } - if ( strcmp(buf, "&Window") == 0 ) + if ( wxStrcmp(buf, _T("&Window")) == 0 ) { RemoveMenu(hMenu, i, MF_BYPOSITION); @@ -2055,15 +2049,15 @@ void wxWindow::MSWDetachWindowMenu() bool wxWindow::MSWCreate(int id, wxWindow *parent, - const char *wclass, + const wxChar *wclass, wxWindow *wx_win, - const char *title, + const wxChar *title, int x, int y, int width, int height, WXDWORD style, - const char *dialog_template, + const wxChar *dialog_template, WXDWORD extendedStyle) { int x1 = CW_USEDEFAULT; @@ -2087,7 +2081,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(); @@ -2115,14 +2113,14 @@ bool wxWindow::MSWCreate(int id, if ( !::SetWindowPos(GetHwnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE) ) { - wxLogLastError("SetWindowPos"); + wxLogLastError(_T("SetWindowPos")); } } // move the dialog to its initial position without forcing repainting if ( !::MoveWindow(GetHwnd(), x1, y1, width1, height1, FALSE) ) { - wxLogLastError("MoveWindow"); + wxLogLastError(_T("MoveWindow")); } } else @@ -2133,7 +2131,7 @@ bool wxWindow::MSWCreate(int id, m_hWnd = (WXHWND)CreateWindowEx(extendedStyle, wclass, - title ? title : "", + title ? title : _T(""), style, x1, y1, width1, height1, @@ -2207,7 +2205,7 @@ bool wxWindow::MSWOnNotify(int WXUNUSED(idCtrl), if ( hdr->code == TTN_NEEDTEXT && m_tooltip ) { TOOLTIPTEXT *ttt = (TOOLTIPTEXT *)lParam; - ttt->lpszText = (char *)m_tooltip->GetTip().c_str(); + ttt->lpszText = (wxChar *)m_tooltip->GetTip().c_str(); // processed return TRUE; @@ -2384,7 +2382,7 @@ bool wxWindow::HandleDropFiles(WXWPARAM wParam) int wIndex; for (wIndex=0; wIndex < (int)gwFilesDropped; wIndex++) { - DragQueryFile (hFilesInfo, wIndex, (LPSTR) wxBuffer, 1000); + DragQueryFile (hFilesInfo, wIndex, (LPTSTR) wxBuffer, 1000); files[wIndex] = wxBuffer; } DragFinish (hFilesInfo); @@ -2454,13 +2452,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 ) { @@ -2490,11 +2488,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 ) { @@ -2512,10 +2513,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 @@ -3095,7 +3095,7 @@ bool wxWindow::HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags) break; default: - wxFAIL_MSG("no such joystick event"); + wxFAIL_MSG(_T("no such joystick event")); return FALSE; }