#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
// ----------------------------------------------------------------------------
::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;
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
const wxValidator& validator,
const wxString& name)
{
+ m_authNeeded = false;
+
wxString label(lbl);
if (label.empty() && wxIsStockID(id))
{
// 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 )
#if wxUSE_UXTHEME
wxUxThemeEngine::GetIfActive() ||
#endif // wxUSE_UXTHEME
- m_imageData && m_imageData->GetBitmap(State_Current).IsOk()
+ (m_imageData && m_imageData->GetBitmap(State_Current).IsOk())
)
)
{
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
// ----------------------------------------------------------------------------
wxCHECK_RET( m_imageData, "SetBitmap() must be called first" );
m_imageData->SetBitmapMargins(x, y);
+ InvalidateBestSize();
}
void wxButton::DoSetBitmapPosition(wxDirection dir)
wxCHECK_RET( m_imageData, "SetBitmap() must be called first" );
m_imageData->SetBitmapPosition(dir);
+ InvalidateBestSize();
}
// ----------------------------------------------------------------------------
// for simplicity, we start with centred rectangle and then move it to
// the appropriate edge
wxRect rectBitmap = wxRect(sizeBmp).CentreIn(rectButton);
- switch ( m_imageData->GetBitmapPosition() )
- {
- default:
- wxFAIL_MSG( "invalid direction" );
- // fall through
-
- case wxLEFT:
- rectBitmap.x = rectButton.x + margin.x;
- rectButton.x += sizeBmpWithMargins.x;
- rectButton.width -= sizeBmpWithMargins.x;
- break;
-
- case wxRIGHT:
- rectBitmap.x = rectButton.GetRight() - sizeBmp.x - margin.x;
- rectButton.width -= sizeBmpWithMargins.x;
- break;
- case wxTOP:
- rectBitmap.y = rectButton.y + margin.y;
- rectButton.y += sizeBmpWithMargins.y;
- rectButton.height -= sizeBmpWithMargins.y;
- break;
-
- case wxBOTTOM:
- rectBitmap.y = rectButton.GetBottom() - sizeBmp.y - margin.y;
- rectButton.height -= sizeBmpWithMargins.y;
- break;
+ // move bitmap only if we have a label, otherwise keep it centered
+ if ( ShowsLabel() )
+ {
+ switch ( m_imageData->GetBitmapPosition() )
+ {
+ default:
+ wxFAIL_MSG( "invalid direction" );
+ // fall through
+
+ case wxLEFT:
+ rectBitmap.x = rectButton.x + margin.x;
+ rectButton.x += sizeBmpWithMargins.x;
+ rectButton.width -= sizeBmpWithMargins.x;
+ break;
+
+ case wxRIGHT:
+ rectBitmap.x = rectButton.GetRight() - sizeBmp.x - margin.x;
+ rectButton.width -= sizeBmpWithMargins.x;
+ break;
+
+ case wxTOP:
+ rectBitmap.y = rectButton.y + margin.y;
+ rectButton.y += sizeBmpWithMargins.y;
+ rectButton.height -= sizeBmpWithMargins.y;
+ break;
+
+ case wxBOTTOM:
+ rectBitmap.y = rectButton.GetBottom() - sizeBmp.y - margin.y;
+ rectButton.height -= sizeBmpWithMargins.y;
+ break;
+ }
}
wxDCTemp dst((WXHDC)hdc);