#if !defined(__WXWINCE__)
case WM_CONTEXTMENU:
{
+ // As with WM_HELP above, this message is propagated upwards
+ // the parent chain by DefWindowProc() itself, so we should
+ // always mark it as processed to prevent it from doing this
+ // as this would result in duplicate calls to event handlers.
+ processed = true;
+
// we don't convert from screen to client coordinates as
// the event may be handled by a parent window
wxPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
win = this;
evtCtx.SetEventObject(win);
- processed = win->HandleWindowEvent(evtCtx);
+ win->HandleWindowEvent(evtCtx);
}
break;
#endif
::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1);
- if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) )
+ int x = rc.left,
+ y = rc.top;
+ MSWAdjustBrushOrg(&x, &y);
+
+ if ( !::SetBrushOrgEx((HDC)hDC, -x, -y, NULL) )
{
wxLogLastError(wxT("SetBrushOrgEx(bg brush)"));
}
return HandleWindowEvent(event);
}
-bool wxWindowMSW::HandleSize(int WXUNUSED(w), int WXUNUSED(h), WXUINT wParam)
+bool wxWindowMSW::BeginRepositioningChildren()
{
#if wxUSE_DEFERRED_SIZING
- // when we resize this window, its children are probably going to be
- // repositioned as well, prepare to use DeferWindowPos() for them
int numChildren = 0;
for ( HWND child = ::GetWindow(GetHwndOf(this), GW_CHILD);
child;
numChildren ++;
}
+ // Nothing is gained by deferring the repositioning of a single child.
+ if ( numChildren < 2 )
+ return false;
+
// Protect against valid m_hDWP being overwritten
- bool useDefer = false;
+ if ( m_hDWP )
+ return false;
- if ( numChildren > 1 )
+ m_hDWP = (WXHANDLE)::BeginDeferWindowPos(numChildren);
+ if ( !m_hDWP )
{
- if (!m_hDWP)
- {
- m_hDWP = (WXHANDLE)::BeginDeferWindowPos(numChildren);
- if ( !m_hDWP )
- {
- wxLogLastError(wxT("BeginDeferWindowPos"));
- }
- if (m_hDWP)
- useDefer = true;
- }
+ wxLogLastError(wxT("BeginDeferWindowPos"));
+ return false;
}
+
+ // Return true to indicate that EndDeferWindowPos() should be called.
+ return true;
#endif // wxUSE_DEFERRED_SIZING
+}
+
+void wxWindowMSW::EndRepositioningChildren()
+{
+#if wxUSE_DEFERRED_SIZING
+ wxASSERT_MSG( m_hDWP, wxS("Shouldn't be called") );
+
+ // reset m_hDWP to NULL so that child windows don't try to use our
+ // m_hDWP after we call EndDeferWindowPos() on it (this shouldn't
+ // happen anyhow normally but who knows what weird flow of control we
+ // may have depending on what the users EVT_SIZE handler does...)
+ HDWP hDWP = (HDWP)m_hDWP;
+ m_hDWP = NULL;
+
+ // do put all child controls in place at once
+ if ( !::EndDeferWindowPos(hDWP) )
+ {
+ wxLogLastError(wxT("EndDeferWindowPos"));
+ }
+
+ // Reset our children's pending pos/size values.
+ for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
+ node;
+ node = node->GetNext() )
+ {
+ wxWindowMSW * const child = node->GetData();
+ child->MSWEndDeferWindowPos();
+ }
+#endif // wxUSE_DEFERRED_SIZING
+}
+
+bool wxWindowMSW::HandleSize(int WXUNUSED(w), int WXUNUSED(h), WXUINT wParam)
+{
+ // when we resize this window, its children are probably going to be
+ // repositioned as well, prepare to use DeferWindowPos() for them
+ ChildrenRepositioningGuard repositionGuard(this);
// update this window size
bool processed = false;
processed = HandleWindowEvent(event);
}
-#if wxUSE_DEFERRED_SIZING
- // and finally change the positions of all child windows at once
- if ( useDefer && m_hDWP )
- {
- // reset m_hDWP to NULL so that child windows don't try to use our
- // m_hDWP after we call EndDeferWindowPos() on it (this shouldn't
- // happen anyhow normally but who knows what weird flow of control we
- // may have depending on what the users EVT_SIZE handler does...)
- HDWP hDWP = (HDWP)m_hDWP;
- m_hDWP = NULL;
-
- // do put all child controls in place at once
- if ( !::EndDeferWindowPos(hDWP) )
- {
- wxLogLastError(wxT("EndDeferWindowPos"));
- }
-
- // Reset our children's pending pos/size values.
- for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindowMSW * const child = node->GetData();
- child->MSWEndDeferWindowPos();
- }
- }
-#endif // wxUSE_DEFERRED_SIZING
-
return processed;
}
// the messages sent from the in-place edit control used by the treectrl
// for label editing have id == 0, but they should _not_ be treated as menu
// messages (they are EN_XXX ones, in fact) so don't translate anything
- // coming from a control to wxEVT_COMMAND_MENU_SELECTED
+ // coming from a control to wxEVT_MENU
if ( !control )
{
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id);
+ wxCommandEvent event(wxEVT_MENU, id);
event.SetEventObject(this);
event.SetInt(id);
bool wxWindowMSW::HandleClipboardEvent(WXUINT nMsg)
{
- const wxEventType type = nMsg == WM_CUT ? wxEVT_COMMAND_TEXT_CUT
- : nMsg == WM_COPY ? wxEVT_COMMAND_TEXT_COPY
- : /* nMsg == WM_PASTE */ wxEVT_COMMAND_TEXT_PASTE;
+ const wxEventType type = nMsg == WM_CUT ? wxEVT_TEXT_CUT
+ : nMsg == WM_COPY ? wxEVT_TEXT_COPY
+ : /* nMsg == WM_PASTE */ wxEVT_TEXT_PASTE;
wxClipboardTextEvent evt(type, GetId());
evt.SetEventObject(this);
case VK_DELETE:
wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DELETE, WXK_DELETE);
+
+ if ( uc )
+ *uc = WXK_DELETE;
break;
case VK_RETURN:
DWORD hiWord = HIWORD(lParam);
if ( nCode != HC_NOREMOVE && ((hiWord & KF_UP) == 0) )
{
- wchar_t uc;
+ wchar_t uc = 0;
int id = wxMSWKeyboard::VKToWX(wParam, lParam, &uc);
// Don't intercept keyboard entry (notably Escape) if a modal window
return true;
}
-#if wxUSE_ACCEL
-
bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam)
{
int win_modifiers = LOWORD(lParam);
return HandleWindowEvent(event);
}
-#endif // wxUSE_ACCEL
-
#endif // wxUSE_HOTKEY
// Not tested under WinCE