📄 listviewwindow.h
字号:
/* * * listviewwindow.h * Copyright (C) 2006 Michael H. Overlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact at poster_printer@yahoo.com */#ifndef LISTVIEWWINDOW_H#define LISTVIEWWINDOW_H#include "coordtrans.h"#include "rulerdrawer.h"#include "renderpages.h"#include "selectionboxsprite.h"#include "window.h"#include <windows.h>#include <vector>// ** DONT DELETE THIS COMMENT **// GetCount MUST BE >=1 AND BOUNDS CANNOT BE EMPTY ; NO ITEMS RULED BOUNDS CAN BE EMPTYclass ViewableList {public: // THE 'HAND' AND 'ARROW' STATES CAN BE CONSIDERED FLAG BITS typedef uint SelectionSpec; enum { eNormal = 0, eHandSel = 1, eArrowSel = 2, eHandArrowSel = 3 }; virtual ~ViewableList() {} // PURE VIRTUAL INTERFACE virtual uint GetCount(void) const = 0; virtual void GetBounds(OUT RECTD& rd) const = 0; virtual void GetItemRuledBounds(IN uint uiItem, OUT RECTD& rd) const = 0; virtual void GetItemBounds(IN uint uiItem, OUT RECTD& rd) const = 0; virtual BOOL ItemFromPt(OUT uint& uiItem, IN const POINTD& ptd) const = 0; // APPENDS ITEM INDICES TO vuiItem virtual BOOL ItemsFromRect(OUT std::vector<uint>& vuiItem, const RECTD& rd) const = 0; virtual void DrawItem(OUT HDC hdcDest, IN const CoordTrans& trans, IN const RECT& rDest, IN uint uiItem, IN ViewableList::SelectionSpec sel, IN BOOL bDraft) const = 0; virtual void Draw(OUT HDC hdcDest, IN const CoordTrans& trans, IN const RECT& rDest, const std::vector<ViewableList::SelectionSpec> &vsel, IN BOOL bDraft) const = 0; virtual void Draw(OUT HDC hdcDest, IN const CoordTrans& trans, IN const RECT& rDest, IN BOOL bDraft) const = 0; // INTERFACE WITH DEFAULT ACTIONS virtual void GetItemSelectableBounds(IN uint uiItem, OUT RECTD& rd) const { this->GetItemRuledBounds(uiItem, rd); }};#define LISTVIEWWINDOW_CLASSNAME TEXT("ListViewWindow")class ListViewWindow : public Window {public: enum ArrowSelectionMode { eSelectBox, eSelectItems, eArrowSelectionModeNUMBER }; enum NotificationCode { eHandSelChange, eRulerUnitsChange, eArrowSelectionBoxChange, eArrowSelectionItemsChange, eArrowSelectionModeChange }; enum CursorType { eArrow, eHand }; ListViewWindow(HINSTANCE hinst, HWND hwnd); ~ListViewWindow(); //void Init(ListViewWindow::ArrowSelectionMode arrowSelMode, const SIZED& szdMinSelectionBox); const ::ViewableList* GetList(void) const { return m_pList; } ::ViewableList* SetList(IN ViewableList *pList, IN const RulerDrawerProvider *prdp, ListViewWindow::ArrowSelectionMode arrowSelMode, const SIZED& szdMinSelectionBox); void SetZoomLevel(IN double dZoom); double GetZoomLevel(void) const; ListViewWindow::CursorType GetCursorType(void) const { return m_ct; } void SetCursorType(IN CursorType ct); BOOL HasRulerUnitLabel(RulerPlacementSpec::Direction dir) const; const tstring& GetRulerUnitLabel(RulerPlacementSpec::Direction dir) const ; BOOL HasArrowSelectionBox(void) const ; const RECTD& GetArrowSelectionBox(void) const ; //void SetNoSelectionBox(void); void SetArrowSelectionBox(IN BOOL bSelectionBox, const RECTD *prdSelectionBox, IN BOOL bSendNotification = FALSE) ; BOOL HasSelectionItems(void) const; const std::vector<uint>& GetSelectionItems(void) const; // 7/2 ListViewWindow::ArrowSelectionMode GetArrowSelectionMode(void) const { return m_arrowSelMode; } BOOL GetDraftMode(void) const { return m_bDraftMode; } void SetDraftMode(IN BOOL bDraftMode); // THIS CLASS DOESN'T DELETE THESE CURSORS void SetCursorResources(IN HCURSOR hcursHand, IN HCURSOR hcursArrow);protected: virtual void Paint(HDC hdc); virtual void PaintDirectLayer(HDC hdc); virtual void CursorMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam); virtual void KeyboardMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam); virtual void MouseMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam); virtual void TimerMsg(OUT MSGRESULT& mr, WPARAM wParam, LPARAM lParam);private: enum MouseTrackingMode { eNotTracking, eTrackViewTranslation, eTrackDottedSelection, eTrackDragBoxPart }; struct HandSelState { HandSelState(void) { bHasHandSel = FALSE; } HandSelState(BOOL b, uint ui) { bHasHandSel = b; uiItem =ui; } BOOL bHasHandSel; uint uiItem; //BOOL operator !=(const HandSelState& hss) const { return (bHasHandSel ^ hss.bHasHandSel) || (bHasHandSel && hss.bHasHandSel && uiItem != hss.uiItem); } BOOL operator !=(const HandSelState& hss) const { return lxor(bHasHandSel, hss.bHasHandSel) || (bHasHandSel && hss.bHasHandSel && uiItem != hss.uiItem); } BOOL operator ==(const HandSelState& hss) const { return !( *this != hss ); } }; void CalculateLayout(void); void DragArrowSelectionBoxPart(const POINT& ptDelta, BOOL bWithPaint); void DrawArrowSelectionOutline(OUT HDC hdc, IN const RECTD& rdMouseSelOld, IN BOOL bEraseOld, IN BOOL bDrawNew); BOOL IsValidArrowSelectionBox(OUT RECTD& rdBoxAdjusted, const RECTD& rBox) const; void InvalidateItem(uint uiItem) ; void EndMouseTracking(BOOL bCancel, BOOL bCtrl); void ResetRulers(void); //6/2 //void ResetSelection(void); void MoveArrowSelectionBox(BOOL bHasArrowSelectionBox, const RECTD *prdNew, BOOL bWithPaint, BOOL bNotify) ; void MoveArrowSelectionOutline(const POINTD& ptd1, const POINTD& ptd2, BOOL bEraseOld, BOOL bDrawNew) ; void ResetView(void); BOOL SelModeVectorHasMode(uint uiSelMode) const ; void SetArrowSelection(const POINTD& ptd, BOOL bCtrl); void SetArrowSelection(const RECTD& rd, BOOL bCtrl); void SetArrowSelection(const std::vector<uint>& vuiItem, BOOL bCtrl) ; void StartMouseTracking(ListViewWindow::MouseTrackingMode mouseTrackMode); void SetHandSelection(const HandSelState& handsel); void Translate(IN const POINT& ptDelta); // 7/2 BOOL m_bDraftMode; // COORDINATE TRANSFORMATION AND THE VIEWABLE LIST CoordTrans m_trans; ViewableList *m_pList; // RULERS LogFontKeeper m_lfkHoriz; LogFontKeeper m_lfkVert; Ruler m_rHoriz; Ruler m_rVert; const RulerDrawerProvider *m_prdp; // ITEM SELECTION HandSelState m_handsel; ListViewWindow::ArrowSelectionMode m_arrowSelMode; // -- FOR THE ARROW SELECTION BOX BOOL m_bHasArrowSelectionBox; RECTD m_rdSelectionBox; SIZED m_szdMinSelectionBox; class SelectionBoxSprite *m_ps; RECT m_rSelectionBox; // -- FOR THE ARROW SELECTION OUTLINE RECTD m_rdArrowSelectionOutline; // -- FOR THE ARROW SELECTION OUTLINE AND HAND SELECTION std::vector<uint> m_vsel; // LAYOUT RECT m_rViewFrame; RECT m_rView; RECT m_rHorizRuler; RECT m_rVertRuler; // CURSOR CursorType m_ct; // MOUSE TRACKING // CHANGE SOME BOOLS TO AN ENUM LATER -- FIX //BOOL m_bHasMouseCapture; MouseTrackingMode m_mouseTrackMode; POINT m_ptMouseDown; POINTD m_ptdMouseDown; POINT m_ptMouseLast; // -- DRAGGING THE ARROW SELECTION BOX PARTS //BOOL m_bDragBoxPart; ::BoxPart m_bpMouseDrag; // 7/7 DEBUG/FIX TRY TO MAKE MOUSE TRACK BOX PART BETTER POINTD m_ptdLastGoodDragDelta; //BOOL m_bHasLastGoodDragDelta; // THIS IS USED ONLY TO SEE IF DRAGGING THE SELECTION BOX // ACTUALLY RESULTED IN A CHANGE AFTER THE LEFT MOUSE BUTTON COMES UP // IT ISN'T USED FOR ANYTHING ELSE, AND IS NOT VALID OTHERWISE OR EVEN INITIALIZED RECTD m_rdDragBoxPart_InitialSelectionBox; // CURSORS THAT MAY BE SET BY CLIENT HCURSOR m_hcursArrow; HCURSOR m_hcursHand; // LOADED CURSORS HCURSOR m_hcursTwoArrowTLBR; HCURSOR m_hcursTwoArrowTRBL; HCURSOR m_hcursFourArrow; // **** // **** static stuff // **** public: static LPCTSTR TheirGetWindowClassName(void) { return ListViewWindow::atstrWindowClassName; }private: static TCHAR atstrWindowClassName[];};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -