友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

深入浅出MFC第2版(PDF格式)-第117部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



                   #0130  } 

                   #0131 

                   #0132  CStroke::CStroke(UINT nPenWidth) 

                   #0133  { 

                   #0134          m_nPenWidth = nPenWidth; 

                   #0135          m_rectBounding。SetRectEmpty(); 

                   #0136  } 

                   #0137 

                   #0138  void CStroke::Serialize(CArchive& ar) 

                   #0139  { 

                   #0140          if (ar。IsStoring()) 

                   #0141          { 

                   #0142                  ar  m_rectBounding; 

                   #0149                  WORD w; 

                   #0150                  ar 》》 w; 

                   #0151                  m_nPenWidth = w; 

                   #0152                  m_pointArray。Serialize(ar); 

                   #0153          } 

                   #0154  } 

                   #0155 

                   #0156  BOOL CStroke::DrawStroke(CDC* pDC) 

                   #0157  { 

                   #0158          CPen penStroke; 

                   #0159          if (!penStroke。CreatePen(PS_SOLID; m_nPenWidth; RGB(0;0;0))) 

                   #0160                  return FALSE; 

                   #0161          CPen* pOldPen = pDC…》SelectObject(&penStroke); 

                   #0162          pDC…》MoveTo(m_pointArray'0'); 

                   #0163          for (int i=1; i 《 m_pointArray。GetSize(); i++) 

                   #0164          { 

                   #0165                  pDC…》LineTo(m_pointArray'i'); 

                   #0166          } 

                   #0167 

                   #0168          pDC…》SelectObject(pOldPen); 

                   #0169          return TRUE; 

                   #0170  } 



890 


…………………………………………………………Page 953……………………………………………………………

                                                   附錄B    Scribble Step5  完整原始碼 



#0171  void CScribbleDoc::OnEditClearAll() 

#0172  { 

#0173          DeleteContents(); 

#0174          SetModifiedFlag();  // Mark the document as having been modified; for 

#0175                                 // purposes of confirming File Close。 

#0176          UpdateAllViews(NULL); 

#0177  } 

#0178 

#0179  void CScribbleDoc::OnPenThickOrThin() 

#0180  { 

#0181          // Toggle the state of the pen between thin or thick。 

#0182          m_bThickPen = !m_bThickPen; 

#0183 

#0184          // Change the current pen to reflect the new user…specified width。 

#0185          ReplacePen(); 

#0186  } 

#0187 

#0188  void CScribbleDoc::ReplacePen() 

#0189  { 

#0190          m_nPenWidth = m_bThickPen? m_nThickWidth : m_nThinWidth; 

#0191 

#0192          // Change the current pen to reflect the new user…specified width。 

#0193          m_penCur。DeleteObject(); 

#0194          m_penCur。CreatePen(PS_SOLID; m_nPenWidth; RGB(0;0;0)); // solid black 

#0195  } 

#0196 

#0197  void CScribbleDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) 

#0198  { 

#0199          // Enable the mand user interface object (menu item or tool bar 

#0200          // button) if the document is non…empty; i。e。; has at least one stroke。 

#0201          pCmdUI…》Enable(!m_strokeList。IsEmpty()); 

#0202  } 

#0203 

#0204  void CScribbleDoc::OnUpdatePenThickOrThin(CCmdUI* pCmdUI) 

#0205  { 

#0206          // Add check mark to Draw Thick Line menu item; if the current 

#0207          // pen width is 〃thick〃。 

#0208          pCmdUI…》SetCheck(m_bThickPen); 

#0209  } 

#0210 

#0211  void CScribbleDoc::OnPenWidths() 

#0212  { 

#0213          CPenWidthsDlg dlg; 

#0214          // Initialize dialog data 

#0215          dlg。m_nThinWidth = m_nThinWidth; 

#0216          dlg。m_nThickWidth = m_nThickWidth; 



                                                                                     891 


…………………………………………………………Page 954……………………………………………………………

                    第五篇    附錄  



                    #0217 

                    #0218          // Invoke the dialog box 

                    #0219          if (dlg。DoModal() == IDOK) 

                    #0220          { 

                    #0221                  // retrieve the dialog data 

                    #0222                  m_nThinWidth = dlg。m_nThinWidth; 

                    #0223                  m_nThickWidth = dlg。m_nThickWidth; 

                    #0224 

                    #0225                  // Update the pen that is used by views when drawing new strokes; 

                    #0226                  // to reflect the new pen width definitions for 〃thick〃 and 〃thin〃。 

                    #0227                  ReplacePen(); 

                    #0228          } 

                    #0229  } 

                    #0230 

                    #0231  void CStroke::FinishStroke() 

                    #0232  { 

                    #0233          // Calculate the bounding rectangle。  It's needed for smart 

                    #0234          // repainting。 

                    #0235 

                    #0236          if (m_pointArray。GetSize()==0) 

                    #0237          { 

                    #0238                  m_rectBounding。SetRectEmpty(); 

                    #0239                  return; 

                    #0240          } 

                    #0241          CPoint pt = m_pointArray'0'; 

                    #0242          m_rectBounding = CRect(pt。x; pt。y; pt。x; pt。y); 

                    #0243 

                    #0244          for (int i=1; i 《 m_pointArray。GetSize(); i++) 

                    #0245          { 

                    #0246                  // If the point lies outside of the accumulated bounding 

                    #0247                  // rectangle; then inflate the bounding rect to include it。 

                    #0248                  pt = m_pointArray'i'; 

                    #0249                  m_rectBounding。left     = min(m_rectBounding。left; pt。x); 

                    #0250                  m_rectBounding。right    = max(m_rectBounding。right; pt。x); 

                    #0251                  m_rectBounding。top      = max(m_rectBounding。top; pt。y); 

                    #0252                  m_rectBounding。bottom   = min(m_rectBounding。bottom; pt。y); 

                    #0253          } 

                    #0254 

                    #0255          // Add the pen width to the bounding rectangle。  This is necessary 

                    #0256          // to account for the width of the stroke when invalidating 

                    #0257          // the screen。 

                    #0258          m_rectBounding。InflateRect(CSize(m_nPenWidth; …(int)m_nPenWidth)); 

                    #0259          return; 

                    #0260  } 



892 


…………………………………………………………Page 955……………………………………………………………

                                                   附錄B    Scribble Step5  完整原始碼 



SCRIBBLEVIEW。H 



#0001  class CScribbleView : public CScrollView 

#0002  { 

#0003  protected: // create from serialization only 

#0004          CScribbleView(); 

#0005          DECLARE_DYNCREATE(CScribbleView) 

#0006 

#0007  // Attributes 

#0008  public: 

#0009          CScribbleDoc* GetDocument(); 

#0010 

#0011  protected: 

#0012          CStroke*    m_pStrokeCur;   // the stroke in progress 

#0013          CPoint      m_ptPrev;  // the last mouse pt in the stroke in progress 

#0014 

#0015  // Operations 

#0016  public: 

#0017 

#0018  // Overrides 

#0019          // ClassWizard generated virtual function overrides 

#0020          //{{AFX_VIRTUAL(CScribbleView) 

#0021          public: 

#0022          virtual void OnDraw(CDC* pDC);  // overridden to draw this view 

#0023          virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 

#0024          virtual void OnInitialUpdate(); 

#0025          protected: 

#0026          virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); 

#0027          virtual void OnBeginPrinting(CDC* pDC; CPrintInfo* pInfo); 

#0028          virtual void OnEndPrinting(CDC* pDC; CPrintInfo* pInfo); 

#0029          virtual void OnUpdate(CView* pSender; LPARAM lHint; CObject* pHint); 

#0030          virtual void OnPrint(CDC* pDC; CPrintInfo* pInfo); 

#0031          //}}AFX_VIRTUAL 

#0032 

#0033  // Implementation 

#0034  public: 

#0035          void PrintTitlePage(CDC* pDC; CPrintInfo* pInfo); 

#0036          void PrintPageHeader(CDC* pDC; CPrintInfo* pInfo; CString& strHeader); 

#0037          virtual ~CScribbleView(); 

#0038  #ifdef _DEBUG 

#0039          virtual void AssertValid() const; 

#0040          virtual void Dump(CDumpContext& dc) const; 

#0041  #endif 

#0042 

#0043  protected: 

#0044 



                                                                                      893 


