void wxWindow::Init()
{
+ m_isWindow = TRUE;
+
// Generic
m_windowId = 0;
m_isShown = TRUE;
m_windowStyle = 0;
m_windowParent = NULL;
m_windowEventHandler = this;
- m_windowCursor = *wxSTANDARD_CURSOR;
m_children = new wxList;
m_doubleClickAllowed = 0 ;
m_winCaptured = FALSE;
// Destructor
wxWindow::~wxWindow()
{
- // Remove potential dangling pointer
- if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
- {
- wxPanel* panel = (wxPanel*) GetParent();
- if (panel->GetLastFocus() == this)
- panel->SetLastFocus((wxWindow*) NULL);
- }
-
m_isBeingDeleted = TRUE;
// first of all, delete the things on which nothing else depends
{
HWND hWnd = (HWND) GetHWND();
RECT rect;
- GetClientRect(hWnd, &rect);
+ ::GetClientRect(hWnd, &rect);
*x = rect.right;
*y = rect.bottom;
}
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{
int currentX, currentY;
GetPosition(¤tX, ¤tY);
MoveWindow(hWnd, actualX, actualY, actualWidth, actualHeight, (BOOL)TRUE);
}
-void wxWindow::SetClientSize(int width, int height)
+void wxWindow::DoSetClientSize(int width, int height)
{
wxWindow *parent = GetParent();
HWND hWnd = (HWND) GetHWND();
- HWND hParentWnd = (HWND) (HWND) parent->GetHWND();
+ HWND hParentWnd = (HWND) 0;
+ if (parent)
+ hParentWnd = (HWND) parent->GetHWND();
RECT rect;
- GetClientRect(hWnd, &rect);
+ ::GetClientRect(hWnd, &rect);
RECT rect2;
GetWindowRect(hWnd, &rect2);
}
case WM_KEYDOWN:
- {
// If this has been processed by an event handler,
// return 0 now (we've handled it).
if (MSWOnKeyDown((WORD) wParam, lParam))
case VK_RIGHT:
case VK_DOWN:
case VK_UP:
-/*
-// if ( ::GetKeyState(VK_CONTROL) & 0x100 ) // Don't understand purpose of this test
- if (!MSWOnChar((WORD)wParam, lParam))
- return Default();
+ return Default();
+
+#ifdef VK_APPS
+ // special case of VK_APPS: treat it the same as right mouse click
+ // because both usually pop up a context menu
+ case VK_APPS:
+ {
+ // construct the key mask
+ WPARAM fwKeys = MK_RBUTTON;
+ if ( (::GetKeyState(VK_CONTROL) & 0x100) != 0 )
+ fwKeys |= MK_CONTROL;
+ if ( (::GetKeyState(VK_SHIFT) & 0x100) != 0 )
+ fwKeys |= MK_SHIFT;
+
+ // simulate right mouse button click
+ DWORD dwPos = ::GetMessagePos();
+ int x = GET_X_LPARAM(dwPos),
+ y = GET_Y_LPARAM(dwPos);
+
+ ScreenToClient(&x, &y);
+ MSWOnRButtonDown(x, y, fwKeys);
+ }
break;
-*/
+#endif // VK_APPS
+
default:
if (!MSWOnChar((WORD)wParam, lParam))
{
return Default();
}
-/*
- if ( ::GetKeyState(VK_CONTROL) & 0x100 )
- return Default();
-*/
break;
}
break;
- }
+
case WM_KEYUP:
{
if (!MSWOnKeyUp((WORD) wParam, lParam))
case WM_GETDLGCODE:
return MSWGetDlgCode();
+ case WM_SETCURSOR:
+ {
+ // don't set cursor for other windows, only for this one: this
+ // prevents children of this window from gettign the same cursor
+ // as the parent has (don't forget that this message is propagated
+ // by default up the window parent-child hierarchy)
+ if ( (HWND)wParam == hWnd )
+ {
+ // don't set cursor when the mouse is not in the client part
+ short nHitTest = LOWORD(lParam);
+ if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+ {
+ HCURSOR hcursor = 0;
+ if ( wxIsBusy() )
+ {
+ // from msw\utils.cpp
+ extern HCURSOR gs_wxBusyCursor;
+
+ hcursor = gs_wxBusyCursor;
+ }
+ else
+ {
+ wxCursor *cursor = NULL;
+
+ if ( m_windowCursor.Ok() )
+ {
+ cursor = &m_windowCursor;
+ }
+ else
+ {
+ // from msw\data.cpp
+ extern wxCursor *g_globalCursor;
+
+ if ( g_globalCursor && g_globalCursor->Ok() )
+ cursor = g_globalCursor;
+ }
+
+ if ( cursor )
+ hcursor = (HCURSOR)cursor->GetHCURSOR();
+ }
+
+ if ( hcursor )
+ {
+ ::SetCursor(hcursor);
+
+ // returning TRUE stops the DefWindowProc() from
+ // further processing this message - exactly what we
+ // need because we've just set the cursor.
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ return MSWDefWindowProc(message, wParam, lParam );
+
default:
return MSWDefWindowProc(message, wParam, lParam );
}
#endif // Win95
// not processed
- return FALSE;
+ return Default();
}
void wxWindow::MSWOnMenuHighlight(WXWORD WXUNUSED(item), WXWORD WXUNUSED(flags), WXHMENU WXUNUSED(sysmenu))
wxWindow *parent = GetParent();
if ( parent && parent->IsKindOf(CLASSINFO(wxPanel)) )
{
- ((wxPanel *)parent)->SetLastFocus(this);
+ ((wxPanel *)parent)->SetLastFocus(GetId());
}
wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
long wxWindow::MSWOnSysCommand(WXWPARAM wParam, WXLPARAM lParam)
{
- switch (wParam && 0xFFFFFFF0)
+ switch (wParam & 0xFFFFFFF0)
{
case SC_MAXIMIZE:
{
void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags)
{
// 'normal' move event...
- // Set cursor, but only if we're not in 'busy' mode
-
- // Trouble with this is that it sets the cursor for controls too :-(
- if (m_windowCursor.Ok() && !wxIsBusy())
- ::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
if (!m_mouseInWindow)
{