wxToolTip for MSW implementation (it has several problems right now, but it

still works)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1541 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-01-31 23:38:10 +00:00
parent 6e0d9d4331
commit 3a19e16d18
4 changed files with 523 additions and 211 deletions

View File

@ -27,164 +27,187 @@ WXDLLEXPORT_DATA(extern const char*) wxStatusLineNameStr;
class WXDLLEXPORT wxMenuBar;
class WXDLLEXPORT wxStatusBar;
class WXDLLEXPORT wxFrame: public wxWindow {
DECLARE_DYNAMIC_CLASS(wxFrame)
class WXDLLEXPORT wxFrame : public wxWindow
{
DECLARE_DYNAMIC_CLASS(wxFrame)
public:
wxFrame(void);
inline wxFrame(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
const wxString& name = wxFrameNameStr)
{
Create(parent, id, title, pos, size, style, name);
}
wxFrame();
wxFrame(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
const wxString& name = wxFrameNameStr)
{
Create(parent, id, title, pos, size, style, name);
}
~wxFrame();
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
const wxString& name = wxFrameNameStr);
virtual bool Destroy();
void SetClientSize(int width, int height);
void SetClientSize(const wxSize& sz) { wxWindow::SetClientSize(sz); }
void GetClientSize(int *width, int *height) const;
wxSize GetClientSize() const { return wxWindow::GetClientSize(); }
void GetSize(int *width, int *height) const ;
wxSize GetSize() const { return wxWindow::GetSize(); }
void GetPosition(int *x, int *y) const ;
wxPoint GetPosition() const { return wxWindow::GetPosition(); }
virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
virtual void ClientToScreen(int *x, int *y) const;
virtual void ScreenToClient(int *x, int *y) const;
virtual bool OnClose();
void OnSize(wxSizeEvent& event);
void OnMenuHighlight(wxMenuEvent& event);
void OnActivate(wxActivateEvent& event);
void OnIdle(wxIdleEvent& event);
void OnCloseWindow(wxCloseEvent& event);
bool Show(bool show);
// Set menu bar
void SetMenuBar(wxMenuBar *menu_bar);
virtual wxMenuBar *GetMenuBar() const ;
// Set title
void SetTitle(const wxString& title);
wxString GetTitle() const ;
void Centre(int direction = wxBOTH);
// Call this to simulate a menu command
virtual void Command(int id);
virtual void ProcessCommand(int id);
// Set icon
virtual void SetIcon(const wxIcon& icon);
// Toolbar
virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT,
wxWindowID id = -1,
const wxString& name = wxToolBarNameStr);
~wxFrame(void);
virtual wxToolBar *OnCreateToolBar(long style, wxWindowID id, const wxString& name);
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
const wxString& name = wxFrameNameStr);
virtual void SetToolBar(wxToolBar *toolbar) { m_frameToolBar = toolbar; }
virtual wxToolBar *GetToolBar() const { return m_frameToolBar; }
virtual bool Destroy(void);
virtual void PositionToolBar();
// Status bar
virtual wxStatusBar* CreateStatusBar(int number = 1,
long style = wxST_SIZEGRIP,
wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr);
void SetClientSize(int width, int height);
void SetClientSize(const wxSize& sz) { wxWindow::SetClientSize(sz); }
wxStatusBar *GetStatusBar() const { return m_frameStatusBar; }
void SetStatusBar(wxStatusBar *statusBar) { m_frameStatusBar = statusBar; }
void GetClientSize(int *width, int *height) const;
wxSize GetClientSize() const { return wxWindow::GetClientSize(); }
void GetSize(int *width, int *height) const ;
wxSize GetSize() const { return wxWindow::GetSize(); }
void GetPosition(int *x, int *y) const ;
wxPoint GetPosition() const { return wxWindow::GetPosition(); }
virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
virtual void ClientToScreen(int *x, int *y) const;
virtual void ScreenToClient(int *x, int *y) const;
virtual bool OnClose(void);
void OnSize(wxSizeEvent& event);
void OnMenuHighlight(wxMenuEvent& event);
void OnActivate(wxActivateEvent& event);
void OnIdle(wxIdleEvent& event);
void OnCloseWindow(wxCloseEvent& event);
bool Show(bool show);
// Set menu bar
void SetMenuBar(wxMenuBar *menu_bar);
virtual wxMenuBar *GetMenuBar(void) const ;
// Set title
void SetTitle(const wxString& title);
wxString GetTitle(void) const ;
void Centre(int direction = wxBOTH);
// Call this to simulate a menu command
virtual void Command(int id);
virtual void ProcessCommand(int id);
// Set icon
virtual void SetIcon(const wxIcon& icon);
// Create status line
virtual wxStatusBar* CreateStatusBar(int number=1, long style = wxST_SIZEGRIP, wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr);
inline wxStatusBar *GetStatusBar() const { return m_frameStatusBar; }
inline void SetStatusBar(wxStatusBar *statusBar) { m_frameStatusBar = statusBar; }
virtual void PositionStatusBar(void);
virtual wxStatusBar *OnCreateStatusBar(int number, long style, wxWindowID id,
const wxString& name);
// Create toolbar
virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT,
wxWindowID id = -1,
const wxString& name = wxToolBarNameStr);
virtual wxToolBar *OnCreateToolBar(long style, wxWindowID id, const wxString& name);
// If made known to the frame, the frame will manage it automatically.
virtual inline void SetToolBar(wxToolBar *toolbar) { m_frameToolBar = toolbar; }
virtual inline wxToolBar *GetToolBar(void) const { return m_frameToolBar; }
virtual void PositionToolBar(void);
// Set status line text
virtual void SetStatusText(const wxString& text, int number = 0);
// Set status line widths
virtual void SetStatusWidths(int n, const int widths_field[]);
// Hint to tell framework which status bar to use
// TODO: should this go into a wxFrameworkSettings class perhaps?
static void UseNativeStatusBar(bool useNative) { m_useNativeStatusBar = useNative; };
static bool UsesNativeStatusBar(void) { return m_useNativeStatusBar; };
// Fit frame around subwindows
virtual void Fit(void);
// Iconize
virtual void Iconize(bool iconize);
virtual bool IsIconized(void) const ;
// Is it maximized?
virtual bool IsMaximized(void) const ;
// Compatibility
inline bool Iconized(void) const { return IsIconized(); }
virtual void Maximize(bool maximize);
// virtual bool LoadAccelerators(const wxString& table);
// Responds to colour changes
void OnSysColourChanged(wxSysColourChangedEvent& event);
// Query app for menu item updates (called from OnIdle)
void DoMenuUpdates(void);
void DoMenuUpdates(wxMenu* menu);
WXHMENU GetWinMenu(void) const ;
// Checks if there is a toolbar, and returns the first free client position
virtual wxPoint GetClientAreaOrigin() const;
// Handlers
bool MSWOnPaint(void);
WXHICON MSWOnQueryDragIcon(void);
void MSWOnSize(int x, int y, WXUINT flag);
bool MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control);
bool MSWOnClose(void);
void MSWOnMenuHighlight(WXWORD item, WXWORD flags, WXHMENU sysmenu);
bool MSWProcessMessage(WXMSG *msg);
bool MSWTranslateMessage(WXMSG *msg);
void MSWCreate(int id, wxWindow *parent, const char *WXUNUSED(wclass), wxWindow *wx_win, const char *title,
virtual void PositionStatusBar();
virtual wxStatusBar *OnCreateStatusBar(int number,
long style,
wxWindowID id,
const wxString& name);
// Set status line text
virtual void SetStatusText(const wxString& text, int number = 0);
// Set status line widths
virtual void SetStatusWidths(int n, const int widths_field[]);
// Hint to tell framework which status bar to use
// TODO: should this go into a wxFrameworkSettings class perhaps?
static void UseNativeStatusBar(bool useNative) { m_useNativeStatusBar = useNative; };
static bool UsesNativeStatusBar() { return m_useNativeStatusBar; };
// Fit frame around subwindows
virtual void Fit();
// Iconize
virtual void Iconize(bool iconize);
virtual bool IsIconized() const ;
// Is it maximized?
virtual bool IsMaximized() const ;
// Compatibility
bool Iconized() const { return IsIconized(); }
virtual void Maximize(bool maximize);
// virtual bool LoadAccelerators(const wxString& table);
// Responds to colour changes
void OnSysColourChanged(wxSysColourChangedEvent& event);
// Query app for menu item updates (called from OnIdle)
void DoMenuUpdates();
void DoMenuUpdates(wxMenu* menu);
WXHMENU GetWinMenu() const ;
// Returns the origin of client area (may be different from (0,0) if the
// frame has a toolbar)
virtual wxPoint GetClientAreaOrigin() const;
// Implementation only from here
// event handlers
bool MSWOnPaint();
WXHICON MSWOnQueryDragIcon();
void MSWOnSize(int x, int y, WXUINT flag);
bool MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control);
bool MSWOnClose();
void MSWOnMenuHighlight(WXWORD item, WXWORD flags, WXHMENU sysmenu);
bool MSWProcessMessage(WXMSG *msg);
bool MSWTranslateMessage(WXMSG *msg);
void MSWCreate(int id, wxWindow *parent, const char *wclass,
wxWindow *wx_win, const char *title,
int x, int y, int width, int height, long style);
// tooltip management
#if wxUSE_TOOLTIPS
WXHWND GetToolTipCtrl() const { return m_hwndToolTip; }
void SetToolTipCtrl(WXHWND hwndTT) { m_hwndToolTip = hwndTT; }
#endif // tooltips
protected:
// propagate our state change to all child frames
void IconizeChildFrames(bool bIconize);
// propagate our state change to all child frames
void IconizeChildFrames(bool bIconize);
wxMenuBar * m_frameMenuBar;
wxStatusBar * m_frameStatusBar;
wxIcon m_icon;
bool m_iconized;
WXHICON m_defaultIcon;
wxToolBar * m_frameToolBar ;
wxMenuBar * m_frameMenuBar;
wxStatusBar * m_frameStatusBar;
wxIcon m_icon;
bool m_iconized;
WXHICON m_defaultIcon;
static bool m_useNativeStatusBar;
wxToolBar * m_frameToolBar ;
static bool m_useNativeStatusBar;
DECLARE_EVENT_TABLE()
#if wxUSE_TOOLTIPS
WXHWND m_hwndToolTip;
#endif // tooltips
private:
DECLARE_EVENT_TABLE()
};
#endif

52
include/wx/msw/tooltip.h Normal file
View File

@ -0,0 +1,52 @@
///////////////////////////////////////////////////////////////////////////////
// Name: msw/tooltip.h
// Purpose: wxToolTip class - tooltip control
// Author: Vadim Zeitlin
// Modified by:
// Created: 31.01.99
// RCS-ID: $Id$
// Copyright: (c) 1999 Robert Roebling, Vadim Zeitlin
// Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////////
class wxToolTip : public wxObject
{
public:
// ctor & dtor
wxToolTip(const wxString &tip);
virtual ~wxToolTip();
// accessors
// tip text
void SetTip(const wxString& tip);
const wxString& GetTip() const { return m_text; }
// the window we're associated with
void SetWindow(wxWindow *win);
wxWindow *GetWindow() const { return m_window; }
// controlling tooltip behaviour: under MSW, these functions change the
// behaviour of the tooltips for all controls in the same frame as this
// one (it is an implementation limitation). Also, these functions won't
// do anything before the tooltip control is associated with a window, so
// SetWindow() should be called first
// enable or disable the tooltips globally
void Enable(bool flag);
// set the delay after which the tooltip appears
void SetDelay(long milliseconds);
// implementation
void RelayEvent(WXMSG *msg);
private:
// create the tooltip ctrl for our parent frame if it doesn't exist yet
// and return its window handle
WXHWND GetToolTipCtrl();
// remove this tooltip from the tooltip control
void Remove();
wxString m_text; // tooltip text
wxWindow *m_window; // window we're associated with
};

196
src/msw/tooltip.cpp Normal file
View File

@ -0,0 +1,196 @@
///////////////////////////////////////////////////////////////////////////////
// Name: msw/tooltip.cpp
// Purpose: wxToolTip class implementation for MSW
// Author: Vadim Zeitlin
// Modified by:
// Created: 31.01.99
// RCS-ID: $Id$
// Copyright: (c) 1999 Vadim Zeitlin
// Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/tooltip.h"
#include "wx/msw/private.h"
#include <commctrl.h>
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
// a simple wrapper around TOOLINFO Win32 structure
class wxToolInfo : public TOOLINFO
{
public:
wxToolInfo(wxWindow *win)
{
// initialize all members
::ZeroMemory(this, sizeof(TOOLINFO));
cbSize = sizeof(TOOLINFO);
uFlags = TTF_IDISHWND;
uId = (UINT)win->GetHWND();
}
};
// ----------------------------------------------------------------------------
// private functions
// ----------------------------------------------------------------------------
// send a message to the tooltip control
inline LRESULT SendTooltipMessage(WXHWND hwnd,
UINT msg,
WPARAM wParam,
void *lParam)
{
return hwnd ? ::SendMessage((HWND)hwnd, msg, wParam, (LPARAM)lParam)
: 0;
}
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// "semiglobal" functions - these methods work with the tooltip control which
// is shared among all the wxToolTips of the same frame
// ----------------------------------------------------------------------------
// create the tooltip ctrl for our parent frame if it doesn't exist yet
WXHWND wxToolTip::GetToolTipCtrl()
{
wxWindow *parent = m_window;
while ( parent && !parent->IsKindOf(CLASSINFO(wxFrame)) )
{
parent = parent->GetParent();
}
wxCHECK_MSG( parent, 0, "can't create tooltip control outside a frame" );
wxFrame *frame = (wxFrame *)parent;
HWND hwndTT = (HWND)frame->GetToolTipCtrl();
if ( !hwndTT )
{
hwndTT = ::CreateWindow(TOOLTIPS_CLASS,
(LPSTR)NULL,
TTS_ALWAYSTIP,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
(HWND)frame->GetHWND(), (HMENU)NULL,
wxGetInstance(), NULL);
if ( hwndTT )
{
frame->SetToolTipCtrl((WXHWND)hwndTT);
}
else
{
wxLogSysError(_("Can not create tooltip control"));
}
}
return (WXHWND)hwndTT;
}
void wxToolTip::Enable(bool flag)
{
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_ACTIVATE, flag, 0);
}
void wxToolTip::RelayEvent(WXMSG *msg)
{
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_RELAYEVENT, 0, msg);
}
void wxToolTip::SetDelay(long milliseconds)
{
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_SETDELAYTIME,
TTDT_INITIAL, (void *)milliseconds);
}
// ----------------------------------------------------------------------------
// ctor & dtor
// ----------------------------------------------------------------------------
wxToolTip::wxToolTip(const wxString &tip)
: m_text(tip)
{
m_window = NULL;
}
wxToolTip::~wxToolTip()
{
// there is no need to Remove() this tool - it will be done automatically
// anyhow
}
// ----------------------------------------------------------------------------
// others
// ----------------------------------------------------------------------------
void wxToolTip::Remove()
{
// remove this tool from the tooltip control
if ( m_window )
{
wxToolInfo ti(m_window);
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_DELTOOL, 0, &ti);
}
}
void wxToolTip::SetWindow(wxWindow *win)
{
Remove();
m_window = win;
if ( m_window )
{
wxToolInfo ti(m_window);
// as we store our text anyhow, it seems useless to waste system memory
// by asking the tooltip ctrl to remember it too - instead it will send
// us TTN_NEEDTEXT (via WM_NOTIFY) when it is about to be shown
ti.hwnd = (HWND)m_window->GetHWND();
ti.lpszText = LPSTR_TEXTCALLBACK;
// instead of: ti.lpszText = (char *)m_text.c_str();
if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, 0, &ti) )
{
wxLogSysError(_("Failed to create the tooltip '%s'"),
m_text.c_str());
}
}
}
void wxToolTip::SetTip(const wxString& tip)
{
m_text = tip;
if ( m_window )
{
// update it immediately
wxToolInfo ti(m_window);
ti.lpszText = (char *)m_text.c_str();
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, 0, &ti);
}
}

