#include "wx/spinctrl.h"
#include "wx/msw/private.h"
-#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
+#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) || defined(__TWIN32__))
#include <commctrl.h>
#endif
// implementation
// ============================================================================
+// ----------------------------------------------------------------------------
+// wnd proc for the buddy text ctrl
+// ----------------------------------------------------------------------------
+
+LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ wxSpinCtrl *spin = (wxSpinCtrl *)::GetWindowLong(hwnd, GWL_USERDATA);
+
+ // forward some messages (the key ones only so far) to the spin ctrl
+ switch ( message )
+ {
+ case WM_CHAR:
+ case WM_DEADCHAR:
+ case WM_KEYUP:
+ case WM_KEYDOWN:
+ spin->MSWWindowProc(message, wParam, lParam);
+ break;
+ }
+
+ return ::CallWindowProc(CASTWNDPROC spin->GetBuddyWndProc(),
+ hwnd, message, wParam, lParam);
+}
+
// ----------------------------------------------------------------------------
// construction
// ----------------------------------------------------------------------------
WS_EX_CLIENTEDGE, // sunken border
_T("EDIT"), // window class
NULL, // no window title
- WS_CHILD | WS_BORDER, // style (will be shown later)
+ WS_CHILD | WS_BORDER /* | WS_CLIPSIBLINGS */, // style (will be shown later)
pos.x, pos.y, // position
0, 0, // size (will be set later)
GetHwndOf(parent), // parent
if ( !m_hwndBuddy )
{
- wxLogLastError("CreateWindow(buddy text window)");
+ wxLogLastError(wxT("CreateWindow(buddy text window)"));
return FALSE;
}
+ // subclass the text ctrl to be able to intercept some events
+ m_oldBuddyWndProc = (WXFARPROC)::GetWindowLong((HWND)m_hwndBuddy, GWL_WNDPROC);
+ ::SetWindowLong((HWND)m_hwndBuddy, GWL_USERDATA, (LONG)this);
+ ::SetWindowLong((HWND)m_hwndBuddy, GWL_WNDPROC, (LONG)wxBuddyTextWndProc);
+
// should have the same font as the other controls
SetFont(GetParent()->GetFont());
return TRUE;
}
+wxSpinCtrl::~wxSpinCtrl()
+{
+ // destroy the buddy window because this pointer which wxBuddyTextWndProc
+ // uses will not soon be valid any more
+ ::DestroyWindow((HWND)m_hwndBuddy);
+}
+
// ----------------------------------------------------------------------------
// wxTextCtrl-like methods
// ----------------------------------------------------------------------------
{
if ( !::SetWindowText((HWND)m_hwndBuddy, text.c_str()) )
{
- wxLogLastError("SetWindowText(buddy)");
+ wxLogLastError(wxT("SetWindowText(buddy)"));
}
}
return TRUE;
}
+void wxSpinCtrl::SetFocus()
+{
+ ::SetFocus((HWND)m_hwndBuddy);
+}
+
// ----------------------------------------------------------------------------
// event processing
// ----------------------------------------------------------------------------
if ( !::MoveWindow((HWND)m_hwndBuddy, x, y, widthText, height, TRUE) )
{
- wxLogLastError("MoveWindow(buddy)");
+ wxLogLastError(wxT("MoveWindow(buddy)"));
}
x += widthText + MARGIN_BETWEEN;
if ( !::MoveWindow(GetHwnd(), x, y, widthBtn, height, TRUE) )
{
- wxLogLastError("MoveWindow");
+ wxLogLastError(wxT("MoveWindow"));
}
}
+// get total size of the control
+void wxSpinCtrl::DoGetSize(int *x, int *y) const
+{
+ RECT spinrect, textrect, ctrlrect;
+ GetWindowRect(GetHwnd(), &spinrect);
+ GetWindowRect((HWND)m_hwndBuddy, &textrect);
+ UnionRect(&ctrlrect,&textrect, &spinrect);
+
+ if ( x )
+ *x = ctrlrect.right - ctrlrect.left;
+ if ( y )
+ *y = ctrlrect.bottom - ctrlrect.top;
+}
+
+void wxSpinCtrl::DoGetPosition(int *x, int *y) const
+{
+ // hack: pretend that our HWND is the text control just for a moment
+ WXHWND hWnd = GetHWND();
+ wxConstCast(this, wxSpinCtrl)->m_hWnd = m_hwndBuddy;
+
+ wxSpinButton::DoGetPosition(x, y);
+
+ wxConstCast(this, wxSpinCtrl)->m_hWnd = hWnd;
+}
+
#endif // __WIN95__
#endif