SDC C-Project CF Review 프로그램
ReviewHistory/include/akGraph/akGraphBase.h
»õ ÆÄÀÏ
@@ -0,0 +1,312 @@
#pragma once
#include "akGraph/akGraphLinker.h"
#include "akGraph/akMemDC.h"
#include "akGraph/akGraphStruct.h"
#include "akGraph/akSyncObject.h"
#include "akSTL/akStruct.h"
// akGraphBase
#define AKGRAPH_BUTTONDOWN WM_USER+0x1001
#define AKGRAPH_MOUSEMOVE WM_USER+0x1002
#include <process.h>
class AFX_EXT_CLASS CakGraphThreadDraw;
class AFX_EXT_CLASS  CakGraphBase :  public CWnd, public CakSyncObject
{
   DECLARE_DYNAMIC(CakGraphBase)
public:
   CakGraphBase();
   virtual ~CakGraphBase();
protected:
   DECLARE_MESSAGE_MAP()
   CakMouseState m_MouseState;
public:
   virtual BOOL CreateGraph(CWnd* pParent, CRect rect);
   virtual void RenderBegin(CDC* pDC, CRect rectDC);
   virtual void RenderGrid(Graphics* grfx, CDC* pDC){};
   virtual void RenderDataArea(Graphics* grfx, CDC* pDC); //데이터 ì˜ì—­ ê·¸ë¦¬ê¸°
   virtual void RenderSeries(Graphics* grfx, CDC* pDC){}; //데이터 ì„ /바 ê·¸ë¦¬ê¸°
   virtual void RenderLegend(Graphics* grfx, CDC* pDC){}; //범례
   virtual void RenderAxis(Graphics* grfx, CDC* pDC); //축 ì˜ì—­ ê·¸ë¦¬ê¸°
   virtual void RenderTitle(Graphics* grfx, CDC* pDC); //제목 ì˜ì—­ ê·¸ë¦¬ê¸°
   virtual void RenderLabel(Graphics* grfx, CDC* pDC){}; //해당 ì¶•에 í‹±ê·¸ë¦¬ê¸°, ë°ì´í„° ì˜ì—­ ì™¸ê°ì„  ê·¸ë¦¬ê¸°
   virtual void RenderEnd(Graphics* grfx, CDC* pDC); //그리는 ë¶€ë¶„ ë§ˆì§€ë§‰ì— ì¶”ê°€(Redraw false í• ë•Œë„ ê·¸ë¦¼)
   virtual void RenderClossLine(CDC* pDC); //마우스 í¬ë¡œìФ ë¼ì¸ ê·¸ë¦¬ê¸° [김태현 2018/9/7]
   virtual void RenderMouseHoverInfo(CDC* pDC){}; //마우스 ì˜¬ë ¤ì ¸ ìžˆì„ ê²½ìš° ë°ì´í„°í‘œì‹œ ê·¸ë¦¬ê¸° [김태현 2018/9/7]
   virtual void RenderPerformance(Graphics* grfx, CDC* pDC);
   virtual void GetRenderFrame(CDC* pDC, CRect rect);
   virtual void ReDraw(bool bReDrawALL = true);
   virtual void SetAutoScale(){}; //이런건 ê¸°ë³¸ì ìœ¼ë¡œ ìžˆì–´ì•¼ë¨!!
   virtual void SetTitle(char* titlename);
   virtual char* GetTitle();
   virtual void SetAxisXTitle(char* titlename){m_AxisX.m_strTitle = titlename;};
   virtual void SetAxisYTitle(char* titlename){m_AxisY.m_strTitle = titlename;};
   virtual void OnKeyInput(int key, int mode); //mode 0==keyup, mode 1==keydown //키보드 ìž…ë ¥ ì´ë²¤íЏ ì²˜ë¦¬
   virtual void OnMouseInput(akMouseEvent mouseevent, CPoint point); //마우스 ìž…ë ¥ ì´ë²¤íŠ¸ì²˜ë¦¬
   virtual void MouseInput(CakMouseState mousestate){}; //마우스 ìƒíƒœì²˜ë¦¬
   virtual void OnSystemKeyInput(int key, int mode); //mode 0==keyup, mode 1==keydown //키보드 ìž…ë ¥ ì´ë²¤íЏ ì²˜ë¦¬
   virtual void EnableThreadDrawMode(int nSleepTime = 30, int nSleepTimeMin = 1);//한번 í‚¤ë©´ ë
   void SetDragStyle(akDragStyle style){m_DragStyle = style;} ; //0은 ë„기, 1은 ì–‘쪽모두, 2은 ì„¸ë¡œì„ ë§Œ, 3는 ê°€ë¡œì„ ë§Œ
   akDragStyle GetDragStyle(){return m_DragStyle;};
   CPoint GetMousePos(){return m_MouseState.Point;};
   void SetWindowSize(int x, int y, int width, int height, UINT flag = NULL, bool reDraw = true);
   void SetWindowSize(int width, int height, UINT flag = NULL, bool reDraw = true);
   void GetWindowSize(int* width, int* height);
   inline CakRect GetDataArea(){return m_rectData;};
   inline CakRect GetTitleArea(){return m_rectTitle;};
   inline CakRect GetAxisXArea(){return m_rectAxisX;};
   inline CakRect GetAxisYArea(){return m_rectAxisY;};
   void SetTitleSize(int height);//타이틀바 ì„¸ë¡œì¶• í¬ê¸°
   void SetAxisXSize(int height);//x축 ì„¸ë¡œ í¬ê¸°
   void SetAxisYSize(int width);//y축 ê°€ë¡œ í¬ê¸°
   void SetSaveImage(char* strFilepathname);
   void SetClossLine(bool flag = true){m_bClossLine = flag;};
   //마우스 ì œì–´ ëª¨ë“œ(0:우클릭 ì´ë™ëª¨ë“œ, 1:좌클릭 ì´ë™ëª¨ë“œ) [김태현 2018/8/22]
   void SetMouseControlMode(int nType){m_nMouseControlMode = nType;};
   inline void SetID(int nID);
   inline int GetID();
   virtual void FuncThreadDraw();
protected:
   virtual void CaculatorGraphSize();
   virtual void getLbuttonDragPoint(int* px1, int* py1, int* px2, int* py2);
private:
public:
   int m_nID;//메세지 ë³´ë‚¼ë•Œ ê°™ì´ ë³´ë‚´ì£¼ë©´ì„œ.. ì¸ìŠ¤í„´ìŠ¤ë¥¼ êµ¬ë¶„한다.
   CAxis m_AxisX;
   CAxis m_AxisY;
   CAxis m_AxisY2;//오른쪽 y공간
   CTitle m_Title;
   CMouseMoveInfo m_MouseMoveInfo;//마우스 ì›€ì§ìž„에 ë”°ë¼ í™”면에 í‘œì‹œë˜ëŠ” ë‚´ìš©
   CakRectd m_AutoScaleMarginRate;//자동스케일 ì–‘옆 ì•„래,위 ì—¬ë°± ë¹„율 ì„¤ì •
   CakRect m_rectLabelAdjust;
   bool m_bCheckDC; //올바른 DC인가 í™•인 ì ˆì°¨ë¥¼ ìƒëžµí•  ê²ƒì¸ì§€ ì—¬ë¶€
   bool m_bClossLine;
   int    m_nMouseControlMode;
   CakGraphThreadDraw* m_pThreadDraw;
protected:
   CWnd* m_pParent; //부모 ìœˆë„ìš° í´ëž˜ìФ
   //메모리 ë””씨~
   CDC m_GraphDC;
   CBitmap m_GraphBitmap, *m_pGraphOldBitmap;
   CRect m_rectGraphBitmap;
   //그래프 ë‹¤ì‹œ ê·¸ë ¤ì•¼ í• ë•Œ
   bool m_bReRender;
   //그리는 ë¶€ë¶„ ì˜ì—­ í¬ê¸°
   int m_nWindowSizeWidth, m_nWindowSizeHeight;
   //그리는 ì˜ì—­ ê°ê°ì˜ í¬ê¸°(매번 CaculatorGraphSize() í•¨ìˆ˜ì— ì˜í•´ ê³„산이 ëœë‹¤)
   CakRect m_rectData; //순수하게 ê·¸ëž˜í”„ ê·¸ë¦¬ëŠ” ë¶€ë¶„ ì˜ì—­
   CakRect m_rectChartMargin; //데이터 ê·¸ë¦¬ëŠ” ë¶€ë¶„ ì˜¤ë¥¸ìª½ ì—¬ë°±
   CakRect m_rectAxisX;
   CakRect m_rectAxisY;
   CakRect m_rectTitle;
   CFont m_fontData; //데이터 í°íЏ
   bool m_bRenderState;
   bool m_bHover;
public:
   COLORREF m_colorBack; //배경색
   COLORREF m_colorDataArea; //데이터 ê·¸ë¦¬ëŠ”ë¶€ë¶„ ë°°ê²½ìƒ‰
protected:
   akDragStyle m_DragStyle;
private:
   CFont m_fontWaterMake;
   ULONG_PTR m_gdiplusToken; //GDI+ í† í°
   CString m_strSaveFilePath;
   //성능 ì²´í¬ ê´€ë ¨
private:
   int m_nShowPerformance;
   int m_nTimeRenderTotal;
   int m_nTimeRenderDraw1stBuffer;
   int m_nTimeRenderDraw2ndBuffer;
   int m_nTimeTempTotal;
   int m_nTimeTempDraw1stBuffer;
   int m_nTimeTempDraw2ndBuffer;
   int m_nTimeRenderCount;
   int m_nTimerRenderTotalMax;
   int m_nTimerRenderTotalMin;
public:
   static bool m_bAK;
   static void setAK(){CakGraphBase::m_bAK = false;};
   afx_msg void OnPaint();
   afx_msg void OnSize(UINT nType, int cx, int cy);
   virtual BOOL PreTranslateMessage(MSG* pMsg);
   afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
   afx_msg BOOL OnEraseBkgnd(CDC* pDC);
   //int m_DataState;
   //afx_msg void OnTimer(UINT nIDEvent);
   afx_msg void OnTimer(UINT_PTR nIDEvent);
};
class AFX_EXT_CLASS CakGraphThreadDraw
{
public:
   CakGraphThreadDraw()
   {
      m_bThreadDrawMode = FALSE;
      m_bDrawByThread = FALSE;
      m_nThreadDrawFlag = 0;
      m_nThreadDrawSleepTimeMin = 1;
      m_nThreadDrawSleepTime = 30;
      InitializeCriticalSection(&m_csThreadDraw);
   };
   virtual ~CakGraphThreadDraw()
   {
      if(GetThreadDrawMode())
      {
         m_nThreadDrawFlag = 2;
         int nReTryCount = 10;
         while (m_nThreadDrawFlag != 0 && nReTryCount--)
         {
            Sleep(1);
         }
      }
   };
public:
   virtual BOOL CreateThreadDraw(CakGraphBase* pBase)
   {
      if(pBase == NULL) return FALSE;
      //if(GetThreadDrawMode())
      {
         m_nThreadDrawFlag = 1;
         //_beginthread(threadThreadDraw, NULL, this);
         AfxBeginThread(threadThreadDraw, this, NULL);
         m_pGraphBase = pBase;
         m_bDrawByThread = TRUE;
      }
      return TRUE;
   }
   void SetDrawByThread(BOOL bFlag){m_bDrawByThread = bFlag;};
   void SetThreadDrawMode(BOOL bFlag){m_bThreadDrawMode = bFlag;};
   BOOL GetThreadDrawMode(){return m_bThreadDrawMode;};
   CRITICAL_SECTION* GetCriticalSection(){return &m_csThreadDraw;};
   void SleepMsg(IN DWORD dwMilliseconds)
   {
      DWORD dwStart   = 0;
      MSG   msg       = {0,};
      dwStart  = GetTickCount();
      while (GetTickCount() - dwStart < dwMilliseconds)
      {
         while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
         {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
         }
         // Lower CPU Usage
         ::Sleep(1);
      }
   }
public:
   int m_nThreadDrawSleepTime;
   int m_nThreadDrawSleepTimeMin;
protected:
   BOOL m_bThreadDrawMode;
   //CDC m_ThreadDrawDC;
   //CBitmap m_ThreadDrawBitmap;
   //CRect m_rectThreadDrawBitmap;
   int m_nThreadDrawFlag;
   BOOL m_bDrawByThread;
   CRITICAL_SECTION m_csThreadDraw;
   CakGraphBase* m_pGraphBase;
protected:
   //static void threadThreadDraw(void* arg)
   static UINT threadThreadDraw(LPVOID arg)
   {
      CakGraphThreadDraw* pThis = (CakGraphThreadDraw*)arg;
      while (pThis->m_nThreadDrawFlag == 1)
      {
         DWORD   dwTimeStart = GetTickCount();
         if(pThis->m_bDrawByThread)
         {
            pThis->m_bDrawByThread = FALSE;
            pThis->funcThreadDraw();
         }
         else
         {
         }
         int nSleepTimeDynamic = pThis->m_nThreadDrawSleepTime-(GetTickCount()-dwTimeStart);
         nSleepTimeDynamic = max(nSleepTimeDynamic, pThis->m_nThreadDrawSleepTimeMin);
         nSleepTimeDynamic = pThis->m_nThreadDrawSleepTime;
         Sleep(nSleepTimeDynamic);
         //pThis->SleepMsg(nSleepTimeDynamic);
      }
      pThis->m_nThreadDrawFlag = 0;
      return TRUE;
   };
   virtual void funcThreadDraw()
   {
      m_pGraphBase->FuncThreadDraw();
   };
};