📄 win32.cpp
字号:
///////////////////////////////////////////////////////////////////////////////// Name: src/univ/themes/win32.cpp// Purpose: wxUniversal theme implementing Win32-like LNF// Author: Vadim Zeitlin// Modified by:// Created: 06.08.00// RCS-ID: $Id: win32.cpp,v 1.102 2006/10/30 12:33:25 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_WIN32#ifndef WX_PRECOMP #include "wx/timer.h" #include "wx/intl.h" #include "wx/dc.h" #include "wx/window.h" #include "wx/dcmemory.h" #include "wx/button.h" #include "wx/bmpbuttn.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" #ifdef __WXMSW__ // for COLOR_* constants #include "wx/msw/private.h" #endif #include "wx/menu.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/scrtimer.h"#include "wx/univ/stdrend.h"#include "wx/univ/inpcons.h"#include "wx/univ/inphand.h"#include "wx/univ/colschem.h"// ----------------------------------------------------------------------------// constants// ----------------------------------------------------------------------------static const int BORDER_THICKNESS = 2;static const size_t NUM_STATUSBAR_GRIP_BANDS = 3;static const size_t WIDTH_STATUSBAR_GRIP_BAND = 4;static const size_t STATUSBAR_GRIP_SIZE = WIDTH_STATUSBAR_GRIP_BAND*NUM_STATUSBAR_GRIP_BANDS;static const wxCoord SLIDER_MARGIN = 6; // margin around sliderstatic const wxCoord SLIDER_THUMB_LENGTH = 18;static const wxCoord SLIDER_TICK_LENGTH = 6;// wxWin32Renderer: draw the GUI elements in Win32 style// ----------------------------------------------------------------------------class wxWin32Renderer : public wxStdRenderer{public: // ctor wxWin32Renderer(const wxColourScheme *scheme); // reimplement the renderer methods which are different for this theme virtual void DrawLabel(wxDC& dc, const wxString& label, const wxRect& rect, int flags = 0, int alignment = wxALIGN_LEFT | wxALIGN_TOP, int indexAccel = -1, wxRect *rectBounds = NULL); virtual void DrawButtonLabel(wxDC& dc, const wxString& label, const wxBitmap& image, const wxRect& rect, int flags = 0, int alignment = wxALIGN_LEFT | wxALIGN_TOP, int indexAccel = -1, wxRect *rectBounds = NULL); 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 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_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& dc, const wxRect& rect, int lenThumb, wxOrientation orient, int start, int end, int step = 1, int flags = 0, long style = 0);#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#if wxUSE_STATUSBAR virtual void DrawStatusField(wxDC& dc, const wxRect& rect, const wxString& label, int flags = 0, int style = 0);#endif // wxUSE_STATUSBAR virtual void GetComboBitmaps(wxBitmap *bmpNormal, wxBitmap *bmpFocus, wxBitmap *bmpPressed, wxBitmap *bmpDisabled); virtual void AdjustSize(wxSize *size, const wxWindow *window); virtual bool AreScrollbarsInsideBorder() const; virtual wxSize GetScrollbarArrowSize() const { return m_sizeScrollbarArrow; } virtual wxSize GetCheckBitmapSize() const { return wxSize(13, 13); } virtual wxSize GetRadioBitmapSize() const { return wxSize(12, 12); } virtual wxCoord GetCheckItemMargin() const { return 0; }#if wxUSE_TOOLBAR virtual wxSize GetToolBarButtonSize(wxCoord *separator) const { if ( separator ) *separator = 5; return wxSize(16, 15); } virtual wxSize GetToolBarMargin() const { return wxSize(4, 4); }#endif // wxUSE_TOOLBAR#if wxUSE_TEXTCTRL virtual wxRect GetTextTotalArea(const wxTextCtrl *text, const wxRect& rect) const; 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, 5); }#endif // wxUSE_NOTEBOOK#if wxUSE_SLIDER virtual wxCoord GetSliderDim() const { return SLIDER_THUMB_LENGTH + 2*BORDER_THICKNESS; } virtual wxCoord GetSliderTickLen() const { return SLIDER_TICK_LENGTH; } 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_MENUSprotected: // overridden wxStdRenderer methods 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); // draw the border used for scrollbar arrows void DrawArrowBorder(wxDC& dc, wxRect *rect, bool isPressed = false); // public DrawArrow()s helper void DrawArrow(wxDC& dc, const wxRect& rect, ArrowDirection arrowDir, ArrowStyle arrowStyle); // DrawArrowButton is used by DrawScrollbar and DrawComboButton void DrawArrowButton(wxDC& dc, const wxRect& rect, ArrowDirection arrowDir, ArrowStyle arrowStyle); // draw a normal or transposed line (useful for using the same code fo both // horizontal and vertical widgets) void DrawLine(wxDC& dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, bool transpose = false) { if ( transpose ) dc.DrawLine(y1, x1, y2, x2); else dc.DrawLine(x1, y1, x2, y2); } // get the standard check/radio button bitmap wxBitmap GetIndicator(IndicatorType indType, int flags); virtual wxBitmap GetCheckBitmap(int flags) { return GetIndicator(IndicatorType_Check, flags); } virtual wxBitmap GetRadioBitmap(int flags) { return GetIndicator(IndicatorType_Radio, flags); } virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type);private: // the sizing parameters (TODO make them changeable) wxSize m_sizeScrollbarArrow; // the checked and unchecked bitmaps for DrawCheckItemBitmap() wxBitmap m_bmpCheckBitmaps[IndicatorStatus_Max]; // the bitmaps returned by GetIndicator() wxBitmap m_bmpIndicators[IndicatorType_Max] [IndicatorState_MaxMenu] [IndicatorStatus_Max]; // titlebar icons: wxBitmap m_bmpFrameButtons[FrameButton_Max]; // standard defaults for the above bitmaps static const char **ms_xpmChecked[IndicatorStatus_Max]; static const char **ms_xpmIndicators[IndicatorType_Max] [IndicatorState_MaxMenu] [IndicatorStatus_Max]; static const char **ms_xpmFrameButtons[FrameButton_Max]; // first row is for the normal state, second - for the disabled wxBitmap m_bmpArrows[Arrow_StateMax][Arrow_Max];};// ----------------------------------------------------------------------------// wxWin32InputHandler and derived classes: process the keyboard and mouse// messages according to Windows standards// ----------------------------------------------------------------------------class wxWin32InputHandler : public wxInputHandler{public: wxWin32InputHandler() { } virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed); virtual bool HandleMouse(wxInputConsumer *control, const wxMouseEvent& event);};#if wxUSE_SCROLLBARclass wxWin32ScrollBarInputHandler : public wxStdScrollBarInputHandler{public: wxWin32ScrollBarInputHandler(wxRenderer *renderer, wxInputHandler *handler); virtual bool HandleMouse(wxInputConsumer *control, const wxMouseEvent& event); virtual bool HandleMouseMove(wxInputConsumer *control, const wxMouseEvent& event); virtual bool OnScrollTimer(wxScrollBar *scrollbar, const wxControlAction& action);protected: virtual void Highlight(wxScrollBar * WXUNUSED(scrollbar), bool WXUNUSED(doIt)) { // we don't highlight anything } // the first and last event which caused the thumb to move wxMouseEvent m_eventStartDrag, m_eventLastDrag; // have we paused the scrolling because the mouse moved? bool m_scrollPaused; // we remember the interval of the timer to be able to restart it int m_interval;};#endif // wxUSE_SCROLLBAR#if wxUSE_CHECKBOXclass wxWin32CheckboxInputHandler : public wxStdInputHandler{public: wxWin32CheckboxInputHandler(wxInputHandler *handler) : wxStdInputHandler(handler) { } virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed);};#endif // wxUSE_CHECKBOX#if wxUSE_TEXTCTRLclass wxWin32TextCtrlInputHandler : public wxStdInputHandler{public: wxWin32TextCtrlInputHandler(wxInputHandler *handler) : wxStdInputHandler(handler) { } virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed);};#endif // wxUSE_TEXTCTRLclass wxWin32StatusBarInputHandler : public wxStdInputHandler{public: wxWin32StatusBarInputHandler(wxInputHandler *handler); virtual bool HandleMouse(wxInputConsumer *consumer, const wxMouseEvent& event); virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);protected: // is the given point over the statusbar grip? bool IsOnGrip(wxWindow *statbar, const wxPoint& pt) const;private: // the cursor we had replaced with the resize one wxCursor m_cursorOld; // was the mouse over the grip last time we checked? bool m_isOnGrip;};class wxWin32SystemMenuEvtHandler;class wxWin32FrameInputHandler : public wxStdInputHandler{public: wxWin32FrameInputHandler(wxInputHandler *handler); virtual ~wxWin32FrameInputHandler(); virtual bool HandleMouse(wxInputConsumer *control, const wxMouseEvent& event); virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);#if wxUSE_MENUS void PopupSystemMenu(wxTopLevelWindow *window) const;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -