📄 gtk.cpp
字号:
{ if ( flags & wxCONTROL_FOCUSED ) { DrawRect(dc, &rect, m_penBlack); DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); } else // !focused { DrawInnerShadedRect(dc, &rect); } } if ( rectIn ) *rectIn = rect;}void wxGTKRenderer::DrawButtonLabel(wxDC& dc, const wxString& label, const wxBitmap& image, const wxRect& rect, int flags, int alignment, int indexAccel, wxRect *rectBounds){ // no focus rect around buttons label in GTK+ wxStdRenderer::DrawButtonLabel(dc, label, image, rect, flags, alignment, indexAccel, rectBounds);}void wxGTKRenderer::DrawButtonBorder(wxDC& dc, const wxRect& rectTotal, int flags, wxRect *rectIn){ wxRect rect = rectTotal; if ( flags & wxCONTROL_PRESSED ) { // button pressed: draw a black border around it and an inward shade DrawRect(dc, &rect, m_penBlack); DrawInnerShadedRect(dc, &rect); } else // button not pressed { if ( flags & wxCONTROL_ISDEFAULT ) { // TODO } if ( flags & wxCONTROL_FOCUSED ) { // button is currently default: add an extra border around it DrawRect(dc, &rect, m_penBlack); } // now draw a normal button DrawShadedRect(dc, &rect, m_penHighlight, m_penBlack); DrawAntiShadedRect(dc, &rect, GetBackgroundColour(flags), m_penDarkGrey); } if ( rectIn ) *rectIn = rect;}// ----------------------------------------------------------------------------// lines and frames// ----------------------------------------------------------------------------void wxGTKRenderer::DrawFrameWithLabel(wxDC& dc, const wxString& label, const wxRect& rectFrame, const wxRect& rectTextOrig, int flags, int alignment, int indexAccel){ wxRect rectText(rectTextOrig); rectText.Inflate(1, 0); wxRect rectLabel; DrawLabel(dc, label, rectText, flags, alignment, indexAccel, &rectLabel); rectLabel.x -= 1; rectLabel.width += 2; DrawFrameWithoutLabel(dc, rectFrame, rectLabel); // GTK+ does it like this dc.SetPen(m_penHighlight); dc.DrawPoint(rectText.x, rectFrame.y); dc.DrawPoint(rectText.x + rectLabel.width - 3, rectFrame.y);}// ----------------------------------------------------------------------------// check/radion buttons// ----------------------------------------------------------------------------void wxGTKRenderer::DrawCheckItemBitmap(wxDC& dc, const wxBitmap& bitmap, const wxRect& rect, int flags){ // never draw the focus rect around the check indicators here DrawCheckButton(dc, wxEmptyString, bitmap, rect, flags & ~wxCONTROL_FOCUSED);}void wxGTKRenderer::DrawUndeterminedBitmap(wxDC& dc, const wxRect& rectTotal, bool isPressed){ // FIXME: For sure it is not GTK look but it is better than nothing. // Show me correct look and I will immediatelly make it better (ABX) wxRect rect = rectTotal; wxColour col1, col2; if ( isPressed ) { col1 = wxSCHEME_COLOUR(m_scheme, SHADOW_DARK); col2 = wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED); } else { col1 = wxSCHEME_COLOUR(m_scheme, SHADOW_DARK); col2 = wxSCHEME_COLOUR(m_scheme, SHADOW_IN); } dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(col1); dc.DrawRectangle(rect); rect.Deflate(1); dc.SetBrush(col2); dc.DrawRectangle(rect);}void wxGTKRenderer::DrawUncheckBitmap(wxDC& dc, const wxRect& rectTotal, bool isPressed){ wxRect rect = rectTotal; DrawAntiRaisedBorder(dc, &rect); wxColour col = wxSCHEME_COLOUR(m_scheme, SHADOW_IN); dc.SetPen(wxPen(col)); dc.DrawPoint(rect.GetRight() - 1, rect.GetBottom() - 1); if ( isPressed ) col = wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED); //else: it is SHADOW_IN, leave as is dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(col); dc.DrawRectangle(rect);}void wxGTKRenderer::DrawCheckBitmap(wxDC& dc, const wxRect& rectTotal){ wxRect rect = rectTotal; DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); DrawShadedRect(dc, &rect, m_penBlack, m_penLightGrey); dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED)); dc.DrawRectangle(rect);}void wxGTKRenderer::DrawRadioBitmap(wxDC& dc, const wxRect& rect, int flags){ wxCoord x = rect.x, y = rect.y, xRight = rect.GetRight(), yBottom = rect.GetBottom(); wxCoord yMid = (y + yBottom) / 2; // then draw the upper half dc.SetPen(flags & wxCONTROL_CHECKED ? m_penDarkGrey : m_penHighlight); DrawUpZag(dc, x, xRight, yMid, y); DrawUpZag(dc, x + 1, xRight - 1, yMid, y + 1); bool drawIt = true; if ( flags & wxCONTROL_CHECKED ) dc.SetPen(m_penBlack); else if ( flags & wxCONTROL_PRESSED ) dc.SetPen(wxPen(wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED))); else // unchecked and unpressed drawIt = false; if ( drawIt ) DrawUpZag(dc, x + 2, xRight - 2, yMid, y + 2); // and then the lower one dc.SetPen(flags & wxCONTROL_CHECKED ? m_penHighlight : m_penBlack); DrawDownZag(dc, x, xRight, yMid, yBottom); if ( !(flags & wxCONTROL_CHECKED) ) dc.SetPen(m_penDarkGrey); DrawDownZag(dc, x + 1, xRight - 1, yMid, yBottom - 1); if ( !(flags & wxCONTROL_CHECKED) ) drawIt = true; // with the same pen else if ( flags & wxCONTROL_PRESSED ) { dc.SetPen(wxPen(wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED))); drawIt = true; } else // checked and unpressed drawIt = false; if ( drawIt ) DrawDownZag(dc, x + 2, xRight - 2, yMid, yBottom - 2);}void wxGTKRenderer::DrawUpZag(wxDC& dc, wxCoord x1, wxCoord x2, wxCoord y1, wxCoord y2){ wxCoord xMid = (x1 + x2) / 2; dc.DrawLine(x1, y1, xMid, y2); dc.DrawLine(xMid, y2, x2 + 1, y1 + 1);}void wxGTKRenderer::DrawDownZag(wxDC& dc, wxCoord x1, wxCoord x2, wxCoord y1, wxCoord y2){ 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); } IndicatorState state; IndicatorStatus status; GetIndicatorsFromFlags(flags, state, status); // disabled looks the same as normal if ( state == IndicatorState_Disabled ) state = IndicatorState_Normal; return m_bitmapsCheckbox[state][status];}wxBitmap wxGTKRenderer::GetRadioBitmap(int flags){ IndicatorState state; IndicatorStatus status; GetIndicatorsFromFlags(flags, state, status); wxBitmap& bmp = m_bitmapsRadiobtn[state][status]; if ( !bmp.Ok() ) { const wxSize size = GetRadioBitmapSize(); wxMemoryDC dc; bmp.Create(size.x, size.y); dc.SelectObject(bmp); DrawRadioBitmap(dc, size, flags); } return bmp;}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;}#if wxUSE_TOOLBARvoid 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_TEXTCTRLwxRect wxGTKRenderer::GetTextClientArea(const wxTextCtrl *text, const wxRect& rect, wxCoord *extraSpaceBeyond) const{ wxRect rectText = wxStdRenderer::GetTextClientArea(text, rect, extraSpaceBeyond); 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;}void wxGTKRenderer::DrawLineWrapMark(wxDC& dc, const wxRect& rect){ wxBitmap bmpLineWrap = GetLineWrapBitmap();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -