📄 gtk.cpp
字号:
// draw the rectange using the first brush for the left and top sides and
// the second one for the bottom and right ones
void DrawShadedRect(wxDC& dc, wxRect *rect,
const wxPen& pen1, const wxPen& pen2);
// 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);
// draw the normal 3D border
void DrawRaisedBorder(wxDC& dc, wxRect *rect);
// 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);
#if wxUSE_SCROLLBAR
// returns the size of the arrow for the scrollbar (depends on
// orientation)
wxSize GetScrollbarArrowSize(const wxScrollBar *scrollbar) const
{
wxSize size;
if ( scrollbar->IsVertical() )
{
size = m_sizeScrollbarArrow;
}
else
{
size.x = m_sizeScrollbarArrow.y;
size.y = m_sizeScrollbarArrow.x;
}
return size;
}
#endif // wxUSE_SCROLLBAR
// get the line wrap indicator bitmap
wxBitmap GetLineWrapBitmap() const;
// DrawCheckBitmap and DrawRadioBitmap helpers
// draw the check bitmaps once and cache them for later use
wxBitmap GetCheckBitmap(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);
// draw check/radio - the bitmap must be a valid one by now
void DoDrawCheckOrRadioBitmap(wxDC& dc,
const wxString& label,
const wxBitmap& bitmap,
const wxRect& rectTotal,
int flags,
wxAlignment align,
int indexAccel);
// 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();
private:
const wxColourScheme *m_scheme;
// data
wxSize m_sizeScrollbarArrow;
// GDI objects
wxPen m_penBlack,
m_penDarkGrey,
m_penGrey,
m_penLightGrey,
m_penHighlight;
// the checkbox 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[2][3];
// 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(wxGTKRenderer *renderer);
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);
protected:
wxGTKRenderer *m_renderer;
};
#if wxUSE_SCROLLBAR
class 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);
}
virtual void Press(wxScrollBar *scrollbar, bool doIt)
{
// only arrows can be pressed
if ( !IsArrow() )
return;
wxStdScrollBarInputHandler::Press(scrollbar, doIt);
}
virtual bool IsAllowedButton(int WXUNUSED(button)) { return true; }
bool IsArrow() const
{
return m_htLast == wxHT_SCROLLBAR_ARROW_LINE_1 ||
m_htLast == wxHT_SCROLLBAR_ARROW_LINE_2;
}
};
#endif // wxUSE_SCROLLBAR
#if wxUSE_CHECKBOX
class wxGTKCheckboxInputHandler : public wxStdCheckboxInputHandler
{
public:
wxGTKCheckboxInputHandler(wxInputHandler *handler)
: wxStdCheckboxInputHandler(handler) { }
virtual bool HandleKey(wxInputConsumer *control,
const wxKeyEvent& event,
bool pressed);
};
#endif // wxUSE_CHECKBOX
#if wxUSE_TEXTCTRL
class wxGTKTextCtrlInputHandler : public wxStdTextCtrlInputHandler
{
public:
wxGTKTextCtrlInputHandler(wxInputHandler *handler)
: wxStdTextCtrlInputHandler(handler) { }
virtual bool HandleKey(wxInputConsumer *control,
const wxKeyEvent& event,
bool pressed);
};
#endif // wxUSE_TEXTCTRL
// ----------------------------------------------------------------------------
// wxGTKColourScheme: uses the standard GTK colours
// ----------------------------------------------------------------------------
class wxGTKColourScheme : public wxColourScheme
{
public:
virtual wxColour Get(StdColour col) const;
virtual wxColour GetBackground(wxWindow *win) const;
};
// ----------------------------------------------------------------------------
// wxGTKArtProvider
// ----------------------------------------------------------------------------
class wxGTKArtProvider : public wxArtProvider
{
protected:
virtual wxBitmap CreateBitmap(const wxArtID& id,
const wxArtClient& client,
const wxSize& size);
};
// ----------------------------------------------------------------------------
// wxGTKTheme
// ----------------------------------------------------------------------------
WX_DEFINE_ARRAY_PTR(wxInputHandler *, wxArrayHandlers);
class wxGTKTheme : public wxTheme
{
public:
wxGTKTheme();
virtual ~wxGTKTheme();
virtual wxRenderer *GetRenderer();
virtual wxArtProvider *GetArtProvider();
virtual wxInputHandler *GetInputHandler(const wxString& control);
virtual wxColourScheme *GetColourScheme();
private:
// get the default input handler
wxInputHandler *GetDefaultInputHandler();
wxGTKRenderer *m_renderer;
wxGTKArtProvider *m_artProvider;
// the names of the already created handlers and the handlers themselves
// (these arrays are synchronized)
wxSortedArrayString m_handlerNames;
wxArrayHandlers m_handlers;
wxGTKInputHandler *m_handlerDefault;
wxGTKColourScheme *m_scheme;
WX_DECLARE_THEME(gtk)
};
// ============================================================================
// implementation
// ============================================================================
WX_IMPLEMENT_THEME(wxGTKTheme, gtk, wxTRANSLATE("GTK+ theme"));
// ----------------------------------------------------------------------------
// wxGTKTheme
// ----------------------------------------------------------------------------
wxGTKTheme::wxGTKTheme()
{
m_scheme = NULL;
m_renderer = NULL;
m_handlerDefault = NULL;
m_artProvider = NULL;
}
wxGTKTheme::~wxGTKTheme()
{
size_t count = m_handlers.GetCount();
for ( size_t n = 0; n < count; n++ )
{
if ( m_handlers[n] != m_handlerDefault )
delete m_handlers[n];
}
delete m_handlerDefault;
delete m_renderer;
delete m_scheme;
wxArtProvider::RemoveProvider(m_artProvider);
}
wxRenderer *wxGTKTheme::GetRenderer()
{
if ( !m_renderer )
{
m_renderer = new wxGTKRenderer(GetColourScheme());
}
return m_renderer;
}
wxArtProvider *wxGTKTheme::GetArtProvider()
{
if ( !m_artProvider )
{
m_artProvider = new wxGTKArtProvider;
}
return m_artProvider;
}
wxColourScheme *wxGTKTheme::GetColourScheme()
{
if ( !m_scheme )
{
m_scheme = new wxGTKColourScheme;
}
return m_scheme;
}
wxInputHandler *wxGTKTheme::GetDefaultInputHandler()
{
if ( !m_handlerDefault )
{
m_handlerDefault = new wxGTKInputHandler(m_renderer);
}
return m_handlerDefault;
}
wxInputHandler *wxGTKTheme::GetInputHandler(const wxString& control)
{
wxInputHandler *handler = NULL;
int n = m_handlerNames.Index(control);
if ( n == wxNOT_FOUND )
{
// create a new handler
if ( control == wxINP_HANDLER_SCROLLBAR )
{
#if wxUSE_SCROLLBAR
handler = new wxGTKScrollBarInputHandler(m_renderer,
GetDefaultInputHandler());
#endif // wxUSE_SCROLLBAR
}
#if wxUSE_BUTTON
else if ( control == wxINP_HANDLER_BUTTON )
handler = new wxStdButtonInputHandler(GetDefaultInputHandler());
#endif // wxUSE_CHECKBOX
#if wxUSE_CHECKBOX
else if ( control == wxINP_HANDLER_CHECKBOX )
handler = new wxGTKCheckboxInputHandler(GetDefaultInputHandler());
#endif // wxUSE_CHECKBOX
#if wxUSE_COMBOBOX
else if ( control == wxINP_HANDLER_COMBOBOX )
handler = new wxStdComboBoxInputHandler(GetDefaultInputHandler());
#endif // wxUSE_COMBOBOX
#if wxUSE_LISTBOX
else if ( control == wxINP_HANDLER_LISTBOX )
handler = new wxStdListboxInputHandler(GetDefaultInputHandler());
#endif // wxUSE_LISTBOX
#if wxUSE_CHECKLISTBOX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -