ruler.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:22k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // ruler.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "wordpad.h"
  22. #include "ruler.h"
  23. #include "wordpvw.h"
  24. #include "wordpdoc.h"
  25. #include "strings.h"
  26. #include <memory.h>
  27. #ifdef _DEBUG
  28. #undef THIS_FILE
  29. static char BASED_CODE THIS_FILE[] = __FILE__;
  30. #endif
  31. #define HEIGHT 17
  32. #define RULERBARHEIGHT 17
  33. CRulerItem::CRulerItem(UINT nBitmapID)
  34. {
  35. m_nAlignment = TA_CENTER;
  36. m_pDC = NULL;
  37. m_bTrack = FALSE;
  38. m_hbm = NULL;
  39. m_hbmMask = NULL;
  40. if (nBitmapID != 0)
  41. {
  42. m_hbmMask = ::LoadBitmap(
  43. AfxFindResourceHandle(MAKEINTRESOURCE(nBitmapID+1), RT_BITMAP),
  44. MAKEINTRESOURCE(nBitmapID+1));
  45. ASSERT(m_hbmMask != NULL);
  46. VERIFY(LoadMaskedBitmap(MAKEINTRESOURCE(nBitmapID)));
  47. BITMAP bm;
  48. ::GetObject(m_hbm, sizeof(BITMAP), &bm);
  49. m_size = CSize(bm.bmWidth, bm.bmHeight);
  50. }
  51. }
  52. CRulerItem::~CRulerItem()
  53. {
  54. if (m_hbm != NULL)
  55. ::DeleteObject(m_hbm);
  56. if (m_hbmMask != NULL)
  57. ::DeleteObject(m_hbmMask);
  58. }
  59. BOOL CRulerItem::LoadMaskedBitmap(LPCTSTR lpszResourceName)
  60. {
  61. ASSERT(lpszResourceName != NULL);
  62. if (m_hbm != NULL)
  63. ::DeleteObject(m_hbm);
  64. HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_BITMAP);
  65. HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_BITMAP);
  66. if (hRsrc == NULL)
  67. return FALSE;
  68. m_hbm = AfxLoadSysColorBitmap(hInst, hRsrc);
  69. return (m_hbm != NULL);
  70. }
  71. void CRulerItem::SetHorzPosTwips(int nXPos)
  72. {
  73. if (GetHorzPosTwips() != nXPos)
  74. {
  75. if (m_bTrack)
  76. DrawFocusLine();
  77. Invalidate();
  78. m_nXPosTwips = nXPos;
  79. Invalidate();
  80. if (m_bTrack)
  81. DrawFocusLine();
  82. }
  83. }
  84. void CRulerItem::TrackHorzPosTwips(int nXPos, BOOL /*bOnRuler*/)
  85. {
  86. int nMin = GetMin();
  87. int nMax = GetMax();
  88. if (nXPos < nMin)
  89. nXPos = nMin;
  90. if (nXPos > nMax)
  91. nXPos = nMax;
  92. SetHorzPosTwips(nXPos);
  93. }
  94. void CRulerItem::DrawFocusLine()
  95. {
  96. if (GetHorzPosTwips() != 0)
  97. {
  98. m_rcTrack.left = m_rcTrack.right = GetHorzPosPix();
  99. ASSERT(m_pDC != NULL);
  100. int nLeft = m_pRuler->XRulerToClient(m_rcTrack.left);
  101. m_pDC->MoveTo(nLeft, m_rcTrack.top);
  102. m_pDC->LineTo(nLeft, m_rcTrack.bottom);
  103. }
  104. }
  105. void CRulerItem::SetTrack(BOOL b)
  106. {
  107. m_bTrack = b;
  108. if (m_pDC != NULL) // just in case we lost focus Capture somewhere
  109. {
  110. DrawFocusLine();
  111. m_pDC->RestoreDC(-1);
  112. delete m_pDC ;
  113. m_pDC = NULL;
  114. }
  115. if (m_bTrack)
  116. {
  117. CWordPadView* pView = (CWordPadView*)m_pRuler->GetView();
  118. ASSERT(pView != NULL);
  119. pView->GetClientRect(&m_rcTrack);
  120. m_pDC = new CWindowDC(pView);
  121. m_pDC->SaveDC();
  122. m_pDC->SelectObject(&m_pRuler->penFocusLine);
  123. m_pDC->SetROP2(R2_XORPEN);
  124. DrawFocusLine();
  125. }
  126. }
  127. void CRulerItem::Invalidate()
  128. {
  129. CRect rc = GetHitRectPix();
  130. m_pRuler->RulerToClient(rc.TopLeft());
  131. m_pRuler->RulerToClient(rc.BottomRight());
  132. m_pRuler->InvalidateRect(rc);
  133. }
  134. CRect CRulerItem::GetHitRectPix()
  135. {
  136. int nx = GetHorzPosPix();
  137. return CRect(
  138. CPoint(
  139. (m_nAlignment == TA_CENTER) ? (nx - m_size.cx/2) :
  140. (m_nAlignment == TA_LEFT) ? nx : nx - m_size.cx
  141. , m_nYPosPix
  142. ),
  143. m_size);
  144. }
  145. void CRulerItem::Draw(CDC& dc)
  146. {
  147. CDC dcBitmap;
  148. dcBitmap.CreateCompatibleDC(&dc);
  149. CPoint pt(GetHorzPosPix(), GetVertPosPix());
  150. HGDIOBJ hbm = ::SelectObject(dcBitmap.m_hDC, m_hbmMask);
  151. // do mask part
  152. if (m_nAlignment == TA_CENTER)
  153. dc.BitBlt(pt.x - m_size.cx/2, pt.y, m_size.cx, m_size.cy, &dcBitmap, 0, 0, SRCAND);
  154. else if (m_nAlignment == TA_LEFT)
  155. dc.BitBlt(pt.x, pt.y, m_size.cx, m_size.cy, &dcBitmap, 0, 0, SRCAND);
  156. else // TA_RIGHT
  157. dc.BitBlt(pt.x - m_size.cx, pt.y, m_size.cx, m_size.cy, &dcBitmap, 0, 0, SRCAND);
  158. // do image part
  159. ::SelectObject(dcBitmap.m_hDC, m_hbm);
  160. if (m_nAlignment == TA_CENTER)
  161. dc.BitBlt(pt.x - m_size.cx/2, pt.y, m_size.cx, m_size.cy, &dcBitmap, 0, 0, SRCINVERT);
  162. else if (m_nAlignment == TA_LEFT)
  163. dc.BitBlt(pt.x, pt.y, m_size.cx, m_size.cy, &dcBitmap, 0, 0, SRCINVERT);
  164. else // TA_RIGHT
  165. dc.BitBlt(pt.x - m_size.cx, pt.y, m_size.cx, m_size.cy, &dcBitmap, 0, 0, SRCINVERT);
  166. ::SelectObject(dcBitmap.m_hDC, hbm);
  167. }
  168. CComboRulerItem::CComboRulerItem(UINT nBitmapID1, UINT nBitmapID2, CRulerItem& item)
  169. : CRulerItem(nBitmapID1), m_secondary(nBitmapID2) , m_link(item)
  170. {
  171. m_bHitPrimary = TRUE;
  172. }
  173. BOOL CComboRulerItem::HitTestPix(CPoint pt)
  174. {
  175. m_bHitPrimary = FALSE;
  176. if (CRulerItem::GetHitRectPix().PtInRect(pt))
  177. m_bHitPrimary = TRUE;
  178. else
  179. return m_secondary.HitTestPix(pt);
  180. return TRUE;
  181. }
  182. void CComboRulerItem::Draw(CDC& dc)
  183. {
  184. CRulerItem::Draw(dc);
  185. m_secondary.Draw(dc);
  186. }
  187. void CComboRulerItem::SetHorzPosTwips(int nXPos)
  188. {
  189. if (m_bHitPrimary) // only change linked items by delta
  190. m_link.SetHorzPosTwips(m_link.GetHorzPosTwips() + nXPos - GetHorzPosTwips());
  191. CRulerItem::SetHorzPosTwips(nXPos);
  192. m_secondary.SetHorzPosTwips(nXPos);
  193. }
  194. void CComboRulerItem::TrackHorzPosTwips(int nXPos, BOOL /*bOnRuler*/)
  195. {
  196. int nMin = GetMin();
  197. int nMax = GetMax();
  198. if (nXPos < nMin)
  199. nXPos = nMin;
  200. if (nXPos > nMax)
  201. nXPos = nMax;
  202. SetHorzPosTwips(nXPos);
  203. }
  204. void CComboRulerItem::SetVertPos(int nYPos)
  205. {
  206. m_secondary.SetVertPos(nYPos);
  207. nYPos += m_secondary.GetHitRectPix().Height();
  208. CRulerItem::SetVertPos(nYPos);
  209. }
  210. void CComboRulerItem::SetAlignment(int nAlign)
  211. {
  212. CRulerItem::SetAlignment(nAlign);
  213. m_secondary.SetAlignment(nAlign);
  214. }
  215. void CComboRulerItem::SetRuler(CRulerBar* pRuler)
  216. {
  217. m_pRuler = pRuler;
  218. m_secondary.SetRuler(pRuler);
  219. }
  220. void CComboRulerItem::SetBounds(int nMin, int nMax)
  221. {
  222. CRulerItem::SetBounds(nMin, nMax);
  223. m_secondary.SetBounds(nMin, nMax);
  224. }
  225. int CComboRulerItem::GetMin()
  226. {
  227. if (m_bHitPrimary)
  228. {
  229. int nPDist = GetHorzPosTwips() - CRulerItem::GetMin();
  230. int nLDist = m_link.GetHorzPosTwips() - m_link.GetMin();
  231. return GetHorzPosTwips() - min(nPDist, nLDist);
  232. }
  233. else
  234. return CRulerItem::GetMin();
  235. }
  236. int CComboRulerItem::GetMax()
  237. {
  238. if (m_bHitPrimary)
  239. {
  240. int nPDist = CRulerItem::GetMax() - GetHorzPosTwips();
  241. int nLDist = m_link.GetMax() - m_link.GetHorzPosTwips();
  242. int nMinDist = (nPDist < nLDist) ? nPDist : nLDist;
  243. return GetHorzPosTwips() + nMinDist;
  244. }
  245. else
  246. return CRulerItem::GetMax();
  247. }
  248. void CTabRulerItem::TrackHorzPosTwips(int nXPos, BOOL bOnRuler)
  249. {
  250. if (bOnRuler)
  251. CRulerItem::TrackHorzPosTwips(nXPos, bOnRuler);
  252. else
  253. CRulerItem::TrackHorzPosTwips(0, bOnRuler);
  254. }
  255. BEGIN_MESSAGE_MAP(CRulerBar, CControlBar)
  256. //{{AFX_MSG_MAP(CRulerBar)
  257. ON_WM_LBUTTONDOWN()
  258. ON_WM_LBUTTONUP()
  259. ON_WM_MOUSEMOVE()
  260. ON_WM_SYSCOLORCHANGE()
  261. ON_WM_WINDOWPOSCHANGING()
  262. ON_WM_SHOWWINDOW()
  263. ON_WM_WINDOWPOSCHANGED()
  264. //}}AFX_MSG_MAP
  265. ON_MESSAGE(WM_SIZEPARENT, OnSizeParent)
  266. // Global help commands
  267. END_MESSAGE_MAP()
  268. CRulerBar::CRulerBar(BOOL b3DExt) :
  269. m_leftmargin(IDB_RULER_BLOCK, IDB_RULER_UP, m_indent),
  270. m_indent(IDB_RULER_DOWN),
  271. m_rightmargin(IDB_RULER_UP),
  272. m_tabItem(IDB_RULER_TAB)
  273. {
  274. m_bDeferInProgress = FALSE;
  275. m_leftmargin.SetRuler(this);
  276. m_indent.SetRuler(this);
  277. m_rightmargin.SetRuler(this);
  278. // all of the tab stops share handles
  279. for (int i=0;i<MAX_TAB_STOPS;i++)
  280. {
  281. m_pTabItems[i].m_hbm = m_tabItem.m_hbm;
  282. m_pTabItems[i].m_hbmMask = m_tabItem.m_hbmMask;
  283. m_pTabItems[i].m_size = m_tabItem.m_size;
  284. }
  285. m_unit.m_nTPU = 0;
  286. m_nScroll = 0;
  287. LOGFONT lf;
  288. MEMCPY_S(&lf, &theApp.m_lf, sizeof(LOGFONT));
  289. lf.lfHeight = -8;
  290. lf.lfWidth = 0;
  291. VERIFY(fnt.CreateFontIndirect(&lf));
  292. m_nTabs = 0;
  293. m_leftmargin.SetVertPos(9);
  294. m_indent.SetVertPos(-1);
  295. m_rightmargin.SetVertPos(9);
  296. m_cxLeftBorder = 0;
  297. if (!theApp.m_bWin4)
  298. m_bDraw3DExt = FALSE;
  299. else
  300. m_bDraw3DExt = b3DExt;
  301. m_cyTopBorder = 4;
  302. m_cyBottomBorder = 6;
  303. m_pSelItem = NULL;
  304. m_logx = theApp.m_dcScreen.GetDeviceCaps(LOGPIXELSX);
  305. CreateGDIObjects();
  306. }
  307. CRulerBar::~CRulerBar()
  308. {
  309. // set handles to NULL to avoid deleting twice
  310. for (int i=0;i<MAX_TAB_STOPS;i++)
  311. {
  312. m_pTabItems[i].m_hbm = NULL;
  313. m_pTabItems[i].m_hbmMask = NULL;
  314. }
  315. }
  316. void CRulerBar::CreateGDIObjects()
  317. {
  318. penFocusLine.DeleteObject();
  319. penBtnHighLight.DeleteObject();
  320. penBtnShadow.DeleteObject();
  321. penWindowFrame.DeleteObject();
  322. penBtnText.DeleteObject();
  323. penBtnFace.DeleteObject();
  324. penWindowText.DeleteObject();
  325. penWindow.DeleteObject();
  326. brushWindow.DeleteObject();
  327. brushBtnFace.DeleteObject();
  328. penFocusLine.CreatePen(PS_DOT, 1,GetSysColor(COLOR_WINDOWTEXT));
  329. penBtnHighLight.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNHIGHLIGHT));
  330. penBtnShadow.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));
  331. penWindowFrame.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_WINDOWFRAME));
  332. penBtnText.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNTEXT));
  333. penBtnFace.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNFACE));
  334. penWindowText.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_WINDOWTEXT));
  335. penWindow.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_WINDOW));
  336. brushWindow.CreateSolidBrush(GetSysColor(COLOR_WINDOW));
  337. brushBtnFace.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  338. }
  339. void CRulerBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL /*bDisableIfNoHndler*/)
  340. {
  341. ASSERT_VALID(this);
  342. //Get the page size and see if changed -- from document
  343. //get margins and tabs and see if changed -- from view
  344. if (m_pSelItem == NULL) // only update if not in middle of dragging
  345. {
  346. CWordPadView* pView = (CWordPadView*)GetView();
  347. ASSERT(pView != NULL);
  348. Update(pView->GetPaperSize(), pView->GetMargins());
  349. Update(pView->GetParaFormatSelection());
  350. CRect rect;
  351. pView->GetRichEditCtrl().GetRect(&rect);
  352. CPoint pt = rect.TopLeft();
  353. pView->ClientToScreen(&pt);
  354. ScreenToClient(&pt);
  355. if (m_cxLeftBorder != pt.x)
  356. {
  357. m_cxLeftBorder = pt.x;
  358. Invalidate();
  359. }
  360. int nScroll = pView->GetScrollPos(SB_HORZ);
  361. if (nScroll != m_nScroll)
  362. {
  363. m_nScroll = nScroll;
  364. Invalidate();
  365. }
  366. }
  367. }
  368. CSize CRulerBar::GetBaseUnits()
  369. {
  370. ASSERT(fnt.GetSafeHandle() != NULL);
  371. CFont* pFont = theApp.m_dcScreen.SelectObject(&fnt);
  372. TEXTMETRIC tm;
  373. VERIFY(theApp.m_dcScreen.GetTextMetrics(&tm) == TRUE);
  374. theApp.m_dcScreen.SelectObject(pFont);
  375. //  return CSize(tm.tmAveCharWidth, tm.tmHeight+tm.tmDescent);
  376. return CSize(tm.tmAveCharWidth, tm.tmHeight);
  377. }
  378. BOOL CRulerBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID)
  379. {
  380. ASSERT_VALID(pParentWnd);   // must have a parent
  381. dwStyle |= WS_CLIPSIBLINGS;
  382. // force WS_CLIPSIBLINGS (avoids SetWindowPos bugs)
  383. m_dwStyle = (dwStyle & CBRS_ALL);
  384. // create the HWND
  385. CRect rect;
  386. rect.SetRectEmpty();
  387. LPCTSTR lpszClass = AfxRegisterWndClass(0, ::LoadCursor(NULL, IDC_ARROW),
  388. (HBRUSH)(COLOR_BTNFACE+1), NULL);
  389. if (!CWnd::Create(lpszClass, NULL, dwStyle, rect, pParentWnd, nID))
  390. return FALSE;
  391. // NOTE: Parent must resize itself for control bar to be resized
  392. int i;
  393. int nMax = 100;
  394. for (i=0;i<MAX_TAB_STOPS;i++)
  395. {
  396. m_pTabItems[i].SetRuler(this);
  397. m_pTabItems[i].SetVertPos(8);
  398. m_pTabItems[i].SetHorzPosTwips(0);
  399. m_pTabItems[i].SetBounds(0, nMax);
  400. }
  401. return TRUE;
  402. }
  403. CSize CRulerBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  404. {
  405. ASSERT(bHorz);
  406. CSize m_size = CControlBar::CalcFixedLayout(bStretch, bHorz);
  407. CRect rectSize;
  408. rectSize.SetRectEmpty();
  409. CalcInsideRect(rectSize, bHorz);       // will be negative size
  410. m_size.cy = RULERBARHEIGHT - rectSize.Height();
  411. return m_size;
  412. }
  413. void CRulerBar::Update(const PARAFORMAT& pf)
  414. {
  415. ASSERT(pf.cTabCount <= MAX_TAB_STOPS);
  416. m_leftmargin.SetHorzPosTwips((int)(pf.dxStartIndent + pf.dxOffset));
  417. m_indent.SetHorzPosTwips((int)pf.dxStartIndent);
  418. m_rightmargin.SetHorzPosTwips(PrintWidth() - (int) pf.dxRightIndent);
  419. int i = 0;
  420. for (i=0;i<pf.cTabCount;i++)
  421. m_pTabItems[i].SetHorzPosTwips((int)pf.rgxTabs[i]);
  422. for ( ;i<MAX_TAB_STOPS; i++)
  423. m_pTabItems[i].SetHorzPosTwips(0);
  424. }
  425. void CRulerBar::Update(CSize sizePaper, const CRect& rectMargins)
  426. {
  427. if ((sizePaper != m_sizePaper) || (rectMargins != m_rectMargin))
  428. {
  429. m_sizePaper = sizePaper;
  430. m_rectMargin = rectMargins;
  431. Invalidate();
  432. }
  433. if (m_unit.m_nTPU != theApp.GetTPU())
  434. {
  435. m_unit = theApp.GetUnit();
  436. Invalidate();
  437. }
  438. }
  439. void CRulerBar::FillInParaFormat(PARAFORMAT& pf)
  440. {
  441. pf.dwMask = PFM_STARTINDENT | PFM_RIGHTINDENT | PFM_OFFSET | PFM_TABSTOPS;
  442. pf.dxStartIndent = m_indent.GetHorzPosTwips();
  443. pf.dxOffset = m_leftmargin.GetHorzPosTwips() - pf.dxStartIndent;
  444. pf.dxRightIndent = PrintWidth() - m_rightmargin.GetHorzPosTwips();
  445. pf.cTabCount = 0L;
  446. SortTabs();
  447. int i, nPos = 0;
  448. for (i=0;i<MAX_TAB_STOPS;i++)
  449. {
  450. // get rid of zeroes and multiples
  451. // i.e. if we have 0,0,0,1,2,3,4,4,5
  452. // we will get tabs at 1,2,3,4,5
  453. if (nPos != m_pTabItems[i].GetHorzPosTwips())
  454. {
  455. nPos = m_pTabItems[i].GetHorzPosTwips();
  456. pf.rgxTabs[pf.cTabCount++] = nPos;
  457. }
  458. }
  459. }
  460. // simple bubble sort is adequate for small number of tabs
  461. void CRulerBar::SortTabs()
  462. {
  463. int i,j, nPos;
  464. for (i=0;i<MAX_TAB_STOPS - 1;i++)
  465. {
  466. for (j=i+1; j < MAX_TAB_STOPS;j++)
  467. {
  468. if (m_pTabItems[j].GetHorzPosTwips() < m_pTabItems[i].GetHorzPosTwips())
  469. {
  470. nPos = m_pTabItems[j].GetHorzPosTwips();
  471. m_pTabItems[j].SetHorzPosTwips(m_pTabItems[i].GetHorzPosTwips());
  472. m_pTabItems[i].SetHorzPosTwips(nPos);
  473. }
  474. }
  475. }
  476. }
  477. void CRulerBar::DoPaint(CDC* pDC)
  478. {
  479. pDC->FillSolidRect(CXTPClientRect(this), XTPPaintManager()->GetXtremeColor(XPCOLOR_3DFACE));
  480. CControlBar::DoPaint(pDC); // CControlBar::DoPaint -- draws border
  481. if (m_unit.m_nTPU != 0)
  482. {
  483. pDC->SaveDC();
  484. // offset coordinate system
  485. CPoint pointOffset(0,0);
  486. RulerToClient(pointOffset);
  487. pDC->SetViewportOrg(pointOffset);
  488. DrawFace(*pDC);
  489. DrawTickMarks(*pDC);
  490. DrawTabs(*pDC);
  491. m_leftmargin.Draw(*pDC);
  492. m_indent.Draw(*pDC);
  493. m_rightmargin.Draw(*pDC);
  494. pDC->RestoreDC(-1);
  495. }
  496. // Do not call CControlBar::OnPaint() for painting messages
  497. }
  498. void CRulerBar::DrawTabs(CDC& dc)
  499. {
  500. int i;
  501. int nPos = 0;
  502. for (i=0;i<MAX_TAB_STOPS;i++)
  503. {
  504. if (m_pTabItems[i].GetHorzPosTwips() > nPos)
  505. nPos = (m_pTabItems[i].GetHorzPosTwips());
  506. m_pTabItems[i].Draw(dc);
  507. }
  508. int nPageWidth = PrintWidth();
  509. nPos = nPos - nPos%720 + 720;
  510. dc.SelectObject(&penBtnShadow);
  511. for ( ; nPos < nPageWidth; nPos += 720)
  512. {
  513. int nx = XTwipsToRuler(nPos);
  514. dc.MoveTo(nx, HEIGHT - 1);
  515. dc.LineTo(nx, HEIGHT + 1);
  516. }
  517. }
  518. void CRulerBar::DrawFace(CDC& dc)
  519. {
  520. int nPageWidth = XTwipsToRuler(PrintWidth());
  521. int nPageEdge = XTwipsToRuler(PrintWidth() + m_rectMargin.right);
  522. dc.SaveDC();
  523. dc.SelectObject(&penBtnShadow);
  524. dc.MoveTo(0,0);
  525. dc.LineTo(nPageEdge - 1, 0);
  526. dc.LineTo(nPageEdge - 1, HEIGHT - 2);
  527. dc.LineTo(nPageWidth - 1, HEIGHT - 2);
  528. dc.LineTo(nPageWidth - 1, 1);
  529. dc.LineTo(nPageWidth, 1);
  530. dc.LineTo(nPageWidth, HEIGHT -2);
  531. dc.SelectObject(&penBtnHighLight);
  532. dc.MoveTo(nPageWidth, HEIGHT - 1);
  533. dc.LineTo(nPageEdge, HEIGHT -1);
  534. dc.MoveTo(nPageWidth + 1, HEIGHT - 3);
  535. dc.LineTo(nPageWidth + 1, 1);
  536. dc.LineTo(nPageEdge - 1, 1);
  537. dc.SelectObject(&penWindow);
  538. dc.MoveTo(0, HEIGHT - 1);
  539. dc.LineTo(nPageWidth, HEIGHT -1);
  540. dc.SelectObject(&penBtnFace);
  541. dc.MoveTo(1, HEIGHT - 2);
  542. dc.LineTo(nPageWidth - 1, HEIGHT - 2);
  543. dc.SelectObject(&penWindowFrame);
  544. dc.MoveTo(0, HEIGHT - 2);
  545. dc.LineTo(0, 1);
  546. dc.LineTo(nPageWidth - 1, 1);
  547. dc.FillRect(CRect(1, 2, nPageWidth - 1, HEIGHT-2), &brushWindow);
  548. dc.FillSolidRect(CRect(nPageWidth + 2, 2, nPageEdge - 1, HEIGHT-2), XTPPaintManager()->GetXtremeColor(XPCOLOR_3DSHADOW));
  549. CRect rcClient;
  550. GetClientRect(&rcClient);
  551. ClientToRuler(rcClient);
  552. rcClient.top = HEIGHT;
  553. rcClient.bottom = HEIGHT + 2;
  554. dc.FillSolidRect(rcClient, XTPPaintManager()->GetXtremeColor(XPCOLOR_3DSHADOW));
  555. CRect rectFill(rcClient.left, HEIGHT+4, rcClient.right, HEIGHT+9);
  556. dc.FillRect(rectFill, &brushWindow);
  557. if (m_bDraw3DExt)  // draws the 3D extension into the view
  558. {
  559. dc.SelectObject(&penBtnShadow);
  560. dc.MoveTo(rcClient.left, HEIGHT+8);
  561. dc.LineTo(rcClient.left, HEIGHT+2);
  562. dc.LineTo(rcClient.right-1, HEIGHT+2);
  563. dc.SelectObject(&penWindowFrame);
  564. dc.MoveTo(rcClient.left+1, HEIGHT+8);
  565. dc.LineTo(rcClient.left+1, HEIGHT+3);
  566. dc.LineTo(rcClient.right-2, HEIGHT+3);
  567. dc.SelectObject(&penBtnHighLight);
  568. dc.MoveTo(rcClient.right-1, HEIGHT+2);
  569. dc.LineTo(rcClient.right-1, HEIGHT+8);
  570. dc.SelectObject(&penBtnFace);
  571. dc.MoveTo(rcClient.right-2, HEIGHT+3);
  572. dc.LineTo(rcClient.right-2, HEIGHT+8);
  573. }
  574. else
  575. {
  576. dc.SelectObject(&penBtnShadow);
  577. dc.MoveTo(rcClient.left, HEIGHT+2);
  578. dc.LineTo(rcClient.right, HEIGHT+2);
  579. dc.SelectObject(&penWindowFrame);
  580. dc.MoveTo(rcClient.left, HEIGHT+3);
  581. dc.LineTo(rcClient.right, HEIGHT+3);
  582. }
  583. dc.RestoreDC(-1);
  584. }
  585. void CRulerBar::DrawTickMarks(CDC& dc)
  586. {
  587. dc.SaveDC();
  588. dc.SelectObject(&penWindowText);
  589. dc.SelectObject(&fnt);
  590. dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
  591. dc.SetBkMode(TRANSPARENT);
  592. DrawDiv(dc, m_unit.m_nSmallDiv, m_unit.m_nLargeDiv, 2);
  593. DrawDiv(dc, m_unit.m_nMediumDiv, m_unit.m_nLargeDiv, 5);
  594. DrawNumbers(dc, m_unit.m_nLargeDiv, m_unit.m_nTPU);
  595. dc.RestoreDC(-1);
  596. }
  597. void CRulerBar::DrawNumbers(CDC& dc, int nInc, int nTPU)
  598. {
  599. int nPageWidth = PrintWidth();
  600. int nPageEdge = nPageWidth + m_rectMargin.right;
  601. TCHAR buf[10];
  602. int nTwips, nPixel, nLen;
  603. for (nTwips = nInc; nTwips < nPageEdge; nTwips += nInc)
  604. {
  605. if (nTwips == nPageWidth)
  606. continue;
  607. nPixel = XTwipsToRuler(nTwips);
  608. wsprintf(buf, _T("%d"), nTwips/nTPU);
  609. nLen = lstrlen(buf);
  610. CSize sz = dc.GetTextExtent(buf, nLen);
  611. dc.ExtTextOut(nPixel - sz.cx/2, HEIGHT/2 - sz.cy/2, 0, NULL, buf, nLen, NULL);
  612. }
  613. }
  614. void CRulerBar::DrawDiv(CDC& dc, int nInc, int nLargeDiv, int nLength)
  615. {
  616. int nPageWidth = PrintWidth();
  617. int nPageEdge = nPageWidth + m_rectMargin.right;
  618. int nTwips, nPixel;
  619. for (nTwips = nInc; nTwips < nPageEdge; nTwips += nInc)
  620. {
  621. if (nTwips == nPageWidth || nTwips%nLargeDiv == 0)
  622. continue;
  623. nPixel = XTwipsToRuler(nTwips);
  624. dc.MoveTo(nPixel, HEIGHT/2 - nLength/2);
  625. dc.LineTo(nPixel, HEIGHT/2 - nLength/2 + nLength);
  626. }
  627. }
  628. void CRulerBar::OnLButtonDown(UINT nFlags, CPoint point)
  629. {
  630. CPoint pt = point;
  631. ClientToRuler(pt);
  632. m_pSelItem = NULL;
  633. if (m_leftmargin.HitTestPix(pt))
  634. m_pSelItem = &m_leftmargin;
  635. else if (m_indent.HitTestPix(pt))
  636. m_pSelItem = &m_indent;
  637. else if (m_rightmargin.HitTestPix(pt))
  638. m_pSelItem = &m_rightmargin;
  639. else
  640. m_pSelItem = GetHitTabPix(pt);
  641. if (m_pSelItem == NULL)
  642. m_pSelItem = GetFreeTab();
  643. if (m_pSelItem == NULL)
  644. return;
  645. SetCapture();
  646. m_pSelItem->SetTrack(TRUE);
  647. SetMarginBounds();
  648. OnMouseMove(nFlags, point);
  649. }
  650. void CRulerBar::SetMarginBounds()
  651. {
  652. m_leftmargin.SetBounds(0, m_rightmargin.GetHorzPosTwips());
  653. m_indent.SetBounds(0, m_rightmargin.GetHorzPosTwips());
  654. int nMin = (m_leftmargin.GetHorzPosTwips() > m_indent.GetHorzPosTwips()) ?
  655. m_leftmargin.GetHorzPosTwips() : m_indent.GetHorzPosTwips();
  656. int nMax = PrintWidth() + m_rectMargin.right;
  657. m_rightmargin.SetBounds(nMin, nMax);
  658. // tabs can go from zero to the right page edge
  659. for (int i=0;i<MAX_TAB_STOPS;i++)
  660. m_pTabItems[i].SetBounds(0, nMax);
  661. }
  662. CRulerItem* CRulerBar::GetFreeTab()
  663. {
  664. int i;
  665. for (i=0;i<MAX_TAB_STOPS;i++)
  666. {
  667. if (m_pTabItems[i].GetHorzPosTwips() == 0)
  668. return &m_pTabItems[i];
  669. }
  670. return NULL;
  671. }
  672. CTabRulerItem* CRulerBar::GetHitTabPix(CPoint point)
  673. {
  674. int i;
  675. for (i=0;i<MAX_TAB_STOPS;i++)
  676. {
  677. if (m_pTabItems[i].HitTestPix(point))
  678. return &m_pTabItems[i];
  679. }
  680. return NULL;
  681. }
  682. void CRulerBar::OnLButtonUp(UINT nFlags, CPoint point)
  683. {
  684. if (::GetCapture() != m_hWnd)
  685. return;
  686. OnMouseMove(nFlags, point);
  687. m_pSelItem->SetTrack(FALSE);
  688. ReleaseCapture();
  689. CWordPadView* pView = (CWordPadView*)GetView();
  690. ASSERT(pView != NULL);
  691. PARAFORMAT& pf = pView->GetParaFormatSelection();
  692. FillInParaFormat(pf);
  693. pView->SetParaFormat(pf);
  694. m_pSelItem = NULL;
  695. }
  696. void CRulerBar::OnMouseMove(UINT nFlags, CPoint point)
  697. {
  698. CControlBar::OnMouseMove(nFlags, point);
  699. // use ::GetCapture to avoid creating temporaries
  700. if (::GetCapture() != m_hWnd)
  701. return;
  702. ASSERT(m_pSelItem != NULL);
  703. CRect rc(0,0, XTwipsToRuler(PrintWidth() + m_rectMargin.right), HEIGHT);
  704. RulerToClient(rc);
  705. BOOL bOnRuler = rc.PtInRect(point);
  706. // snap to minimum movement
  707. point.x = XClientToTwips(point.x);
  708. point.x += m_unit.m_nMinMove/2;
  709. point.x -= point.x%m_unit.m_nMinMove;
  710. m_pSelItem->TrackHorzPosTwips(point.x, bOnRuler);
  711. UpdateWindow();
  712. }
  713. void CRulerBar::OnSysColorChange()
  714. {
  715. CControlBar::OnSysColorChange();
  716. CreateGDIObjects();
  717. Invalidate();
  718. }
  719. void CRulerBar::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
  720. {
  721. CControlBar::OnWindowPosChanging(lpwndpos);
  722. CRect rect;
  723. GetClientRect(rect);
  724. int minx = min(rect.Width(), lpwndpos->cx);
  725. int maxx = max(rect.Width(), lpwndpos->cx);
  726. rect.SetRect(minx-2, rect.bottom - 6, minx, rect.bottom);
  727. InvalidateRect(rect);
  728. rect.SetRect(maxx-2, rect.bottom - 6, maxx, rect.bottom);
  729. InvalidateRect(rect);
  730. }
  731. void CRulerBar::OnShowWindow(BOOL bShow, UINT nStatus)
  732. {
  733. CControlBar::OnShowWindow(bShow, nStatus);
  734. m_bDeferInProgress = FALSE;
  735. }
  736. void CRulerBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
  737. {
  738. CControlBar::OnWindowPosChanged(lpwndpos);
  739. m_bDeferInProgress = FALSE;
  740. }
  741. LRESULT CRulerBar::OnSizeParent(WPARAM wParam, LPARAM lParam)
  742. {
  743. BOOL bVis = GetStyle() & WS_VISIBLE;
  744. if ((bVis && (m_nStateFlags & delayHide)) ||
  745. (!bVis && (m_nStateFlags & delayShow)))
  746. {
  747. m_bDeferInProgress = TRUE;
  748. }
  749. return CControlBar::OnSizeParent(wParam, lParam);
  750. }