…………………………………………………………Page 956……………………………………………………………

                   第五篇    附錄  



                   #0045  // Generated message map functions 

                   #0046  protected: 

                   #0047          //{{AFX_MSG(CScribbleView) 

                   #0048          afx_msg void OnLButtonDown(UINT nFlags; CPoint point); 

                   #0049          afx_msg void OnLButtonUp(UINT nFlags; CPoint point); 

                   #0050          afx_msg void OnMouseMove(UINT nFlags; CPoint point); 

                   #0051          //}}AFX_MSG 

                   #0052          DECLARE_MESSAGE_MAP() 

                   #0053  }; 

                   #0054 

                   #0055  #ifndef _DEBUG  // debug version in ScribVw。cpp 

                   #0056  inline CScribbleDoc* CScribbleView::GetDocument() 

                   #0057     { return (CScribbleDoc*)m_pDocument; } 

                   #0058  #endif 



                   SCRIBBLEVIEW。CPP 



                   #0001  #include 〃stdafx。h〃 

                   #0002  #include 〃Scribble。h〃 

                   #0003 

                   #0004  #include 〃ScribDoc。h〃 

                   #0005  #include 〃ScribVw。h〃 

                   #0006 

                   #0007  #ifdef _DEBUG 

                   #0008  #define new DEBUG_NEW 

                   #0009  #undef THIS_FILE 

                   #0010  static char THIS_FILE'' = __FILE__; 

                   #0011  #endif 

                   #0012 

                   #0013  ///////////////////////////////////////////////////////////////// 

                   #0014  // CScribbleView 

                   #0015 

                   #0016  IMPLEMENT_DYNCREATE(CScribbleView; CScrollView) 

                   #0017 

                   #0018  BEGIN_MESSAGE_MAP(CScribbleView; CScrollView) 

                   #0019          //{{AFX_MSG_MAP(CScribbleView) 

                   #0020          ON_WM_LBUTTONDOWN() 

                   #0021          ON_WM_LBUTTONUP() 

                   #0022          ON_WM_MOUSEMOVE() 

                   #0023          //}}AFX_MSG_MAP 

                   #0024          // Standard printing mands 

                   #0025          ON_MAND(ID_FILE_PRINT; CView::OnFilePrint) 

                   #0026          ON_MAND(ID_FILE_PRINT_DIRECT; CView::OnFilePrint) 

                   #0027          ON_MAND(ID_FILE_PRINT_PREVIEW; CView::OnFilePrintPreview) 

                   #0028  END_MESSAGE_MAP() 

                   #0029 



894 


…………………………………………………………Page 957……………………………………………………………

                                                   附錄B    Scribble Step5  完整原始碼 



#0030  ///////////////////////////////////////////////////////////////// 

#0031  // CScribbleView construction/destruction 

#0032 

#0033  CScribbleView::CScribbleView() 

#0034  { 

#0035          // TODO: add construction code here 

#0036 

#0037  } 

#0038 

#0039  CScribbleView::~CScribbleView() 

#0040  { 

#0041  } 

#0042 

#0043  BOOL CScribbleView::PreCreateWindow(CREATESTRUCT& cs) 

#0044  { 

#0045          // TODO: Modify the Window class or styles here by modifying 

#0046          //  the CREATESTRUCT cs 

#0047 

#0048          return CView::PreCreateWindow(cs); 

#0049  } 

#0050 

#0051  //////////////////////////////////////////////////////////////// 

#0052  // CScribbleView drawing 

#0053 

#0054  void CScribbleView::OnDraw(CDC* pDC) 

#0055  { 

#0056          CScribbleDoc* pDoc = GetDocument(); 

#0057          ASSERT_VALID(pDoc); 

#0058 

#0059          // Get the invalidated rectangle of the view; or in the case 

#0060          // of printing; the clipping region of the printer dc。 

#0061          CRect rectClip; 

#0062          CRect rectStroke; 

#0063          pDC…》GetClipBox(&rectClip); 

#0064          pDC…》LPtoDP(&rectClip); 

#0065          rectClip。InflateRect(1; 1); // avoid rounding to nothing 

#0066 

#0067          // Note: CScrollView::OnPaint() will have already adjusted the 

#0068          // viewport origin before calling OnDraw(); to reflect the 

#0069          // currently scrolled position。 

#0070 

#0071          // The view delegates the drawing of individual strokes to 

#0072          // CStroke::DrawStroke()。 

#0073          CTypedPtrList& strokeList = pDoc…》m_strokeList; 

#0074          POSITION pos = strokeList。GetHeadPosition(); 

#0075          while (pos != NULL) 



                                                                                     895 


…………………………………………………………Page 958……………………………………………………………

                   第五篇    附錄  



                    #0076          { 

                    #0077                  CStroke* pStroke = strokeList。GetNext(pos); 

                    #0078                  rectStroke = pStroke…》GetBoundingRect(); 

                    #0079                  pDC…》LPtoDP(&rectStroke); 

                    #0080                  rectStroke。InflateRect(1; 1); // avoid rounding to nothing 

                    #0081                  if (!rectStroke。IntersectRect(&rectStroke; &rectClip)) 

                    #0082                          continue; 

                    #0083                  pStroke…》DrawStroke(pDC); 

                    #0084          } 

                    #0085  } 

                    #0086 

                    #0087  ///////////////////////////////////////////////////////////////// 

                    #0088  // CScribbleView printing 

                    #0089 

                    #0090  BOOL CScribbleView::OnPreparePrinting(CPrintInfo* pInfo) 

                    #0091  {
返回目录 上一页 下一页 回到顶部 9 10
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!