View File

@ -21,21 +21,21 @@
#endif
#ifndef WX_PRECOMP
#include <stdio.h>
#include "wx/setup.h"
#include "wx/menu.h"
#include "wx/dc.h"
#include "wx/dcclient.h"
#include "wx/utils.h"
#include "wx/app.h"
#include "wx/panel.h"
#include "wx/layout.h"
#include "wx/dialog.h"
#include "wx/frame.h"
#include "wx/listbox.h"
#include "wx/button.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
#include <stdio.h>
#include "wx/setup.h"
#include "wx/menu.h"
#include "wx/dc.h"
#include "wx/dcclient.h"
#include "wx/utils.h"
#include "wx/app.h"
#include "wx/panel.h"
#include "wx/layout.h"
#include "wx/dialog.h"
#include "wx/frame.h"
#include "wx/listbox.h"
#include "wx/button.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
#endif
#if wxUSE_OWNER_DRAWN
@ -48,25 +48,30 @@
#include "wx/menuitem.h"
#include "wx/log.h"
#include "wx/tooltip.h"
#include "wx/msw/private.h"
#include <string.h>
#ifndef __GNUWIN32__
#include <shellapi.h>
#include <mmsystem.h>
#include <shellapi.h>
#include <mmsystem.h>
#endif
#ifdef __WIN32__
#include <windowsx.h>
#include <windowsx.h>
#endif
#include <commctrl.h>
#ifndef __TWIN32__
#ifdef __GNUWIN32__
#include <wx/msw/gnuwin32/extra.h>
#endif
#ifdef __GNUWIN32__
#include <wx/msw/gnuwin32/extra.h>
#endif
#endif
// all these are defined in <windows.h>
#ifdef GetCharWidth
#undef GetCharWidth
#endif
@ -97,13 +102,11 @@ void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win);
wxWindow *wxFindWinFromHandle(WXHWND hWnd);
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
#endif
BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
EVT_CHAR(wxWindow::OnChar)
EVT_KEY_DOWN(wxWindow::OnKeyDown)
EVT_KEY_UP(wxWindow::OnKeyUp)
EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
EVT_INIT_DIALOG(wxWindow::OnInitDialog)
@ -179,9 +182,19 @@ bool wxWindow::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id))
}
bool wxWindow::MSWNotify(WXWPARAM WXUNUSED(wParam),
WXLPARAM WXUNUSED(lParam),
WXLPARAM lParam,
WXLPARAM* WXUNUSED(result))
{
NMHDR* hdr = (NMHDR *)lParam;
if ( hdr->code == TTN_NEEDTEXT && m_tooltip )
{
TOOLTIPTEXT *ttt = (TOOLTIPTEXT *)lParam;
ttt->lpszText = (char *)m_tooltip->GetTip().c_str();
// processed
return TRUE;
}
return FALSE;
}
@ -268,6 +281,8 @@ void wxWindow::Init()
#if wxUSE_DRAG_AND_DROP
m_pDropTarget = NULL;
#endif
m_tooltip = NULL;
}
wxWindow::wxWindow()
@ -280,6 +295,10 @@ wxWindow::~wxWindow()
{
m_isBeingDeleted = TRUE;
// first of all, delete the things on which nothing else depends
wxDELETE(m_tooltip);
// JACS - if behaviour is odd, restore this
// to the start of ~wxWindow. Vadim has changed
// it to nearer the end. Unsure of side-effects
@ -292,6 +311,7 @@ wxWindow::~wxWindow()
// delete themselves.
#if wxUSE_CONSTRAINTS
DeleteRelatedConstraints();
if (m_constraints)
{
// This removes any dangling pointers to this window
@ -300,11 +320,9 @@ wxWindow::~wxWindow()
delete m_constraints;
m_constraints = NULL;
}
if (m_windowSizer)
{
delete m_windowSizer;
m_windowSizer = NULL;
}
wxDELETE(m_windowSizer);
// If this is a child of a sizer, remove self from parent
if (m_sizerParent)
m_sizerParent->RemoveChild((wxWindow *)this);
@ -501,7 +519,8 @@ void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
m_pDropTarget->Register(m_hWnd);
}
#endif
#endif // wxUSE_DRAG_AND_DROP
//old style file-manager drag&drop support
// I think we should retain the old-style
@ -514,6 +533,24 @@ void wxWindow::DragAcceptFiles(bool accept)
::DragAcceptFiles(hWnd, (BOOL)accept);
}
// ----------------------------------------------------------------------------
// tooltips
// ----------------------------------------------------------------------------
void wxWindow::SetToolTip(const wxString &tip)
{
SetToolTip(new wxToolTip(tip));
}
void wxWindow::SetToolTip(wxToolTip *tooltip)
{
if ( m_tooltip )
delete m_tooltip;
m_tooltip = tooltip;
m_tooltip->SetWindow(this);
}
// Get total size
void wxWindow::GetSize(int *x, int *y) const
{
@ -882,7 +919,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
#ifdef __WXDEBUG__
wxLogTrace(wxTraceMessages, "Processing %s(%lx, %lx)",
wxGetMessageName(message), wParam, lParam);
wxGetMessageName(message), wParam, lParam);
#endif // __WXDEBUG__
HWND hWnd = (HWND)m_hWnd;
@ -1164,10 +1201,10 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
break;
}
#if 0
case WM_KEYDOWN:
{
MSWOnKeyDown((WORD) wParam, lParam);
#if 0
// we consider these message "not interesting"
if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
return Default();
@ -1185,9 +1222,9 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
MSWOnChar((WORD)wParam, lParam);
else
return Default();
#endif
break;
}
#endif
case WM_KEYUP:
{
@ -1902,14 +1939,19 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0);
}
bool bForward = TRUE;
bool bForward = TRUE,
bWindowChange = FALSE;
if ( bProcess ) {
switch ( msg->wParam ) {
case VK_TAB:
if ( lDlgCode & DLGC_WANTTAB ) // FALSE for Ctrl-Tab
if ( lDlgCode & DLGC_WANTTAB ) {
bProcess = FALSE;
else
}
else {
// Ctrl-Tab cycles thru notebook pages
bWindowChange = bCtrlDown;
bForward = !(::GetKeyState(VK_SHIFT) & 0x100);
}
break;
case VK_UP:
@ -1926,6 +1968,18 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
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;
}
@ -1934,7 +1988,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
if ( bProcess ) {
wxNavigationKeyEvent event;
event.SetDirection(bForward);
event.SetWindowChange(bCtrlDown);
event.SetWindowChange(bWindowChange);
event.SetEventObject(this);
if ( GetEventHandler()->ProcessEvent(event) )
@ -1943,6 +1997,14 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
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;
}
@ -3049,13 +3111,6 @@ void wxWindow::Centre(int direction)
}
/* TODO (maybe)
void wxWindow::OnPaint()
{
PaintSelectionHandles();
}
*/
void wxWindow::WarpPointer (int x_pos, int y_pos)
{
// Move the pointer to (x_pos,y_pos) coordinates. They are expressed in
@ -3550,17 +3605,17 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D)
void wxWindow::OnChar(wxKeyEvent& event)
{
/* I'm commenting this out because otherwise, we lose tabs in e.g. a text window (see MDI sample)
* (JACS, 14/01/99)
#if 0
if ( event.KeyCode() == WXK_TAB ) {
// propagate the TABs to the parent - it's up to it to decide what
// to do with it
if ( GetParent() ) {
if ( GetParent()->GetEventHandler()->ProcessEvent(event) )
wxWindow *parent = GetParent();
if ( parent ) {
if ( parent->GetEventHandler()->ProcessEvent(event) )
return;
}
}
*/
#endif // 0
bool isVirtual;
int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual);
@ -3572,21 +3627,6 @@ void wxWindow::OnChar(wxKeyEvent& event)
(void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam);
}
void wxWindow::OnKeyDown(wxKeyEvent& event)
{
Default();
}
void wxWindow::OnKeyUp(wxKeyEvent& event)
{
Default();
}
void wxWindow::OnPaint(wxPaintEvent& event)
{
Default();
}
bool wxWindow::IsEnabled(void) const
{
return (::IsWindowEnabled((HWND) GetHWND()) != 0);
@ -4427,6 +4467,7 @@ long wxWindow::MSWGetDlgCode()
bool wxWindow::AcceptsFocus() const
{
// invisible and disabled controls don't need focus
return IsShown() && IsEnabled();
}