198 lines
5.9 KiB
C++
198 lines
5.9 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/msw/commandlinkbutton.cpp
|
|
// Purpose: wxCommandLinkButton
|
|
// Author: Rickard Westerlund
|
|
// Created: 2010-06-14
|
|
// Copyright: (c) 2010 wxWidgets team
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
#if wxUSE_COMMANDLINKBUTTON
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#include "wx/dcclient.h"
|
|
#endif
|
|
|
|
#include "wx/commandlinkbutton.h"
|
|
#include "wx/msw/private.h"
|
|
#include "wx/msw/private/button.h"
|
|
#include "wx/msw/private/dc.h"
|
|
#include "wx/private/window.h"
|
|
|
|
#ifndef BCM_SETNOTE
|
|
#define BCM_SETNOTE 0x1609
|
|
#endif
|
|
|
|
#ifndef BS_COMMANDLINK
|
|
#define BS_COMMANDLINK 0xE
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Helper functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
namespace
|
|
{
|
|
|
|
inline bool HasNativeCommandLinkButton()
|
|
{
|
|
return wxGetWinVersion() >= wxWinVersion_6;
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Command link button
|
|
// ----------------------------------------------------------------------------
|
|
|
|
bool wxCommandLinkButton::Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& mainLabel,
|
|
const wxString& note,
|
|
const wxPoint& pos,
|
|
const wxSize& size,
|
|
long style,
|
|
const wxValidator& validator,
|
|
const wxString& name)
|
|
{
|
|
if ( ! wxGenericCommandLinkButton::Create(parent,
|
|
id,
|
|
mainLabel,
|
|
note,
|
|
pos,
|
|
size,
|
|
style,
|
|
validator,
|
|
name) )
|
|
return false;
|
|
|
|
SetMainLabelAndNote(mainLabel, note);
|
|
SetInitialSize(size);
|
|
|
|
return true;
|
|
}
|
|
|
|
void
|
|
wxCommandLinkButton::SetMainLabelAndNote(const wxString& mainLabel,
|
|
const wxString& note)
|
|
{
|
|
if ( HasNativeCommandLinkButton() )
|
|
{
|
|
wxButton::SetLabel(mainLabel);
|
|
::SendMessage(m_hWnd, BCM_SETNOTE, 0, wxMSW_CONV_LPARAM(note));
|
|
|
|
// Preserve the user-specified label for GetLabel()
|
|
m_labelOrig = mainLabel;
|
|
if ( !note.empty() )
|
|
m_labelOrig << '\n' << note;
|
|
}
|
|
else
|
|
{
|
|
wxGenericCommandLinkButton::SetMainLabelAndNote(mainLabel, note);
|
|
}
|
|
}
|
|
|
|
WXDWORD wxCommandLinkButton::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|
{
|
|
WXDWORD ret = wxButton::MSWGetStyle(style, exstyle);
|
|
if ( HasNativeCommandLinkButton() )
|
|
ret |= BS_COMMANDLINK;
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool wxCommandLinkButton::HasNativeBitmap() const
|
|
{
|
|
return HasNativeCommandLinkButton();
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// size management including autosizing
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Margin measures can be found at
|
|
// http://expression.microsoft.com/en-us/ee662150.aspx
|
|
namespace
|
|
{
|
|
const int MAINLABEL_TOP_MARGIN = 16; // Includes image top margin.
|
|
const int MAINLABEL_NOTE_LEFT_MARGIN = 23;
|
|
const int NOTE_TOP_MARGIN = 21;
|
|
const int NOTE_BOTTOM_MARGIN = 1;
|
|
const int MAINLABEL_NOTE_MARGIN = NOTE_TOP_MARGIN - MAINLABEL_TOP_MARGIN;
|
|
};
|
|
|
|
wxSize wxCommandLinkButton::DoGetBestSize() const
|
|
{
|
|
wxSize size;
|
|
|
|
// account for the text part if we have it or if we don't have any image at
|
|
// all (buttons initially created with empty label should still have a non
|
|
// zero size)
|
|
if ( ShowsLabel() || !m_imageData )
|
|
{
|
|
int flags = 0;
|
|
if ( GetAuthNeeded() )
|
|
flags |= wxMSWButton::Size_AuthNeeded;
|
|
|
|
wxCommandLinkButton *thisButton =
|
|
const_cast<wxCommandLinkButton *>(this);
|
|
wxClientDC dc(thisButton);
|
|
|
|
wxFont noteFont = dc.GetFont();
|
|
|
|
// 4/3 is the relationship between main label and note font sizes.
|
|
dc.SetFont(noteFont.Scaled(4.0f/3.0f));
|
|
size = dc.GetMultiLineTextExtent(GetLabelText(GetMainLabel()));
|
|
|
|
dc.SetFont(noteFont);
|
|
wxSize noteSize = dc.GetMultiLineTextExtent(GetLabelText(GetNote()));
|
|
|
|
if ( noteSize.x > size.x )
|
|
size.x = noteSize.x;
|
|
size.y += noteSize.y;
|
|
|
|
size = wxMSWButton::GetFittingSize(thisButton,
|
|
size,
|
|
flags);
|
|
|
|
// The height of a standard command link button is 25 and 35 DLUs for
|
|
// single lines and two lines respectively. Width is not accounted for.
|
|
int heightDef = GetNote().AfterFirst('\n').empty() ? 25 : 35;
|
|
wxSize sizeDef = thisButton->ConvertDialogToPixels(wxSize(50,
|
|
heightDef));
|
|
|
|
if ( size.y < sizeDef.y )
|
|
size.y = sizeDef.y;
|
|
}
|
|
|
|
if ( m_imageData )
|
|
{
|
|
AdjustForBitmapSize(size);
|
|
}
|
|
else
|
|
{
|
|
// The default image size is 16x16.
|
|
size.x += 16;
|
|
if ( size.y < 16 )
|
|
size.y = 16;
|
|
}
|
|
|
|
size.x += MAINLABEL_NOTE_LEFT_MARGIN;
|
|
size.y += MAINLABEL_TOP_MARGIN + NOTE_BOTTOM_MARGIN;
|
|
if ( !GetNote().empty() )
|
|
size.y += MAINLABEL_NOTE_MARGIN;
|
|
|
|
return size;
|
|
}
|
|
|
|
#endif // wxUSE_COMMANDLINKBUTTON
|