#pragma once #include "SigmaDoc.h" #include "ImageCut.h" #include "FileTransformer.h" #include "DrawOperator/expected.hpp" #include "ListenerManager.h" //namespace NDraw //{ namespace NItem { class CItemBkGrid; } typedef void(__stdcall* Listener)(BSTR); class CrossLine; class CSigmaView { public: CSigmaView(); CSigmaView(CXy* pXy); void Initialize(); ~CSigmaView(); public: CRect m_client; CSigmaDoc* m_pDoc; CDC* m_pDC; CDC* m_pImgDC; COLORREF mBackColor; double GridStepX; double GridStepY; protected: HWND m_HWND; CDC* m_pDrawDC; int m_viewportOffsetX; //视口原点偏移值 int m_viewportOffsetY; //视口原点偏移值 int m_topPageMargin; int m_bottomPageMargin; int m_leftPageMargin; int m_rightPageMargin; bool m_bShowBKGrid; POSITION m_moveSelect; wchar_t m_tipMessageBuffer[1024]; CItemBkGrid* m_pItemBkGrid; //bool m_bEnableCrossLine; bool m_bScroll; CPoint m_oldPtForDrawCrossLine; //用于画十字线 bool m_bFirstForDrawCrossLine; //是否是第一次画十字线 std::unique_ptr m_imageCut; std::unique_ptr m_pFileTransformer; HANDLE m_imgageCutHandle; //批量切图线程句柄 HANDLE m_transformerHandle; //批量文件格式转换线程句柄 BOOL m_bEnableMeshPackage = FALSE; BOOL m_bSymbolView = FALSE; CPoint m_lastRightButtonXY; bool m_bEnableRotate; std::unique_ptr m_pMemViewDC; CDC* m_pScreenDC; Listener m_listener = nullptr; ListenerManager<> m_viewChangedListenerManager; public: virtual bool OnDrawDC(); // 在画布中绘制 virtual void OnDrawMem(); // 在内存中绘制 virtual void DrawForPrint(); virtual void OnDraw(CXyDC& dc); virtual bool OnDrawAll(CDC* pDC); virtual void OnDrawAllBefore(CXyDC& dc); virtual void OnDrawAllAfter(CXyDC& dc); virtual void OnDrawOther(CDC* pCdc); virtual void SetMapUnit(CSize unit); virtual void Clear(); //void UpdateCrossLine(CDC* pDC, CPoint point); //void DrawCrossLine(CDC* pDC, CPoint point); //void EnableCrossLine(bool bEnable); //bool GetCrossLineEnabledStatus(); virtual void Scroll(int orientation, double offset); void SetTop(double top); void SetZoomMode(int zoomMode); CRect GetClientRect() { return m_client; } bool CreateMemDC(CRect rect, CDC* pDC); CDC* GetMemDC(void) { return m_pMemViewDC.get(); } void SetImgDc(CDC* pDC); CDC* GetImgDC() { return m_pImgDC; } void SetScreenDC(CDC* pScreenDC); CDC* GetScreenDC() { return m_pScreenDC; } bool DrawImg(bool symbolViewFlag); bool CombinImg(int x, int y, int width, int height, int screenX, int screenY); void ShowBKGrid(bool bShow); bool HasEnableBKGrid(); CPoint GetGridPoint(CPoint& pt); void SetDc(CDC* pDC); CDC* GetDc(); void SetBackColor(COLORREF color); COLORREF GetBackColor(); void OffsetViewportOrg(int offsetX, int offsetY); virtual void SetClient(int l, int t, int r, int b); bool OpenFile(LPCTSTR lpszFileName, BOOL bMergeFile); bool OpenXy(CXy* pXy, BOOL bMergeFile); bool ReloadFile(); bool CreateNew(); bool CreateNew(LPCTSTR fileName); void InitialView(); void SetScrollBar(int& hMax, int& vMax, int& hPage, int& vPage, int& hPos, int& vPos); void OnHScroll(UINT nSBCode, UINT nPos, int nScrollMax); void OnVScroll(UINT nSBCode, UINT nPos, int nScrollMax); void Extend(double locationX, double locationY, double width, double height, int mode); void OnViewExtend(); void OnViewEnlarge(); void OnViewEnlargeByMousePoint(int mouseX, int mouseY); void OnViewReduce(); void ReduceForScreenPoint(); void OnViewReduce(double factor); void ViewReduceByMousePoint(int mouseX, int mouseY); void FillScreenToCenter(); void FillScreenByStrech(); void ToCenterAndFixScale(); void SetViewPan(); //移动到point,以point为中心 void PanTo(int mouseX, int mouseY); void SetViewWindow(); void ViewMouseDown(UINT nFlags, CPoint point); void ViewMouseMove(UINT nFlags, CPoint point); void ViewMouseUp(UINT nFlags, CPoint point); void SetItem(int itemType); NItem::CItem* GetItem(void); void SetHWND(HWND hwnd); HWND GetHWND(); void ActionAdd(COne* pOne, UINT nUndoID = IDS_STRING_ACTION_ADD); void SendRedrawMsg(); void SetDrawDC(CDC* cdc); CDC* GetDrawDC(); void GetPageMargin(int* top, int* bottom, int* left, int* right); void SetPageMargin(int top, int bottom, int left, int right); //鼠标移动时 高亮光标之下的图元 并获得图元的提示信息 int HighLightGraphItem(int mouseX, int mouseY, CDC* pScreenDC); void EndHighLightGraphItem(); wchar_t* GetTipInfoString(); //void InitXyDC(); //fbw POSITION GetSelectedOnePosition(int type); POSITION GetPositionFind(COne* pOne); CPositionList* GetSelection(void); //void InitXyDC(); //fbw COne* GetSelectedOne(int type); static CLIPFORMAT m_clipboardDraw; // custom clipboard format static CLIPFORMAT m_cfObjectDescriptor; BOOL OnLButtonUpOther(CDC* pDC, UINT nFlags, CPoint point, int vk = 0); void OnProcessZFlag(); ImageCut* GetImageCut(); void StopThreadOfImageCut(); void StartThreadOfImageCut(CutImageInfo* icInfo); FileTransformer* GetFileTransformer(); void StopThreadOfFileTransformer(); void StartThreadOfFileTransformer(FileTransformationInfo* tfInfo); void EnableMeshPackage(BOOL isEnable, BOOL force = false); void SetFaultLayer(LPCTSTR layer); CString GetFaultLayer(); void SetBorderLayer(LPCTSTR layer); CString GetBorderLayer(); void SetFaultLayer3D(LPCTSTR layer); CString GetFaultLayer3D(); void SetBorderLayer3D(LPCTSTR layer); CString GetBorderLayer3D(); void SetWellLayer3D(LPCTSTR layer); CString GetWellLayer3D(); void SetMainMeshLayer3D(LPCTSTR layer); CString GetMainMeshLayer3D(); void SetMainMeshId3D(int64_t id); int64_t GetMainMeshId3D(); void SetSymbolView(BOOL isSymbolView) { this->m_bSymbolView = isSymbolView; } bool GetPointsZRange(double& zMin, double& zMax); bool SetPointsColor(CString colorItemsData, double dWidth, double dHeight); void SetAntiAlias(bool enable); bool GetAntiAlias(); void SetPrinting(bool isPriting); bool GetIsPriting(); // 是否允许进行变形等操作 void SetEnableRotate(bool enable); CPoint GetLastRightButtonPoint() const; virtual void SetLastRightButtonPoint(const CPoint& point); void RegisterListener(Listener listener); void Notify(const CString& message); ListenerManager<>& GetViewChangedListener(); virtual void OnLButtonDown(int mouseX, int mouseY, HDC hdc, int vk); //ggff2025 virtual void OnLButtonUp(int mouseX, int mouseY, HDC hdc, int vk); virtual int OnLButtonDoubleClick(int mouseX, int mouseY); virtual int OnMouseMove(HDC hMemDC, int mouseX, int mouseY, int buttonStatus); private: void DrawElement(POSITION pos); void DrawCurve(POSITION pos); void FillTipInfo(POSITION pos, CPoint2D pt); //void ResetStatusForCrossLine(); }; template tl::expected TryGetItemCast(CSigmaView* pView) { if (pView == nullptr) { return tl::make_unexpected("pView 为 nullptr"); } CItem* pItem = pView->GetItem(); if (pItem == nullptr) { return tl::make_unexpected("pItem 为 nullptr"); } T* pTarget = dynamic_cast(pItem); if (pTarget == nullptr) { return tl::make_unexpected("pItem 转换失败"); } return pTarget; } //};