]> git.saurik.com Git - wxWidgets.git/commitdiff
Add support for showing "elevation" icon in wxMSW buttons.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 8 Feb 2010 19:52:00 +0000 (19:52 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 8 Feb 2010 19:52:00 +0000 (19:52 +0000)
Add, document and test in the widgets sample wxButton::SetAuthNeeded().

Closes #11705.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63421 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/button.h
include/wx/msw/button.h
include/wx/msw/private/button.h
interface/wx/button.h
samples/widgets/button.cpp
src/msw/button.cpp

index 573305c573df3e801d254eeef171bc5025c38984..9909d54328a60797f2c81c7fb05f83ca58c1be3d 100644 (file)
@@ -522,6 +522,7 @@ MSW:
 - Suppressed spurious character event for decimal key in numeric keypad.
 - Allow to not create wxPaintDC in EVT_PAINT handler.
 - Fix sending of wxEVT_COMMAND_LIST_COL_DRAGGING events in wxListCtrl.
+- Allow putting the UAC symbol on buttons (Chris Spencer).
 
 i18n:
 
index dfcf6610daf1f9a5bd259dee506498dad5703d97..b6827dc00282702caaaf1459d58af76f9be72ba4 100644 (file)
@@ -64,6 +64,12 @@ class WXDLLIMPEXP_CORE wxButtonBase : public wxControl
 public:
     wxButtonBase() { }
 
+    // show the authentication needed symbol on the button: this is currently
+    // only implemented on Windows Vista and newer (on which it shows the UAC
+    // shield symbol)
+    void SetAuthNeeded(bool show = true) { DoSetAuthNeeded(show); }
+    bool GetAuthNeeded() const { return DoGetAuthNeeded(); }
+
     // show the image in the button in addition to the label: this method is
     // supported on all (major) platforms
     void SetBitmap(const wxBitmap& bitmap, wxDirection dir = wxLEFT)
@@ -170,6 +176,9 @@ protected:
     // choose the default border for this window
     virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
 
+    virtual bool DoGetAuthNeeded() const { return false; }
+    virtual void DoSetAuthNeeded(bool WXUNUSED(show)) { }
+
     virtual wxBitmap DoGetBitmap(State WXUNUSED(which)) const
         { return wxBitmap(); }
     virtual void DoSetBitmap(const wxBitmap& WXUNUSED(bitmap),
index 52ca818cbe37a28b4099052c2f7367d0c40b62de..e1de60c2d69b2d07f1e6dbc388e707a599e4b44b 100644 (file)
@@ -80,6 +80,8 @@ protected:
     // usually overridden base class virtuals
     virtual wxSize DoGetBestSize() const;
 
+    virtual bool DoGetAuthNeeded() const;
+    virtual void DoSetAuthNeeded(bool show);
     virtual wxBitmap DoGetBitmap(State which) const;
     virtual void DoSetBitmap(const wxBitmap& bitmap, State which);
     virtual wxSize DoGetBitmapMargins() const;
@@ -88,6 +90,9 @@ protected:
 
     class wxButtonImageData *m_imageData;
 
+    // true if the UAC symbol is shown
+    bool m_authNeeded;
+
 private:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxButton)
 };
index 7d006f747a702429ae330f776b50e4d04b0ac408..03be993bc05c04289ff5d85d682acbf1b3daaf75 100644 (file)
@@ -45,13 +45,19 @@ inline int GetMultilineStyle(const wxString& label)
 // depending on whether the label contains the new lines
 void UpdateMultilineStyle(HWND hwnd, const wxString& label);
 
+// flags for ComputeBestSize() and GetFittingSize()
+enum
+{
+    Size_AuthNeeded = 1
+};
+
 // common implementation of wxButton and wxToggleButton::DoGetBestSize()
 // (implemented in src/msw/button.cpp)
-wxSize ComputeBestSize(wxControl *btn);
+wxSize ComputeBestSize(wxControl *btn, int flags = 0);
 
 // compute the button size (as if wxBU_EXACTFIT were specified, i.e. without
 // adjusting it to be of default size if it's smaller) for the given label size
-wxSize GetFittingSize(wxWindow *win, const wxSize& sizeLabel);
+wxSize GetFittingSize(wxWindow *win, const wxSize& sizeLabel, int flags = 0);
 
 } // namespace wxMSWButton
 
index 5669cfc7bc7615b82e9a80d1a31805a45bcb8353..4027c9aef1f2bd3ab14e1d3dd8eba5dca10a225e 100644 (file)
@@ -146,6 +146,19 @@ public:
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxButtonNameStr);
 
+    /**
+        Returns @true if an authentication needed symbol is displayed on the
+        button.
+
+        @remarks This method always returns @false if the platform is not
+                 Windows Vista or newer.
+
+        @see SetAuthNeeded()
+
+        @since 2.9.1
+     */
+    bool GetAuthNeeded() const;
+
     /**
         Return the bitmap shown by the button.
 
@@ -223,6 +236,19 @@ public:
     */
     wxString GetLabel() const;
 
+    /**
+        Sets whether an authentication needed symbol should be displayed on the
+        button.
+
+        @remarks This method doesn't do anything if the platform is not Windows
+                 Vista or newer.
+
+        @see GetAuthNeeded()
+
+        @since 2.9.1
+     */
+    void SetAuthNeeded(bool needed = true);
+
     /**
         Sets the bitmap to display in the button.
 
index 61b118ae0e18bc57ecd56df71a70e88f543b69c4..af70f76ea085f84a5f68a20a1776376cc6eb3cc5 100644 (file)
@@ -124,6 +124,7 @@ protected:
     wxCheckBox *m_chkBitmapOnly,
                *m_chkTextAndBitmap,
                *m_chkFit,
+               *m_chkAuthNeeded,
                *m_chkDefault;
 
     // more checkboxes for wxBitmapButton only
@@ -184,6 +185,7 @@ ButtonWidgetsPage::ButtonWidgetsPage(WidgetsBookCtrl *book,
     m_chkBitmapOnly =
     m_chkTextAndBitmap =
     m_chkFit =
+    m_chkAuthNeeded =
     m_chkDefault =
     m_chkUsePressed =
     m_chkUseFocused =
@@ -210,8 +212,9 @@ void ButtonWidgetsPage::CreateContent()
     wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
 
     m_chkBitmapOnly = CreateCheckBoxAndAddToSizer(sizerLeft, "&Bitmap only");
-    m_chkTextAndBitmap = CreateCheckBoxAndAddToSizer(sizerLeft, "Text &and &bitmap");
+    m_chkTextAndBitmap = CreateCheckBoxAndAddToSizer(sizerLeft, "Text &and bitmap");
     m_chkFit = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Fit exactly"));
+    m_chkAuthNeeded = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("Require a&uth"));
     m_chkDefault = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Default"));
 
     sizerLeft->AddSpacer(5);
@@ -307,6 +310,7 @@ void ButtonWidgetsPage::Reset()
 {
     m_chkBitmapOnly->SetValue(false);
     m_chkFit->SetValue(true);
+    m_chkAuthNeeded->SetValue(false);
     m_chkTextAndBitmap->SetValue(false);
     m_chkDefault->SetValue(false);
 
@@ -432,10 +436,11 @@ void ButtonWidgetsPage::CreateButton()
     m_chkUseCurrent->Enable(showsBitmap);
     m_chkUseDisabled->Enable(showsBitmap);
 
+    if ( m_chkAuthNeeded->GetValue() )
+        m_button->SetAuthNeeded();
+
     if ( m_chkDefault->GetValue() )
-    {
         m_button->SetDefault();
-    }
 
     AddButtonToSizer();
 
index 2f68d8b36253c3d791cdf091c10a95679a64d3f8..2d71a51c29cca1c99230135ba972a050ef20450d 100644 (file)
@@ -103,6 +103,12 @@ using namespace wxMSWImpl;
     #define DT_HIDEPREFIX       0x00100000
 #endif
 
+// set the value for BCM_SETSHIELD (for the UAC shield) if it's not defined in
+// the header
+#ifndef BCM_SETSHIELD
+    #define BCM_SETSHIELD       0x160c
+#endif
+
 // ----------------------------------------------------------------------------
 // button image data
 // ----------------------------------------------------------------------------
@@ -433,7 +439,9 @@ void wxMSWButton::UpdateMultilineStyle(HWND hwnd, const wxString& label)
         ::SetWindowLong(hwnd, GWL_STYLE, styleNew);
 }
 
-wxSize wxMSWButton::GetFittingSize(wxWindow *win, const wxSize& sizeLabel)
+wxSize wxMSWButton::GetFittingSize(wxWindow *win,
+                                   const wxSize& sizeLabel,
+                                   int flags)
 {
     // FIXME: this is pure guesswork, need to retrieve the real button margins
     wxSize sizeBtn = sizeLabel;
@@ -441,17 +449,21 @@ wxSize wxMSWButton::GetFittingSize(wxWindow *win, const wxSize& sizeLabel)
     sizeBtn.x += 3*win->GetCharWidth();
     sizeBtn.y = 11*EDIT_HEIGHT_FROM_CHAR_HEIGHT(sizeLabel.y)/10;
 
+    // account for the shield UAC icon if we have it
+    if ( flags & Size_AuthNeeded )
+        sizeBtn.x += wxSystemSettings::GetMetric(wxSYS_SMALLICON_X);
+
     return sizeBtn;
 }
 
-wxSize wxMSWButton::ComputeBestSize(wxControl *btn)
+wxSize wxMSWButton::ComputeBestSize(wxControl *btn, int flags)
 {
     wxClientDC dc(btn);
 
     wxSize sizeBtn;
     dc.GetMultiLineTextExtent(btn->GetLabelText(), &sizeBtn.x, &sizeBtn.y);
 
-    sizeBtn = GetFittingSize(btn, sizeBtn);
+    sizeBtn = GetFittingSize(btn, sizeBtn, flags);
 
     // all buttons have at least the standard size unless the user explicitly
     // wants them to be of smaller size and used wxBU_EXACTFIT style when
@@ -486,6 +498,8 @@ bool wxButton::Create(wxWindow *parent,
                       const wxValidator& validator,
                       const wxString& name)
 {
+    m_authNeeded = false;
+
     wxString label(lbl);
     if (label.empty() && wxIsStockID(id))
     {
@@ -583,7 +597,11 @@ wxSize wxButton::DoGetBestSize() const
     // zero size)
     if ( ShowsLabel() || !m_imageData )
     {
-        size = wxMSWButton::ComputeBestSize(const_cast<wxButton *>(this));
+        int flags = 0;
+        if ( GetAuthNeeded() )
+            flags |= wxMSWButton::Size_AuthNeeded;
+
+        size = wxMSWButton::ComputeBestSize(const_cast<wxButton *>(this), flags);
     }
 
     if ( m_imageData )
@@ -948,6 +966,26 @@ WXLRESULT wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
     return wxControl::MSWWindowProc(nMsg, wParam, lParam);
 }
 
+// ----------------------------------------------------------------------------
+// authentication needed handling
+// ----------------------------------------------------------------------------
+
+bool wxButton::DoGetAuthNeeded() const
+{
+    return m_authNeeded;
+}
+
+void wxButton::DoSetAuthNeeded(bool show)
+{
+    // show/hide UAC symbol on Windows Vista and later
+    if ( wxGetWinVersion() >= wxWinVersion_6 )
+    {
+        m_authNeeded = show;
+        ::SendMessage(GetHwnd(), BCM_SETSHIELD, 0, show);
+        InvalidateBestSize();
+    }
+}
+
 // ----------------------------------------------------------------------------
 // button images
 // ----------------------------------------------------------------------------