📄 gtk.cpp
字号:
{
wxCoord xMid = (x1 + x2) / 2;
dc.DrawLine(x1 + 1, y1 + 1, xMid, y2);
dc.DrawLine(xMid, y2, x2, y1);
}
wxBitmap wxGTKRenderer::GetCheckBitmap(int flags)
{
if ( !m_bitmapsCheckbox[0][0].Ok() )
{
// init the bitmaps once only
wxRect rect;
wxSize size = GetCheckBitmapSize();
rect.width = size.x;
rect.height = size.y;
for ( int i = 0; i < 2; i++ )
{
for ( int j = 0; j < 3; j++ )
m_bitmapsCheckbox[i][j].Create(rect.width, rect.height);
}
wxMemoryDC dc;
// normal checked
dc.SelectObject(m_bitmapsCheckbox[0][0]);
DrawCheckBitmap(dc, rect);
// normal unchecked
dc.SelectObject(m_bitmapsCheckbox[0][1]);
DrawUncheckBitmap(dc, rect, false);
// normal undeterminated
dc.SelectObject(m_bitmapsCheckbox[0][2]);
DrawUndeterminedBitmap(dc, rect, false);
// pressed checked
m_bitmapsCheckbox[1][0] = m_bitmapsCheckbox[0][0];
// pressed unchecked
dc.SelectObject(m_bitmapsCheckbox[1][1]);
DrawUncheckBitmap(dc, rect, true);
// pressed undeterminated
dc.SelectObject(m_bitmapsCheckbox[1][2]);
DrawUndeterminedBitmap(dc, rect, true);
}
int row = flags & wxCONTROL_PRESSED
? 1
: 0;
int col = flags & wxCONTROL_CHECKED
? 0
: ( flags & wxCONTROL_UNDETERMINED
? 2
: 1 );
return m_bitmapsCheckbox[row][col];
}
wxBitmap wxGTKRenderer::GetLineWrapBitmap() const
{
if ( !m_bmpLineWrap.Ok() )
{
// the line wrap bitmap as used by GTK+
#define line_wrap_width 6
#define line_wrap_height 9
static const char line_wrap_bits[] =
{
0x1e, 0x3e, 0x30, 0x30, 0x39, 0x1f, 0x0f, 0x0f, 0x1f,
};
wxBitmap bmpLineWrap(line_wrap_bits, line_wrap_width, line_wrap_height);
if ( !bmpLineWrap.Ok() )
{
wxFAIL_MSG( _T("Failed to create line wrap XBM") );
}
else
{
wxConstCast(this, wxGTKRenderer)->m_bmpLineWrap = bmpLineWrap;
}
}
return m_bmpLineWrap;
}
void wxGTKRenderer::DrawCheckButton(wxDC& dc,
const wxString& label,
const wxBitmap& bitmapOrig,
const wxRect& rectTotal,
int flags,
wxAlignment align,
int indexAccel)
{
wxBitmap bitmap;
if ( bitmapOrig.Ok() )
{
bitmap = bitmapOrig;
}
else
{
bitmap = GetCheckBitmap(flags);
}
DoDrawCheckOrRadioBitmap(dc, label, bitmap, rectTotal,
flags, align, indexAccel);
}
void wxGTKRenderer::DoDrawCheckOrRadioBitmap(wxDC& dc,
const wxString& label,
const wxBitmap& bitmap,
const wxRect& rectTotal,
int flags,
wxAlignment align,
int indexAccel)
{
wxRect rect = rectTotal;
if ( flags & wxCONTROL_FOCUSED )
{
// draw the focus border around everything
DrawRect(dc, &rect, m_penBlack);
}
else
{
// the border does not offset the string under GTK
rect.Inflate(-1);
}
// calculate the position of the bitmap and of the label
wxCoord xBmp,
yBmp = rect.y + (rect.height - bitmap.GetHeight()) / 2;
wxRect rectLabel;
dc.GetMultiLineTextExtent(label, NULL, &rectLabel.height);
rectLabel.y = rect.y + (rect.height - rectLabel.height) / 2;
if ( align == wxALIGN_RIGHT )
{
xBmp = rect.GetRight() - bitmap.GetWidth();
rectLabel.x = rect.x + 2;
rectLabel.SetRight(xBmp);
}
else // normal (checkbox to the left of the text) case
{
xBmp = rect.x + 2;
rectLabel.x = xBmp + bitmap.GetWidth() + 4;
rectLabel.SetRight(rect.GetRight());
}
dc.DrawBitmap(bitmap, xBmp, yBmp, true /* use mask */);
DrawLabel(dc, label, rectLabel, flags,
wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL, indexAccel);
}
void wxGTKRenderer::DrawRadioButton(wxDC& dc,
const wxString& label,
const wxBitmap& bitmapOrig,
const wxRect& rectTotal,
int flags,
wxAlignment align,
int indexAccel)
{
wxBitmap bitmap;
if ( bitmapOrig.Ok() )
{
bitmap = bitmapOrig;
}
else
{
wxRect rect;
wxSize size = GetRadioBitmapSize();
rect.width = size.x;
rect.height = size.y;
bitmap.Create(rect.width, rect.height);
wxMemoryDC dc;
dc.SelectObject(bitmap);
dc.SetBackground(*wxLIGHT_GREY_BRUSH);
dc.Clear();
DrawRadioBitmap(dc, rect, flags);
// must unselect the bitmap before setting a mask for it because of the
// MSW limitations
dc.SelectObject(wxNullBitmap);
bitmap.SetMask(new wxMask(bitmap, *wxLIGHT_GREY));
}
DoDrawCheckOrRadioBitmap(dc, label, bitmap, rectTotal,
flags, align, indexAccel);
}
#if wxUSE_TOOLBAR
void wxGTKRenderer::DrawToolBarButton(wxDC& dc,
const wxString& label,
const wxBitmap& bitmap,
const wxRect& rectOrig,
int flags,
long WXUNUSED(style),
int tbarStyle)
{
// we don't draw the separators at all
if ( !label.empty() || bitmap.Ok() )
{
wxRect rect = rectOrig;
rect.Deflate(BORDER_THICKNESS);
if ( flags & wxCONTROL_PRESSED )
{
DrawBorder(dc, wxBORDER_SUNKEN, rect, flags, &rect);
DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED), rect);
}
else if ( flags & wxCONTROL_CURRENT )
{
DrawBorder(dc, wxBORDER_RAISED, rect, flags, &rect);
DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_CURRENT), rect);
}
if(tbarStyle & wxTB_TEXT)
{
if(tbarStyle & wxTB_HORIZONTAL)
{
dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE);
}
else
{
dc.DrawLabel(label, bitmap, rect, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
}
}
else
{
int xpoint = (rect.GetLeft() + rect.GetRight() + 1 - bitmap.GetWidth()) / 2;
int ypoint = (rect.GetTop() + rect.GetBottom() + 1 - bitmap.GetHeight()) / 2;
dc.DrawBitmap(bitmap, xpoint, ypoint);
}
}
}
#endif // wxUSE_TOOLBAR
// ----------------------------------------------------------------------------
// text control
// ----------------------------------------------------------------------------
#if wxUSE_TEXTCTRL
wxRect wxGTKRenderer::GetTextTotalArea(const wxTextCtrl * WXUNUSED(text),
const wxRect& rect) const
{
wxRect rectTotal = rect;
rectTotal.Inflate(2*BORDER_THICKNESS);
return rectTotal;
}
wxRect wxGTKRenderer::GetTextClientArea(const wxTextCtrl *text,
const wxRect& rect,
wxCoord *extraSpaceBeyond) const
{
wxRect rectText = rect;
rectText.Deflate(2*BORDER_THICKNESS);
if ( text->WrapLines() )
{
// leave enough for the line wrap bitmap indicator
wxCoord widthMark = GetLineWrapBitmap().GetWidth() + 2;
rectText.width -= widthMark;
if ( extraSpaceBeyond )
*extraSpaceBeyond = widthMark;
}
return rectText;
}
#endif // wxUSE_TEXTCTRL
void wxGTKRenderer::DrawTextLine(wxDC& dc,
const wxString& text,
const wxRect& rect,
int selStart,
int selEnd,
int flags)
{
// TODO: GTK+ draws selection even for unfocused controls, just with
// different colours
StandardDrawTextLine(dc, text, rect, selStart, selEnd, flags);
}
void wxGTKRenderer::DrawLineWrapMark(wxDC& dc, const wxRect& rect)
{
wxBitmap bmpLineWrap = GetLineWrapBitmap();
// for a mono bitmap he colours it appears in depends on the current text
// colours, so set them correctly
wxColour colFgOld;
if ( bmpLineWrap.GetDepth() == 1 )
{
colFgOld = dc.GetTextForeground();
// FIXME: I wonder what should we do if the background is black too?
dc.SetTextForeground(*wxBLACK);
}
dc.DrawBitmap(bmpLineWrap,
rect.x, rect.y + (rect.height - bmpLineWrap.GetHeight())/2);
if ( colFgOld.Ok() )
{
// restore old colour
dc.SetTextForeground(colFgOld);
}
}
// ----------------------------------------------------------------------------
// notebook
// ----------------------------------------------------------------------------
void wxGTKRenderer::DrawTab(wxDC& dc,
const wxRect& rectOrig,
wxDirection dir,
const wxString& label,
const wxBitmap& bitmap,
int flags,
int indexAccel)
{
#define SELECT_FOR_VERTICAL(X,Y) ( isVertical ? Y : X )
#define REVERSE_FOR_VERTICAL(X,Y) \
SELECT_FOR_VERTICAL(X,Y) \
, \
SELECT_FOR_VERTICAL(Y,X)
wxRect rect = rectOrig;
bool isVertical = ( dir == wxLEFT ) || ( dir == wxRIGHT );
// the current tab is drawn indented (to the top for default case) and
// bigger than the other ones
const wxSize indent = GetTabIndent();
if ( flags & wxCONTROL_SELECTED )
{
rect.Inflate( SELECT_FOR_VERTICAL( indent.x , 0),
SELECT_FOR_VERTICAL( 0, indent.y ));
switch ( dir )
{
default:
wxFAIL_MSG(_T("invaild notebook tab orientation"));
// fall through
case wxTOP:
rect.y -= indent.y;
// fall through
case wxBOTTOM:
rect.height += indent.y;
break;
case wxLEFT:
rect.x -= indent.x;
// fall through
case wxRIGHT:
rect.width += indent.x;
break;
}
}
// selected tab has different colour
wxColour col = flags & wxCONTROL_SELECTED
? wxSCHEME_COLOUR(m_scheme, SHADOW_IN)
: wxSCHEME_COLOUR(m_scheme, SCROLLBAR);
DoDrawBackground(dc, col, rect);
if ( flags & wxCONTROL_FOCUSED )
{
// draw the focus rect
wxRect rectBorder = rect;
rectBorder.Deflate(4, 3);
if ( dir == wxBOTTOM )
rectBorder.Offset(0, -1);
if ( dir == wxRIGHT )
rectBorder.Offset(-1, 0);
DrawRect
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -