#endif
#endif
-// ---------------------------------------------------------------------------
-// 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))
-#endif // GET_X_LPARAM
-
// ---------------------------------------------------------------------------
// global variables
// ---------------------------------------------------------------------------
// event tables
// ---------------------------------------------------------------------------
- IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
+IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
EVT_INIT_DIALOG(wxWindow::OnInitDialog)
EVT_IDLE(wxWindow::OnIdle)
+ EVT_SET_FOCUS(wxWindow::OnSetFocus)
END_EVENT_TABLE()
// ===========================================================================
// here we try to do all the job which ::IsDialogMessage() usually does
// internally
-#if 0
+#if 1
bool bProcess = TRUE;
if ( msg->message != WM_KEYDOWN )
bProcess = FALSE;
if ( width > -1 ) width1 = width;
if ( height > -1 ) height1 = height;
+ // Unfortunately this won't work in WIN16. Unless perhaps
+ // we define WS_EX_CONTROLPARENT ourselves?
+#ifndef __WIN16__
+ // if we have wxTAB_TRAVERSAL style, we want WS_EX_CONTROLPARENT or
+ // IsDialogMessage() won't work for us
+ if ( GetWindowStyleFlag() & wxTAB_TRAVERSAL )
+ {
+ extendedStyle |= WS_EX_CONTROLPARENT;
+ }
+#endif
+
HWND hParent = (HWND)NULL;
if ( parent )
hParent = (HWND) parent->GetHWND();
// activation/focus
// ---------------------------------------------------------------------------
+void wxWindow::OnSetFocus(wxFocusEvent& event)
+{
+ // panel wants to track the window which was the last to have focus in it,
+ // so we want to set ourselves as the window which last had focus
+ //
+ // notice that it's also important to do it upwards the tree becaus
+ // otherwise when the top level panel gets focus, it won't set it back to
+ // us, but to some other sibling
+ wxWindow *win = this;
+ while ( win )
+ {
+ wxWindow *parent = win->GetParent();
+ wxPanel *panel = wxDynamicCast(parent, wxPanel);
+ if ( panel )
+ {
+ panel->SetLastFocus(win);
+ }
+
+ win = parent;
+ }
+
+ wxLogTrace(_T("focus"), _T("%s (0x%08x) gets focus"),
+ GetClassInfo()->GetClassName(), GetHandle());
+
+ event.Skip();
+}
+
bool wxWindow::HandleActivate(int state,
bool WXUNUSED(minimized),
WXHWND WXUNUSED(activate))
}
#endif // wxUSE_CARET
- // panel wants to track the window which was the last to have focus in it
- wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
- if ( panel )
- {
- panel->SetLastFocus(this);
- }
-
wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
event.SetEventObject(this);
if ( win )
return win->MSWCommand(cmd, id);
+ else
+ {
+ // If no child window, it may be an accelerator, e.g. for
+ // a popup menu command.
+
+ wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED);
+ event.SetEventObject(this);
+ event.SetId(id);
+ event.SetInt(id);
+ return ProcessEvent(event);
+ }
return FALSE;
}
event.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN;
break;
- case SB_THUMBTRACK:
case SB_THUMBPOSITION:
+ event.m_isScrolling = FALSE;
+ /* fall-through */
+
+ case SB_THUMBTRACK:
event.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
break;
return NULL;
}
+extern wxWindow *wxGetWindowFromHWND(WXHWND hWnd)
+{
+ HWND hwnd = (HWND)hWnd;
+
+ // For a radiobutton, we get the radiobox from GWL_USERDATA (which is set
+ // by code in msw/radiobox.cpp), for all the others we just search up the
+ // window hierarchy
+ wxWindow *win = (wxWindow *)NULL;
+ if ( hwnd )
+ {
+ win = wxFindWinFromHandle((WXHWND)hwnd);
+ if ( !win )
+ {
+ // the radiobox pointer is stored in GWL_USERDATA only under Win32
+#ifdef __WIN32__
+ // native radiobuttons return DLGC_RADIOBUTTON here and for any
+ // wxWindow class which overrides WM_GETDLGCODE processing to
+ // do it as well, win would be already non NULL
+ if ( ::SendMessage((HWND)hwnd, WM_GETDLGCODE,
+ 0, 0) & DLGC_RADIOBUTTON )
+ {
+ win = (wxWindow *)::GetWindowLong(hwnd, GWL_USERDATA);
+ }
+ else
+#endif // Win32
+ {
+ // hwnd is not a wxWindow, try its parent next below
+ hwnd = ::GetParent(hwnd);
+ }
+ }
+ //else: it's a wxRadioButton, not a radiobutton from wxRadioBox
+ }
+
+ while ( hwnd && !win )
+ {
+ win = wxFindWinFromHandle((WXHWND)hwnd);
+ hwnd = ::GetParent(hwnd);
+ }
+
+ return win;
+}
+
// Windows keyboard hook. Allows interception of e.g. F1, ESCAPE
// in active frames and dialogs, regardless of where the focus is.
static HHOOK wxTheKeyboardHook = 0;
wxTheKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) wxTheKeyboardHookProc, wxGetInstance(),
#if defined(__WIN32__) && !defined(__TWIN32__)
- GetCurrentThreadId());
+ GetCurrentThreadId()
// (DWORD)GetCurrentProcess()); // This is another possibility. Which is right?
#else
- GetCurrentTask());
+ GetCurrentTask()
#endif
+ );
}
else
{