]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
VC++ compilation correction; doc file corrections
[wxWidgets.git] / src / msw / window.cpp
index 68cf6d87c2f01ac6932360d03aeef37a0527e31a..9d1f5e24e160169d258ddad4031c8ae1de06c343 100644 (file)
@@ -17,7 +17,7 @@
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
@@ -31,6 +31,7 @@
 #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"
 #endif
 
 #if     wxUSE_OWNER_DRAWN
-#include "wx/ownerdrw.h"
+    #include "wx/ownerdrw.h"
 #endif
 
 #if     wxUSE_DRAG_AND_DROP
-#include "wx/msw/ole/droptgt.h"
+    #include "wx/msw/ole/droptgt.h"
 #endif
 
 #include "wx/menuitem.h"
 #endif
 
 #ifdef  __WXDEBUG__
-const char *wxGetMessageName(int message);
+    const char *wxGetMessageName(int message);
 #endif  //__WXDEBUG__
 
 #define WINDOW_MARGIN 3 // This defines sensitivity of Leave events
 
 wxMenu *wxCurrentPopupMenu = NULL;
-extern wxList wxPendingDelete;
+extern wxList WXDLLEXPORT wxPendingDelete;
 
 void wxRemoveHandleAssociation(wxWindow *win);
 void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win);
@@ -99,6 +100,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
 
 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)
@@ -616,6 +619,12 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
     int currentX, currentY;
     GetPosition(&currentX, &currentY);
+    int currentW,currentH;
+    GetSize(&currentW, &currentH);
+
+    if (x == currentX && y == currentY && width == currentW && height == currentH)
+        return;
+
     int actualWidth = width;
     int actualHeight = height;
     int actualX = x;
@@ -627,8 +636,6 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
 
     AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
 
-    int currentW,currentH;
-    GetSize(&currentW, &currentH);
     if (width == -1)
         actualWidth = currentW ;
     if (height == -1)
@@ -836,7 +843,6 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
         wxWndHook = NULL;
         wnd->m_hWnd = (WXHWND) hWnd;
     }
-    //    wxDebugMsg("hWnd = %d, m_hWnd = %d, msg = %d\n", hWnd, m_hWnd, message);
 
     // Stop right here if we don't have a valid handle
     // in our wxWnd object.
@@ -861,17 +867,16 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 
 // Should probably have a test for 'genuine' NT
 #if defined(__WIN32__)
-#define DIMENSION_TYPE short
+    #define DIMENSION_TYPE short
 #else
-#define DIMENSION_TYPE int
+    #define DIMENSION_TYPE int
 #endif
 
 // Main Windows 3 window proc
 long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
     wxASSERT( m_lastMsg == message &&
-        m_lastWParam == wParam &&
-        m_lastLParam == lParam );
+              m_lastWParam == wParam && m_lastLParam == lParam );
 
 #ifdef __WXDEBUG__
     wxLogTrace(wxTraceMessages, "Processing %s(%lx, %lx)",
@@ -1158,6 +1163,9 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
         }
 
     case WM_KEYDOWN:
+    {
+        MSWOnKeyDown((WORD) wParam, lParam);
+#if 0
         // we consider these message "not interesting"
         if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
             return Default();
@@ -1175,8 +1183,15 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             MSWOnChar((WORD)wParam, lParam);
         else
             return Default();
+#endif
         break;
+    }
 
+    case WM_KEYUP:
+    {
+        MSWOnKeyUp((WORD) wParam, lParam);
+        break;
+    }
     case WM_CHAR: // Always an ASCII character
         {
             MSWOnChar((WORD)wParam, lParam, TRUE);
@@ -1464,10 +1479,18 @@ void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow
         m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
             (DLGPROC)wxDlgProc);
 #else
+        // N.B.: if we _don't_ use this form,
+        // then with VC++ 1.5, it crashes horribly.
+#if 1
+       m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
+                            (DLGPROC)wxDlgProc);
+#else
+        // Crashes when we use this.
         DLGPROC dlgproc = (DLGPROC)MakeProcInstance((DLGPROC)wxWndProc, wxGetInstance());
 
         m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
             (DLGPROC)dlgproc);
+#endif
 #endif
 
         if (m_hWnd == 0)
@@ -2381,6 +2404,74 @@ void wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
     }
 }
 
+void wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+{
+    int id;
+
+    if ((id = wxCharCodeMSWToWX(wParam)) == 0) {
+        id = wParam;
+    }
+
+    if (id != -1)
+    {
+        wxKeyEvent event(wxEVT_KEY_DOWN);
+        event.m_shiftDown = (::GetKeyState(VK_SHIFT)&0x100?TRUE:FALSE);
+        event.m_controlDown = (::GetKeyState(VK_CONTROL)&0x100?TRUE:FALSE);
+        if ((HIWORD(lParam) & KF_ALTDOWN) == KF_ALTDOWN)
+            event.m_altDown = TRUE;
+
+        event.m_eventObject = this;
+        event.m_keyCode = id;
+        event.SetTimestamp(wxApp::sm_lastMessageTime);
+
+        POINT pt ;
+        GetCursorPos(&pt) ;
+        RECT rect ;
+        GetWindowRect((HWND) GetHWND(),&rect) ;
+        pt.x -= rect.left ;
+        pt.y -= rect.top ;
+
+        event.m_x = pt.x; event.m_y = pt.y;
+
+        if (!GetEventHandler()->ProcessEvent(event))
+            Default();
+    }
+}
+
+void wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+{
+    int id;
+
+    if ((id = wxCharCodeMSWToWX(wParam)) == 0) {
+        id = wParam;
+    }
+
+    if (id != -1)
+    {
+        wxKeyEvent event(wxEVT_KEY_UP);
+        event.m_shiftDown = (::GetKeyState(VK_SHIFT)&0x100?TRUE:FALSE);
+        event.m_controlDown = (::GetKeyState(VK_CONTROL)&0x100?TRUE:FALSE);
+        if ((HIWORD(lParam) & KF_ALTDOWN) == KF_ALTDOWN)
+            event.m_altDown = TRUE;
+
+        event.m_eventObject = this;
+        event.m_keyCode = id;
+        event.SetTimestamp(wxApp::sm_lastMessageTime);
+
+        POINT pt ;
+        GetCursorPos(&pt) ;
+        RECT rect ;
+        GetWindowRect((HWND) GetHWND(),&rect) ;
+        pt.x -= rect.left ;
+        pt.y -= rect.top ;
+
+        event.m_x = pt.x; event.m_y = pt.y;
+
+        if (!GetEventHandler()->ProcessEvent(event))
+            Default();
+    }
+}
+
 void wxWindow::MSWOnJoyDown(int joystick, int x, int y, WXUINT flags)
 {
     int buttons = 0;
@@ -3453,6 +3544,8 @@ 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 ( event.KeyCode() == WXK_TAB ) {
         // propagate the TABs to the parent - it's up to it to decide what
         // to do with it
@@ -3461,6 +3554,7 @@ void wxWindow::OnChar(wxKeyEvent& event)
                 return;
         }
     }
+*/
 
     bool isVirtual;
     int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual);
@@ -3472,6 +3566,16 @@ 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();