SHEETSWND.CPP
上传用户:lvjun8202
上传日期:2013-04-30
资源大小:797k
文件大小:23k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 7/19/98 11:29:37 AM
  5.   Comments: SheetsWnd.cpp : implementation file
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "SheetsWnd.h"
  9. #include "memDC.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #define DEFAULTFORMATDRAWTEXT DT_CENTER | DT_VCENTER | DT_SINGLELINE
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CSheetsWnd
  18. #define unknown _T("Sheet")
  19. #define LRB 6
  20. #define FONTNAME _T("Arial")
  21. // Function name : CSheetsWnd::CSheetsWnd
  22. // Description     : Default constructor of this object
  23. // Return type : 
  24. CSheetsWnd::CSheetsWnd()
  25. {
  26. m_wndProcParent = NULL;
  27. m_DrawRect.SetRectEmpty();
  28. m_rectMoveBar.SetRectEmpty();
  29. m_nHorzScroll = 0;
  30. m_nMaxHorzScroll = 0;
  31. m_pRollPoint = NULL;
  32. m_nDisplacement = 0;
  33. }
  34. // Function name : CSheetsWnd::~CSheetsWnd
  35. // Description     : Destructor
  36. // Return type : 
  37. CSheetsWnd::~CSheetsWnd()
  38. {
  39. }
  40. BEGIN_MESSAGE_MAP(CSheetsWnd, CWnd)
  41. //{{AFX_MSG_MAP(CSheetsWnd)
  42. ON_WM_CREATE()
  43. ON_WM_ERASEBKGND()
  44. ON_WM_HSCROLL()
  45. ON_WM_LBUTTONDOWN()
  46. ON_WM_KEYDOWN()
  47. ON_WM_LBUTTONUP()
  48. ON_WM_MOUSEMOVE()
  49. ON_WM_SETCURSOR()
  50. //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CSheetsWnd message handlers
  54. // Function name : WindowProcParent
  55. // Description     : 
  56. // Return type : LRESULT CALLBACK 
  57. // Argument         :  HWND hwnd
  58. // Argument         : UINT uMsg
  59. // Argument         : WPARAM wParam
  60. // Argument         : LPARAM lParam
  61. LRESULT CALLBACK WindowProcParent( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  62. {
  63. switch (uMsg)
  64. {
  65. case WM_DESTROY:
  66. {
  67. CSheetsWnd::RestoreWndProc(hwnd);
  68. break;
  69. }
  70. case WM_WINDOWPOSCHANGED:
  71. case WM_SIZE:
  72. {
  73. CSheetsWnd::ResizeStatical(hwnd);
  74. return NULL;
  75. }
  76. case WM_PARENTNOTIFY:
  77. {
  78. if (LOWORD(wParam) == WM_CREATE)
  79. CSheetsWnd::GetWndSheet(hwnd)->Invalidate();
  80. break;
  81. }
  82. }
  83. return CallWindowProc(CSheetsWnd::GetWndSheet(hwnd)->GetWindowProc(), hwnd, uMsg, wParam, lParam );
  84. }
  85. // Function name : CSheetsWnd::GetRect
  86. // Description     : Return the wished rect of this object
  87. // Return type : CRect 
  88. // Argument         : CWnd* pWndParent
  89. CRect CSheetsWnd::GetRect(CWnd* pWndParent)
  90. {
  91. CRect rect; pWndParent->GetClientRect(rect);
  92. rect.top = rect.bottom - GetSystemMetrics(SM_CYVTHUMB);
  93. return rect;
  94. }
  95. // Function name : CSheetsWnd::GetRect
  96. // Description     : Return the wished rect of this object
  97. // Return type : CRect 
  98. // Argument         : HWND hWndParent
  99. CRect CSheetsWnd::GetRect(HWND hWndParent)
  100. {
  101. return GetRect(CWnd::FromHandle(hWndParent));
  102. }
  103. // Function name : CSheetsWnd::Attach
  104. // Description     : Create object as child of pWndParent with rgbBackground
  105. // Return type : BOOL 
  106. // Argument         : CWnd * pWndParent
  107. // Argument         : COLORREF rgbBackground
  108. BOOL CSheetsWnd::Attach(CWnd * pWndParent, COLORREF rgbBackground)
  109. {
  110. ASSERT (pWndParent && IsWindow(pWndParent->m_hWnd));
  111. CRect rect = GetRect(pWndParent);
  112. m_brBackground.CreateSolidBrush(rgbBackground);
  113. ASSERT(pWndParent->GetDlgItem(IDTHIS) == NULL);
  114. pWndParent->ModifyStyle(0, WS_CLIPCHILDREN);
  115. BOOL bResult = Create(AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW),(HBRUSH)m_brBackground,0), _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, rect, pWndParent, IDTHIS);
  116. if (bResult)
  117. // Subclass window procedure of parent object for receive some message. See WindowProcParent for detail
  118. m_wndProcParent = (WNDPROC)SetWindowLong(pWndParent->m_hWnd, GWL_WNDPROC, (long)WindowProcParent);
  119. return bResult;
  120. }
  121. // Function name : CSheetsWnd::GetWndSheet
  122. // Description     : Return pointer to sheet window
  123. // Return type : CSheetsWnd* 
  124. // Argument         : HWND hWndParent
  125. CSheetsWnd* CSheetsWnd::GetWndSheet(HWND hWndParent)
  126. {
  127. return (CSheetsWnd*)CWnd::FromHandle(::GetDlgItem(hWndParent, IDTHIS));
  128. }
  129. // Function name : CSheetsWnd::RestoreWndProc
  130. // Description     : When parent of this object become to be destroyed then restore window procedure
  131. // Return type : void 
  132. // Argument         : HWND hWndParent
  133. void CSheetsWnd::RestoreWndProc(HWND hWndParent)
  134. {
  135. if (IsWindow(hWndParent))
  136. {
  137. long curent = (long)((CSheetsWnd*)CWnd::FromHandle(::GetDlgItem(hWndParent, IDTHIS)))->m_wndProcParent;
  138. if (GetWindowLong(hWndParent, GWL_WNDPROC) != curent)
  139. SetWindowLong(hWndParent, GWL_WNDPROC, curent);
  140. }
  141. }
  142. // Function name : CSheetsWnd::Resize
  143. // Description     : 
  144. // Return type : void 
  145. // Argument         : HWND hWndParent
  146. void CSheetsWnd::Resize(HWND hWndParent)
  147. {
  148. CRect rect = GetRect(hWndParent);
  149. MoveWindow(rect);
  150. rect.bottom = rect.top;
  151. rect.top = 0;
  152. CWnd* pChild = GetFirstView();
  153. while (pChild)
  154. {
  155. pChild->MoveWindow(rect);
  156. pChild = GetNextView();
  157. }
  158. GetClientRect(rect);
  159. m_DrawRect.right = rect.right;
  160. }
  161. // Function name : CSheetsWnd::ResizeStatical
  162. // Description     : All childs of parent, without this must be resized
  163. // Return type : void 
  164. // Argument         : HWND hWndParent
  165. void CSheetsWnd::ResizeStatical(HWND hWndParent)
  166. {
  167. if (CSheetsWnd* pThis = GetWndSheet(hWndParent))
  168. pThis->Resize(hWndParent);
  169. }
  170. // Function name : CSheetsWnd::GetFirstView
  171. // Description     : Get first view from object parent
  172. // Return type : CWnd* 
  173. CWnd* CSheetsWnd::GetFirstView()
  174. {
  175. m_pViewFind = GetParent()->GetWindow(GW_CHILD);
  176. while (m_pViewFind && m_pViewFind->m_hWnd == m_hWnd)
  177. m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
  178. return m_pViewFind;
  179. }
  180. // Function name : CSheetsWnd::GetNextView
  181. // Description     : Get next view from object parent
  182. // Return type : CWnd* 
  183. CWnd* CSheetsWnd::GetNextView()
  184. {
  185. if (m_pViewFind)
  186. {
  187. m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
  188. while (m_pViewFind && m_pViewFind->m_hWnd == m_hWnd)
  189. m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
  190. return m_pViewFind;
  191. }
  192. return NULL;
  193. }
  194. // Function name : CSheetsWnd::GetViewTitle
  195. // Description     : Return the default window title
  196. // Return type : CString 
  197. // Argument         : CWnd * pView
  198. CString CSheetsWnd::GetViewTitle(CWnd * pView)
  199. {
  200. CString result; pView->GetWindowText(result);
  201. if (result.IsEmpty())
  202. result = unknown;
  203. return result;
  204. }
  205. // Function name : CSheetsWnd::GetActiveView
  206. // Description     : Return the first active view
  207. // Return type : CWnd* 
  208. CWnd* CSheetsWnd::GetActiveView()
  209. {
  210. CWnd* pWnd = GetFirstView();
  211. while (pWnd)
  212. if (pWnd->IsWindowVisible())
  213. return pWnd;
  214. else
  215. pWnd = GetNextView();
  216. return pWnd;
  217. }
  218. // Function name : CSheetsWnd::SetActiveView
  219. // Description     : Sets the active view. Call EnsureVisible if you want to be enure that page is visible
  220. // Return type : void 
  221. // Argument         : CWnd* pView
  222. void CSheetsWnd::SetActiveView(CWnd* pView)
  223. {
  224. CWnd* pOldActiveView = GetActiveView(), *pParent = GetParent();
  225. if (pView)
  226. if (pView != pOldActiveView)
  227. {
  228. pParent->SendMessage(GetMessagePageChanging(), (WPARAM)pOldActiveView, (LPARAM)pView);
  229. if (!pOldActiveView || (pOldActiveView && pOldActiveView->m_hWnd != pView->m_hWnd))
  230. {
  231. pView->SetWindowPos(0,0,0,0,0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW );
  232. if (pOldActiveView)
  233. pOldActiveView->SetWindowPos(0,0,0,0,0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW | SWP_NOREDRAW);
  234. Invalidate();
  235. pParent->SendMessage(GetMessagePageChanged(), (WPARAM)pView, 0);
  236. }
  237. }
  238. }
  239. // Function name : CSheetsWnd::OnCreate
  240. // Description     : Create a new things.
  241. // Return type : int 
  242. // Argument         : LPCREATESTRUCT lpCreateStruct
  243. int CSheetsWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  244. {
  245. if (CWnd::OnCreate(lpCreateStruct) == -1)
  246. return -1;
  247. CRect rect; GetClientRect(rect);
  248. m_font.CreateFont(-rect.Height() * 8 / 10, 0, 0, 0, FW_LIGHT, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, FONTNAME);
  249. CSize sxy(2 * rect.Height(), rect.Height());
  250. m_btns.Create(WS_CHILD | WS_VISIBLE | SBS_HORZ, CRect(CPoint(rect.left, rect.top), sxy), this, IDBTNS);
  251. rect.left += sxy.cx + 2;
  252. m_DrawRect = rect;
  253. return 0;
  254. }
  255. // Function name : CSheetsWnd::OnEraseBkgnd
  256. // Description     : 
  257. // Return type : BOOL 
  258. // Argument         : CDC* pDC
  259. BOOL CSheetsWnd::OnEraseBkgnd(CDC* pDC) 
  260. {
  261. Draw(pDC);
  262. pDC->ExcludeClipRect(EraseExclude());
  263. CBrush* pOldBrush = pDC->SelectObject(&m_brBackground);
  264. CRect rect;
  265. pDC->GetClipBox(&rect);     // Erase the area needed
  266. pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
  267. pDC->SelectObject(pOldBrush);
  268. return TRUE;
  269. }
  270. // Function name : CSheetsWnd::GetPageRect
  271. // Description     : Return client coordonate of rect ocupied by page of pView
  272. // Return type : CRect 
  273. // Argument         : CWnd * pView
  274. CRect CSheetsWnd::GetPageRect(CWnd * pView)
  275. {
  276. CRect rRect(0,m_DrawRect.top,0,m_DrawRect.bottom);
  277. if (pView)
  278. {
  279. CDC* pDC = GetDC();
  280. CFont* pOldFont = pDC->SelectObject(&m_font);
  281. CWnd* pChild = GetFirstView();
  282. int nCont = pChild != NULL ? 2 : 0;
  283. int cxB = LRB, cx = cxB + m_nHorzScroll + m_DrawRect.left;
  284. while (nCont)
  285. {
  286. nCont = nCont + (pChild == pView ? -1 : (nCont == 1 ? -1 : 0));
  287. if (nCont)
  288. {
  289. if (nCont == 1) rRect.left = cx - LRB - 4;
  290. CRect rt(cx,0,0,0);
  291. pDC->DrawText(GetViewTitle(pChild), rt, DEFAULTFORMATDRAWTEXT | DT_CALCRECT);
  292. rt.top = 0; rt.bottom = m_DrawRect.Height();
  293. rt.left -= 4; rt.right += 4;
  294. int next = rt.Width() + LRB ;
  295. cx += next;
  296. if (nCont == 1) rRect.right = cx - LRB + 4;
  297. pChild = GetNextView();
  298. }
  299. }
  300. pDC->SelectObject(pOldFont);
  301. ReleaseDC(pDC);
  302. }
  303. return rRect;
  304. }
  305. // Function name : CSheetsWnd::DrawMoveBar
  306. // Description     : Override this function and return empty rect if
  307. // you do not wish to move this object
  308. // Return type : CRect 
  309. // Argument         : CDC * pDC
  310. // Argument         : int x
  311. CRect CSheetsWnd::DrawMoveBar(CDC * pDC, int x)
  312. {
  313. // x reprezent last pixel drawen in object
  314. int y = 1, r = m_DrawRect.right, l = min(x, r); r = l + m_DrawRect.Height();
  315. static CPen pWhite(PS_SOLID,1,RGB(255,255,255));
  316. static CPen  pGray(PS_SOLID,1,RGB(128,128,128));
  317. pDC->SelectObject(&pWhite);
  318. pDC->MoveTo(l,y + 2); pDC->LineTo(l,y);pDC->LineTo(r,y);
  319. pDC->SelectObject(&pGray);
  320. pDC->LineTo(r,y + 2);pDC->LineTo(l,y + 2);
  321. // Attention that x is relative position on DC. Already in DC is 
  322. // selected a view origin to m_DrawRect.left, and then you must 
  323. // offset the result rect with m_DrawRect.left
  324. CRect rResult(l,y,r,y + 2); rResult.OffsetRect(m_DrawRect.left,0);
  325. return rResult;
  326. }
  327. // Function name : CSheetsWnd::Draw
  328. // Description     : Draw the pages of object
  329. // Return type : void 
  330. // Argument         : CDC * pDC
  331. void CSheetsWnd::Draw(CDC * pDC)
  332. {
  333. if (!m_DrawRect.IsRectNull())
  334. {
  335. CDC dc; CBitmap bitmap;
  336. if (dc.CreateCompatibleDC(pDC))
  337. if (bitmap.CreateCompatibleBitmap(pDC, m_DrawRect.Width(), m_DrawRect.Height()))
  338. {
  339. CBitmap* pOldBitmap = dc.SelectObject(&bitmap);
  340. CBrush* pOldBrush = dc.SelectObject(&m_brBackground);
  341. dc.PatBlt(0,0, m_DrawRect.Width(), m_DrawRect.Height(), PATCOPY);
  342. CFont* pOldFont = dc.SelectObject(&m_font);
  343. dc.SetBkMode(TRANSPARENT);
  344. CWnd *pActiveView = GetActiveView(), *pView = GetFirstView();;
  345. CRgn rgnActive;
  346. static const int mP = 4;
  347. CRect rtActive; CPoint pActivePage[mP];
  348. int cxB = LRB, cx = m_nHorzScroll + cxB, next = NULL;
  349. CBrush * pBrBk;
  350. m_nMaxHorzScroll = 0;
  351. while (pView)
  352. {
  353. CString title = GetViewTitle(pView);
  354. CRect rt(cx,0,0,0);
  355. dc.DrawText(title, rt, DEFAULTFORMATDRAWTEXT | DT_CALCRECT);
  356. rt.top = 1; rt.bottom = m_DrawRect.Height();
  357. rt.left -= 4; rt.right += 4;
  358. CPoint pPage[mP];
  359.  pPage[0] = CPoint(rt.left  - cxB, 0);
  360.  pPage[1] = CPoint(rt.left, rt.bottom);
  361.  pPage[2] = CPoint(rt.BottomRight());
  362.  pPage[3] = CPoint(rt.right + cxB, 0);
  363. CRgn rgn; rgn.CreatePolygonRgn(pPage, 4, WINDING);
  364. pBrBk = GetPageBkBrush(pView);
  365. dc.FillRgn(&rgn, pBrBk);//&m_brBackground);
  366. // dc.FillRgn(&rgn, &m_brBackground);
  367. dc.FrameRgn(&rgn, &CBrush(RGB(0,0,0)), 1, 1);
  368. dc.DrawText(title, rt, DEFAULTFORMATDRAWTEXT);
  369. if ((pActiveView) && (pView == pActiveView))
  370. {
  371. rgnActive.CreatePolygonRgn(pPage, 4, ALTERNATE);
  372. rtActive = rt;
  373. for (int i = 0; i < mP ; i++)
  374. pActivePage[i] = pPage[i];
  375. }
  376. pView = GetNextView();
  377. next = rt.Width() + LRB;
  378. cx += next;
  379. m_nMaxHorzScroll += next;
  380. }
  381. m_rectMoveBar = DrawMoveBar(&dc, cx);
  382. if (pActiveView)
  383. {
  384. dc.FillRgn(&rgnActive, &CBrush(RGB(255,255,255)));
  385. dc.FrameRgn(&rgnActive, &CBrush(RGB(0,0,0)), 1, 1);
  386. dc.DrawText(GetViewTitle(pActiveView), rtActive, DEFAULTFORMATDRAWTEXT);
  387. int pROP2 = dc.SetROP2(R2_WHITE);
  388. dc.MoveTo(pActivePage[0]); dc.LineTo(pActivePage[3]);
  389. dc.SetROP2(R2_COPYPEN);
  390. // static CPen pen(PS_DOT,1,RGB(192,192,192));
  391. // dc.SelectObject(&pen);
  392. // dc.MoveTo(pActivePage[0]); dc.LineTo(pActivePage[3]);
  393. }
  394. pDC->BitBlt(m_DrawRect.left, m_DrawRect.top, m_DrawRect.Width(), m_DrawRect.Height(), &dc, 0,0, SRCCOPY);
  395. dc.SelectObject(pOldFont);
  396. dc.SelectObject(pOldBrush);
  397. dc.SelectObject(pOldBitmap);
  398. }
  399. }
  400. }
  401. /*
  402. void CSheetsWnd::Draw(CDC * pDC)
  403. {
  404. if (!m_DrawRect.IsRectNull())
  405. {
  406. CLLXMemDC * pDCEx = new CLLXMemDC(pDC,m_DrawRect);
  407. // CDC &dc = *pDCEx; 
  408. // CBitmap  *pBitmap = new CBitmap();
  409. // if (dc.CreateCompatibleDC(pDC))
  410. {
  411. // if (0)//pBitmap->CreateCompatibleBitmap(pDC, m_DrawRect.Width(), m_DrawRect.Height()))
  412. {
  413. // CBitmap* pOldBitmap = pDCEx->SelectObject(pBitmap);
  414. CBrush* pOldBrush = pDCEx->SelectObject(&m_brBackground);
  415. pDCEx->PatBlt(0,0, m_DrawRect.Width(), m_DrawRect.Height(), PATCOPY);
  416. CFont* pOldFont = pDCEx->SelectObject(&m_font);
  417. pDCEx->SetBkMode(TRANSPARENT);
  418. CWnd *pActiveView = GetActiveView(), *pView = GetFirstView();;
  419. CRgn rgnActive;
  420. static const int mP = 4;
  421. CRect rtActive; CPoint pActivePage[mP];
  422. int cxB = LRB, cx = m_nHorzScroll + cxB, next = NULL;
  423. CBrush * pBrBk;
  424. m_nMaxHorzScroll = 0;
  425. while (pView)
  426. {
  427. CString title = GetViewTitle(pView);
  428. CRect rt(cx,0,0,0);
  429. pDCEx->DrawText(title, rt, DEFAULTFORMATDRAWTEXT | DT_CALCRECT);
  430. rt.top = 0; rt.bottom = m_DrawRect.Height();
  431. rt.left -= 4; rt.right += 4;
  432. CPoint pPage[mP];
  433.  pPage[0] = CPoint(rt.left  - cxB, 0);
  434.  pPage[1] = CPoint(rt.left, rt.bottom);
  435.  pPage[2] = CPoint(rt.BottomRight());
  436.  pPage[3] = CPoint(rt.right + cxB, 0);
  437. CRgn rgn; rgn.CreatePolygonRgn(pPage, 4, WINDING);
  438. pBrBk = GetPageBkBrush(pView);
  439. pDCEx->FillRgn(&rgn, pBrBk);//&m_brBackground);
  440. pDCEx->FrameRgn(&rgn, &CBrush(RGB(0,0,0)), 1, 1);
  441. pDCEx->DrawText(title, rt, DEFAULTFORMATDRAWTEXT);
  442. if ((pActiveView) && (pView == pActiveView))
  443. {
  444. rgnActive.CreatePolygonRgn(pPage, 4, ALTERNATE);
  445. rtActive = rt;
  446. for (int i = 0; i < mP ; i++)
  447. pActivePage[i] = pPage[i];
  448. }
  449. pView = GetNextView();
  450. next = rt.Width() + LRB;
  451. cx += next;
  452. m_nMaxHorzScroll += next;
  453. rgn.DeleteObject();
  454. }
  455. m_rectMoveBar = DrawMoveBar(pDCEx, cx);
  456. if (pActiveView)
  457. {
  458. pDCEx->FillRgn(&rgnActive, &CBrush(RGB(255,255,255)));
  459. pDCEx->FrameRgn(&rgnActive, &CBrush(RGB(0,0,0)), 1, 1);
  460. pDCEx->DrawText(GetViewTitle(pActiveView), rtActive, DEFAULTFORMATDRAWTEXT);
  461. int pROP2 = pDCEx->SetROP2(R2_WHITE);
  462. pDCEx->MoveTo(pActivePage[0]); pDCEx->LineTo(pActivePage[3]);
  463. pDCEx->SetROP2(R2_COPYPEN);
  464. static CPen pen(PS_DOT,1,RGB(192,192,192));
  465. pDCEx->SelectObject(&pen);
  466. pDCEx->MoveTo(pActivePage[0]); pDCEx->LineTo(pActivePage[3]);
  467. rgnActive.DeleteObject ();
  468. }
  469. // pDC->BitBlt(m_DrawRect.left, m_DrawRect.top, m_DrawRect.Width(), m_DrawRect.Height(), &dc, 0,0, SRCCOPY);
  470. pDCEx->SelectObject(pOldFont);
  471. pDCEx->SelectObject(pOldBrush);
  472. // pDCEx->SelectObject(pOldBitmap);
  473. }
  474. // delete pBitmap;
  475. delete pDCEx;
  476. }
  477. }
  478. }
  479. */
  480. // Function name : CSheetsWnd::OnHScroll
  481. // Description     : Left right buttons
  482. // Return type : void 
  483. // Argument         : UINT nSBCode
  484. // Argument         : UINT nPos
  485. // Argument         : CScrollBar* pScrollBar
  486. void CSheetsWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  487. {
  488. if (pScrollBar->m_hWnd == m_btns.m_hWnd)
  489. {
  490. int nCX = 0;
  491. switch (nSBCode)
  492. {
  493. case SB_LINELEFT:
  494. case SB_LINERIGHT:
  495. {
  496. nCX = (nSBCode == SB_LINELEFT ? 1 : - 1) * 16;
  497. break;
  498. }
  499. }
  500. int n = m_nHorzScroll + nCX;
  501. if ( n <= 0)
  502. if (abs(n) < m_nMaxHorzScroll)
  503. {
  504. m_nHorzScroll = n;
  505. //meInvalidate();
  506. }
  507. }
  508. CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
  509. }
  510. // Function name : CSheetsWnd::Move
  511. // Description     : 
  512. // Return type : void 
  513. // Argument         : CPoint point
  514. void CSheetsWnd::Move(CPoint point)
  515. {
  516. if (m_pRollPoint)
  517. if (int dy = point.y - m_pRollPoint->y)
  518. {
  519. CRect rect; 
  520. GetWindowRect(rect);
  521. rect.OffsetRect(0, dy);
  522. GetParent()->ScreenToClient(rect);
  523. MoveWindow(rect);
  524. //m_nDisplacement = nDeplacement;
  525. }
  526. //}
  527. }
  528. // Function name : CSheetsWnd::OnLButtonDown
  529. // Description     : 
  530. // Return type : void 
  531. // Argument         : UINT nFlags
  532. // Argument         : CPoint point
  533. void CSheetsWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  534. {
  535. SetFocus();
  536. if (m_DrawRect.PtInRect(point))
  537. SetActiveView(GetViewFromPoint(point));
  538. if (m_rectMoveBar.PtInRect(point))
  539. if (!GetCapture())
  540. {
  541. SetCapture();
  542. if (m_pRollPoint)
  543. {
  544. delete m_pRollPoint;
  545. m_pRollPoint = NULL;
  546. }
  547. m_pRollPoint = new CPoint(point);
  548. m_nDisplacement = 0;
  549. Move(point);
  550. }
  551. CWnd::OnLButtonDown(nFlags, point);
  552. }
  553. // Function name : CSheetsWnd::OnLButtonUp
  554. // Description     : 
  555. // Return type : void 
  556. // Argument         : UINT nFlags
  557. // Argument         : CPoint point
  558. void CSheetsWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  559. {
  560. if (m_pRollPoint)
  561. {
  562. delete m_pRollPoint;
  563. m_pRollPoint = NULL;
  564. ReleaseCapture();
  565. Resize(GetParent()->m_hWnd);
  566. }
  567. CWnd::OnLButtonUp(nFlags, point);
  568. }
  569. // Function name : CSheetsWnd::OnMouseMove
  570. // Description     : 
  571. // Return type : void 
  572. // Argument         : UINT nFlags
  573. // Argument         : CPoint point
  574. void CSheetsWnd::OnMouseMove(UINT nFlags, CPoint point) 
  575. {
  576. Move(point);
  577. CWnd::OnMouseMove(nFlags, point);
  578. }
  579. // Function name : CSheetsWnd::OnSetCursor
  580. // Description     : Set the cursor.
  581. // Return type : BOOL 
  582. // Argument         : CWnd* pWnd
  583. // Argument         : UINT nHitTest
  584. // Argument         : UINT message
  585. BOOL CSheetsWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  586. {
  587. CPoint pCursor;
  588. if (GetCursorPos(&pCursor))
  589. {
  590. ScreenToClient(&pCursor);
  591. if (m_rectMoveBar.PtInRect(pCursor))
  592. {
  593. ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS));
  594. return TRUE;
  595. }
  596. }
  597. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  598. }
  599. // Function name : CSheetsWnd::GetViewFromPoint
  600. // Description     : Return pointer to view s.t. page of view contain point
  601. // Return type : CWnd* 
  602. // Argument         : CPoint point
  603. CWnd* CSheetsWnd::GetViewFromPoint(CPoint point)
  604. {
  605. if (m_DrawRect.PtInRect(point))
  606. {
  607. CWnd* pChild = GetFirstView();
  608. CDC* pDC = GetDC();
  609. pDC->SetViewportOrg(m_DrawRect.TopLeft());
  610. CFont* pOldFont = pDC->SelectObject(&m_font);
  611. int cxB = LRB, cx = cxB;
  612. int aPointX = -m_nHorzScroll + point.x - m_DrawRect.left;
  613. while (pChild)
  614. {
  615. CRect rt(cx,0,0,0);
  616. pDC->DrawText(GetViewTitle(pChild), rt, DEFAULTFORMATDRAWTEXT | DT_CALCRECT);
  617. rt.top = 0; rt.bottom = m_DrawRect.Height();
  618. rt.left -= 4; rt.right += 4;
  619. if ((aPointX > cx - LRB) && (aPointX  <= cx + rt.Width() + LRB))
  620. break;
  621. pChild = GetNextView();
  622. int next = rt.Width() + LRB ;
  623. cx += next;
  624. }
  625. pDC->SelectObject(pOldFont);
  626. ReleaseDC(pDC);
  627. return pChild;
  628. }
  629. return NULL;
  630. }
  631. // Function name : CSheetsWnd::GetDrawRect
  632. // Description     : Return the painting rect
  633. // Return type : CRect 
  634. CRect CSheetsWnd::GetDrawRect() const
  635. {
  636. return m_DrawRect;
  637. }
  638. // Function name : CSheetsWnd::EraseExclude
  639. // Description     : When WM_ERASEBKGND occurs, then CSheetsWnd::OnEraseBkGnd,
  640. // require a rect that will be excluded from area erased. That's it.
  641. // Return type : CRect 
  642. CRect CSheetsWnd::EraseExclude()
  643. {
  644. return m_DrawRect;
  645. }
  646. // Function name : CSheetsWnd::GetWindowProc
  647. // Description     : Return the window procedure of Parent object
  648. // Return type : WNDPROC 
  649. WNDPROC CSheetsWnd::GetWindowProc()
  650. {
  651. return m_wndProcParent;
  652. }
  653. // Function name : CSheetsWnd::OnKeyDown
  654. // Description     : Treat key as shortcut to page.
  655. // Return type : void 
  656. // Argument         : UINT nChar
  657. // Argument         : UINT nRepCnt
  658. // Argument         : UINT nFlags
  659. void CSheetsWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  660. {
  661. if (!GetCapture())
  662. switch (nChar)
  663. {
  664. case VK_LEFT:
  665. case VK_RIGHT:
  666. {
  667. SendMessage(WM_HSCROLL, MAKEWPARAM(nChar == VK_LEFT ? SB_LINELEFT : SB_LINERIGHT,0), (long)m_btns.m_hWnd);
  668. break;
  669. }
  670. default:
  671. JumpToPage(nChar);
  672. }
  673. CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
  674. }
  675. // Function name : CSheetsWnd::JumpToPage
  676. // Description     : Jump to page witch start with tChar
  677. // Return type : void 
  678. // Argument         : TCHAR tChar
  679. void CSheetsWnd::JumpToPage(TCHAR tChar)
  680. {
  681. CWnd* pChild = GetActiveView();
  682. if (!pChild)
  683. pChild = GetFirstView();
  684. else
  685. pChild = GetNextView();
  686. int n = 2; BOOL bFound = FALSE;
  687. while (n)
  688. {
  689. while (pChild)
  690. {
  691. if (IsEqual(GetViewTitle(pChild),CString(tChar)))
  692. {
  693. n = 0;
  694. bFound = TRUE;
  695. break;
  696. }
  697. pChild = GetNextView();
  698. }
  699. if (n)
  700. {
  701. pChild = GetFirstView();
  702. n--;
  703. }
  704. }
  705. if (bFound)
  706. if (GetActiveView() != pChild)
  707. {
  708. SetActiveView(pChild);
  709. EnsureVisible(pChild);
  710. }
  711. }
  712. // Function name : CSheetsWnd::IsEqual
  713. // Description     : Compare if two string is equal, call from JumpToPage
  714. // Return type : BOOL 
  715. // Argument         : CString s
  716. // Argument         : CString d
  717. BOOL CSheetsWnd::IsEqual(CString s, CString d)
  718. {
  719. s = s.Left(1); s.MakeUpper();
  720. d = d.Left(1); d.MakeUpper();
  721. return s == d;
  722. }
  723. // Function name : CSheetsWnd::EnsureVisible
  724. // Description     : Ensure that page pView is visible
  725. // Return type : void 
  726. // Argument         : CWnd * pView
  727. void CSheetsWnd::EnsureVisible(CWnd * pView)
  728. {
  729. CRect rect = GetPageRect(pView);
  730. int mDrawRect = (m_DrawRect.left + m_DrawRect.right) / 2;
  731. int mRect = (rect.left + rect.right) / 2;
  732. while (mRect > mDrawRect)
  733. {
  734. SendMessage(WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT,0), (long)m_btns.m_hWnd);
  735. rect = GetPageRect(pView);
  736. int nmRect = (rect.left + rect.right) / 2;
  737. if (nmRect >= mRect) break;
  738. mRect = nmRect;
  739. }
  740. while (mRect < mDrawRect)
  741. {
  742. SendMessage(WM_HSCROLL, MAKEWPARAM(SB_LINELEFT,0), (long)m_btns.m_hWnd);
  743. rect = GetPageRect(pView);
  744. int nmRect = (rect.left + rect.right) / 2;
  745. if (nmRect <= mRect) break;
  746. mRect = nmRect;
  747. }
  748. }
  749. CBrush * CSheetsWnd::GetPageBkBrush(int nPage)
  750. {
  751. return & m_brBackground;
  752. }
  753. CBrush * CSheetsWnd::GetPageBkBrush(CWnd * pView)
  754. {
  755. return & m_brBackground;
  756. }