]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/toplevel.cpp
TLW default item changes have changed Enter key processing: it was now handled as...
[wxWidgets.git] / src / msw / toplevel.cpp
index 07897473234d2cba671a00166885fbdb7187571d..ac6b7b084000b5ab902338c5da9bb940a5cb5c93 100644 (file)
@@ -331,6 +331,48 @@ bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam)
 }
 #endif
 
+bool wxTopLevelWindowMSW::MSWProcessMessage(WXMSG* pMsg)
+{
+    // MSW specific feature: if the dialog has only one notebook-like child
+    // window (actually it could be any window that returns true from its
+    // HasMultiplePages()), then [Shift-]Ctrl-Tab and Ctrl-PageUp/Down keys
+    // should iterate over its pages even if the focus is outside of the
+    // control because this is how the standard MSW properties dialogs behave
+    if ( pMsg->message == WM_KEYDOWN && wxIsCtrlDown() &&
+            (pMsg->wParam == VK_TAB ||
+                pMsg->wParam == VK_PRIOR ||
+                    pMsg->wParam == VK_NEXT) )
+    {
+        // check if we have a unique notebook-like child
+        wxWindow *bookctrl = NULL;
+        for ( wxWindowList::const_iterator i = GetChildren().begin(),
+                                         end = GetChildren().end();
+              i != end;
+              ++i )
+        {
+            wxWindow * const window = *i;
+            if ( window->HasMultiplePages() )
+            {
+                if ( bookctrl )
+                {
+                    // this is the second book-like control already so don't do
+                    // anything as we don't know which one should have its page
+                    // changed
+                    bookctrl = NULL;
+                    break;
+                }
+
+                bookctrl = window;
+            }
+        }
+
+        if ( bookctrl && bookctrl->wxWindowMSW::MSWProcessMessage(pMsg) )
+            return true;
+    }
+
+    return wxTopLevelWindowBase::MSWProcessMessage(pMsg);
+}
+
 WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
     WXLRESULT rc = 0;
@@ -1043,6 +1085,52 @@ void wxTopLevelWindowMSW::RequestUserAttention(int flags)
     }
 }
 
+// ---------------------------------------------------------------------------
+
+bool wxTopLevelWindowMSW::SetTransparent(wxByte alpha)
+{
+    typedef DWORD (WINAPI *PSETLAYEREDWINDOWATTR)(HWND, DWORD, BYTE, DWORD);
+    static PSETLAYEREDWINDOWATTR pSetLayeredWindowAttributes = NULL;
+
+    if ( pSetLayeredWindowAttributes == NULL )
+    {
+        wxDynamicLibrary dllUser32(_T("user32.dll"));
+        pSetLayeredWindowAttributes = (PSETLAYEREDWINDOWATTR)
+            dllUser32.GetSymbol(wxT("SetLayeredWindowAttributes"));
+    }
+    if ( pSetLayeredWindowAttributes == NULL )
+        return false;
+
+    LONG exstyle = GetWindowLong(GetHwnd(), GWL_EXSTYLE);
+
+    // if setting alpha to fully opaque then turn off the layered style
+    if (alpha == 255)
+    {
+        SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyle & ~WS_EX_LAYERED);
+        Refresh();
+        return true;
+    }
+
+    // Otherwise, set the layered style if needed and set the alpha value
+    if ((exstyle & WS_EX_LAYERED) == 0 )
+        SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyle | WS_EX_LAYERED);
+
+    return pSetLayeredWindowAttributes(GetHwnd(), 0, (BYTE)alpha, LWA_ALPHA) != 0;   
+}
+
+bool wxTopLevelWindowMSW::CanSetTransparent()
+{
+    // The API is available on win2k and above
+    
+    static int os_type = -1;
+    static int ver_major = -1;
+
+    if (os_type == -1)
+        os_type = ::wxGetOsVersion(&ver_major);
+
+    return (os_type == wxWINDOWS_NT && ver_major >= 5);
+}
+
 // ----------------------------------------------------------------------------
 // wxTopLevelWindow event handling
 // ----------------------------------------------------------------------------