📄 gtk.cpp
字号:
///////////////////////////////////////////////////////////////////////////////// Name: src/univ/themes/gtk.cpp// Purpose: wxUniversal theme implementing GTK-like LNF// Author: Vadim Zeitlin// Modified by:// Created: 06.08.00// RCS-ID: $Id: gtk.cpp,v 1.68 2006/10/30 12:33:24 VS Exp $// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)// Licence: wxWindows licence///////////////////////////////////////////////////////////////////////////////// ===========================================================================// declarations// ===========================================================================// ---------------------------------------------------------------------------// headers// ---------------------------------------------------------------------------// for compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__ #pragma hdrstop#endif#include "wx/univ/theme.h"#if wxUSE_THEME_GTK#ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" #include "wx/dcmemory.h" #include "wx/window.h" #include "wx/menu.h" #include "wx/bmpbuttn.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/listbox.h" #include "wx/checklst.h" #include "wx/combobox.h" #include "wx/scrolbar.h" #include "wx/slider.h" #include "wx/textctrl.h" #include "wx/toolbar.h" #include "wx/statusbr.h" #include "wx/settings.h" #include "wx/toplevel.h" #include "wx/image.h"#endif // WX_PRECOMP#include "wx/notebook.h"#include "wx/spinbutt.h"#include "wx/artprov.h"#ifdef wxUSE_TOGGLEBTN#include "wx/tglbtn.h"#endif // wxUSE_TOGGLEBTN#include "wx/univ/stdrend.h"#include "wx/univ/inpcons.h"#include "wx/univ/inphand.h"#include "wx/univ/colschem.h"class WXDLLEXPORT wxGTKMenuGeometryInfo;// ----------------------------------------------------------------------------// constants// ----------------------------------------------------------------------------// standard border sizestatic const int BORDER_THICKNESS = 2;// ----------------------------------------------------------------------------// wxGTKRenderer: draw the GUI elements in GTK style// ----------------------------------------------------------------------------class wxGTKRenderer : public wxStdRenderer{public: wxGTKRenderer(const wxColourScheme *scheme); // wxRenderer methods virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0); virtual void DrawTextBorder(wxDC& dc, wxBorder border, const wxRect& rect, int flags = 0, wxRect *rectIn = NULL); virtual void DrawButtonLabel(wxDC& dc, const wxString& label, const wxBitmap& image, const wxRect& rect, int flags, int alignment, int indexAccel, wxRect *rectBounds); virtual void DrawButtonBorder(wxDC& dc, const wxRect& rect, int flags = 0, wxRect *rectIn = NULL); virtual void DrawArrow(wxDC& dc, wxDirection dir, const wxRect& rect, int flags = 0); virtual void DrawScrollbarArrow(wxDC& dc, wxDirection dir, const wxRect& rect, int flags = 0); virtual void DrawScrollbarThumb(wxDC& dc, wxOrientation orient, const wxRect& rect, int flags = 0); virtual void DrawScrollbarShaft(wxDC& dc, wxOrientation orient, const wxRect& rect, int flags = 0);#if wxUSE_TOOLBAR virtual void DrawToolBarButton(wxDC& dc, const wxString& label, const wxBitmap& bitmap, const wxRect& rect, int flags = 0, long style = 0, int tbarStyle = 0);#endif // wxUSE_TOOLBAR#if wxUSE_TEXTCTRL virtual void DrawLineWrapMark(wxDC& dc, const wxRect& rect);#endif // wxUSE_TEXTCTRL#if wxUSE_NOTEBOOK virtual void DrawTab(wxDC& dc, const wxRect& rect, wxDirection dir, const wxString& label, const wxBitmap& bitmap = wxNullBitmap, int flags = 0, int indexAccel = -1);#endif // wxUSE_NOTEBOOK#if wxUSE_SLIDER virtual void DrawSliderShaft(wxDC& dc, const wxRect& rect, int lenThumb, wxOrientation orient, int flags = 0, long style = 0, wxRect *rectShaft = NULL); virtual void DrawSliderThumb(wxDC& dc, const wxRect& rect, wxOrientation orient, int flags = 0, long style = 0); virtual void DrawSliderTicks(wxDC& WXUNUSED(dc), const wxRect& WXUNUSED(rect), int WXUNUSED(lenThumb), wxOrientation WXUNUSED(orient), int WXUNUSED(start), int WXUNUSED(end), int WXUNUSED(step) = 1, int WXUNUSED(flags) = 0, long WXUNUSED(style) = 0) { // we don't have the ticks in GTK version }#endif // wxUSE_SLIDER#if wxUSE_MENUS virtual void DrawMenuBarItem(wxDC& dc, const wxRect& rect, const wxString& label, int flags = 0, int indexAccel = -1); virtual void DrawMenuItem(wxDC& dc, wxCoord y, const wxMenuGeometryInfo& geometryInfo, const wxString& label, const wxString& accel, const wxBitmap& bitmap = wxNullBitmap, int flags = 0, int indexAccel = -1); virtual void DrawMenuSeparator(wxDC& dc, wxCoord y, const wxMenuGeometryInfo& geomInfo);#endif // wxUSE_MENUS virtual void GetComboBitmaps(wxBitmap *bmpNormal, wxBitmap *bmpFocus, wxBitmap *bmpPressed, wxBitmap *bmpDisabled); virtual void AdjustSize(wxSize *size, const wxWindow *window); // geometry and hit testing#if wxUSE_SCROLLBAR virtual wxSize GetScrollbarArrowSize() const { return m_sizeScrollbarArrow; }#endif // wxUSE_SCROLLBAR virtual wxSize GetCheckBitmapSize() const { return wxSize(10, 10); } virtual wxSize GetRadioBitmapSize() const { return wxSize(11, 11); } virtual wxCoord GetCheckItemMargin() const { return 2; }#if wxUSE_TOOLBAR virtual wxSize GetToolBarButtonSize(wxCoord *separator) const { if ( separator ) *separator = 5; return wxSize(16, 15); } virtual wxSize GetToolBarMargin() const { return wxSize(6, 6); }#endif // wxUSE_TOOLBAR#if wxUSE_TEXTCTRL virtual wxRect GetTextClientArea(const wxTextCtrl *text, const wxRect& rect, wxCoord *extraSpaceBeyond) const;#endif // wxUSE_TEXTCTRL#if wxUSE_NOTEBOOK virtual wxSize GetTabIndent() const { return wxSize(2, 2); } virtual wxSize GetTabPadding() const { return wxSize(6, 6); }#endif // wxUSE_NOTEBOOK#if wxUSE_SLIDER virtual wxCoord GetSliderDim() const { return 15; } virtual wxCoord GetSliderTickLen() const { return 0; } virtual wxRect GetSliderShaftRect(const wxRect& rect, int lenThumb, wxOrientation orient, long style = 0) const; virtual wxSize GetSliderThumbSize(const wxRect& rect, int lenThumb, wxOrientation orient) const;#endif // wxUSE_SLIDER virtual wxSize GetProgressBarStep() const { return wxSize(16, 32); }#if wxUSE_MENUS virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const; virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win, const wxMenu& menu) const;#endif // wxUSE_MENUS // helpers for "wxBitmap wxColourScheme::Get()" void DrawCheckBitmap(wxDC& dc, const wxRect& rect); void DrawUncheckBitmap(wxDC& dc, const wxRect& rect, bool isPressed); void DrawUndeterminedBitmap(wxDC& dc, const wxRect& rect, bool isPressed);protected: // overridden wxStdRenderer methods virtual void DrawSunkenBorder(wxDC& dc, wxRect *rect); virtual void DrawFrameWithLabel(wxDC& dc, const wxString& label, const wxRect& rectFrame, const wxRect& rectText, int flags, int alignment, int indexAccel); virtual void DrawCheckItemBitmap(wxDC& dc, const wxBitmap& bitmap, const wxRect& rect, int flags); // get the colour to use for background wxColour GetBackgroundColour(int flags) const { if ( flags & wxCONTROL_PRESSED ) return wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED); else if ( flags & wxCONTROL_CURRENT ) return wxSCHEME_COLOUR(m_scheme, CONTROL_CURRENT); else return wxSCHEME_COLOUR(m_scheme, CONTROL); } // as DrawShadedRect() but the pixels in the bottom left and upper right // border are drawn with the pen1, not pen2 void DrawAntiShadedRect(wxDC& dc, wxRect *rect, const wxPen& pen1, const wxPen& pen2); // used for drawing opened rectangles - draws only one side of it at once // (and doesn't adjust the rect) void DrawAntiShadedRectSide(wxDC& dc, const wxRect& rect, const wxPen& pen1, const wxPen& pen2, wxDirection dir); // draw an opened rect for the arrow in given direction void DrawArrowBorder(wxDC& dc, wxRect *rect, wxDirection dir); // draw two sides of the rectangle void DrawThumbBorder(wxDC& dc, wxRect *rect, wxOrientation orient); // just as DrawRaisedBorder() except that the bottom left and up right // pixels of the interior rect are drawn in another colour (i.e. the inner // rect is drawn with DrawAntiShadedRect() and not DrawShadedRect()) void DrawAntiRaisedBorder(wxDC& dc, wxRect *rect); // draw inner GTK shadow void DrawInnerShadedRect(wxDC& dc, wxRect *rect); // get the line wrap indicator bitmap wxBitmap GetLineWrapBitmap() const; virtual wxBitmap GetCheckBitmap(int flags); virtual wxBitmap GetRadioBitmap(int flags); // draw a /\ or \/ line from (x1, y1) to (x2, y1) passing by the point // ((x1 + x2)/2, y2) void DrawUpZag(wxDC& dc, wxCoord x1, wxCoord x2, wxCoord y1, wxCoord y2); void DrawDownZag(wxDC& dc, wxCoord x1, wxCoord x2, wxCoord y1, wxCoord y2); // draw the radio button bitmap for the given state void DrawRadioBitmap(wxDC& dc, const wxRect& rect, int flags); // common part of DrawMenuItem() and DrawMenuBarItem() void DoDrawMenuItem(wxDC& dc, const wxRect& rect, const wxString& label, int flags, int indexAccel, const wxString& accel = wxEmptyString, const wxBitmap& bitmap = wxNullBitmap, const wxGTKMenuGeometryInfo *geometryInfo = NULL); // initialize the combo bitmaps void InitComboBitmaps(); virtual wxBitmap GetFrameButtonBitmap(FrameButtonType WXUNUSED(type)) { return wxNullBitmap; }private: // data wxSize m_sizeScrollbarArrow; // GDI objects wxPen m_penGrey; // the checkbox and radio button bitmaps: first row is for the normal, // second for the pressed state and the columns are for checked, unchecked // and undeterminated respectively wxBitmap m_bitmapsCheckbox[IndicatorState_MaxCtrl][IndicatorStatus_Max], m_bitmapsRadiobtn[IndicatorState_MaxCtrl][IndicatorStatus_Max]; // the line wrap bitmap (drawn at the end of wrapped lines) wxBitmap m_bmpLineWrap; // the combobox bitmaps enum { ComboState_Normal, ComboState_Focus, ComboState_Pressed, ComboState_Disabled, ComboState_Max }; wxBitmap m_bitmapsCombo[ComboState_Max];};// ----------------------------------------------------------------------------// wxGTKInputHandler and derived classes: process the keyboard and mouse// messages according to GTK standards// ----------------------------------------------------------------------------class wxGTKInputHandler : public wxInputHandler{public: wxGTKInputHandler() { } virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed); virtual bool HandleMouse(wxInputConsumer *control, const wxMouseEvent& event); virtual bool HandleMouseMove(wxInputConsumer *control, const wxMouseEvent& event);};#if wxUSE_SCROLLBARclass wxGTKScrollBarInputHandler : public wxStdScrollBarInputHandler{public: wxGTKScrollBarInputHandler(wxRenderer *renderer, wxInputHandler *handler) : wxStdScrollBarInputHandler(renderer, handler) { }protected: virtual void Highlight(wxScrollBar *scrollbar, bool doIt) { // only arrows and the thumb can be highlighted if ( !IsArrow() && m_htLast != wxHT_SCROLLBAR_THUMB ) return; wxStdScrollBarInputHandler::Highlight(scrollbar, doIt); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -