home *** CD-ROM | disk | FTP | other *** search
- // drawarea.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "disdraw.h"
- #include "drawdlg.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CDrawArea
-
- CDrawArea::CDrawArea()
- {
- }
-
- CDrawArea::~CDrawArea()
- {
- }
-
-
- BEGIN_MESSAGE_MAP(CDrawArea, CEdit)
- //{{AFX_MSG_MAP(CDrawArea)
- ON_WM_LBUTTONDOWN()
- ON_WM_MOUSEMOVE()
- ON_WM_PAINT()
- ON_WM_RBUTTONUP()
- ON_WM_CTLCOLOR_REFLECT()
- ON_WM_KEYDOWN()
- ON_WM_CHAR()
- ON_WM_SETFOCUS()
- ON_WM_SETCURSOR()
- ON_WM_LBUTTONDBLCLK()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CDrawArea message handlers
-
- void CDrawArea::AddKeystroke(char *mbsKey)
- {
- //
- // The backspace keystroke should erase the last character
- //
- if (mbsKey[0] == VK_BACK)
- {
- int nStart, nEnd;
- GetSel(nStart, nEnd);
- SetSel(nEnd-1, nEnd);
- mbsKey[0] = '\0';
-
- //
- // Erasing a line feed should erase the preceding carriage return
- //
- CString strText;
- GetWindowText(strText);
- int iLength = strText.GetLength();
- if (iLength > 0 && strText.GetAt(strText.GetLength() - 1) == '\n')
- SetSel(nEnd-2, nEnd);
- }
-
- //
- // Append a line feed to a carriage return
- //
- else if (mbsKey[0] == VK_RETURN)
- strcat(mbsKey, "\xa");
-
- //
- // Store the new keystroke
- //
- ReplaceSel(mbsKey);
- }
-
-
- void CDrawArea::AddLine(LINE line)
- {
- //
- // Set the clipping region for the drawing
- //
- CClientDC dc(this);
- RECT rect;
- GetClientRect(&rect);
- CRgn rgn;
- rgn.CreateRectRgnIndirect(&rect);
- dc.SelectClipRgn(&rgn);
-
- //
- // Draw the line and save it for redrawing
- //
- dc.MoveTo(line.ptStart);
- dc.LineTo(line.ptEnd);
- m_listLines.AddTail(line);
- }
-
-
- void CDrawArea::OnLButtonDown(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
-
- m_ptLast = point;
- SetFocus();
- }
-
-
- void CDrawArea::OnMouseMove(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
-
- if (nFlags & MK_LBUTTON)
- {
- //
- // Add the drawn line to the drawing
- //
- LINE line;
- line.ptStart = m_ptLast;
- line.ptEnd = point;
- AddLine(line);
-
- //
- // Send the line to the friend
- //
- ((CDisdrawDlg *)GetParent())->SendMouseMovement(line);
-
- //
- // Remember the end point of the line
- //
- m_ptLast = point;
- }
- }
-
-
- void CDrawArea::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
-
- // TODO: Add your message handler code here
-
- //
- // Set the clipping region for the drawing
- //
- RECT rect;
- GetClientRect(&rect);
- CRgn rgn;
- rgn.CreateRectRgnIndirect(&rect);
- dc.SelectClipRgn(&rgn);
-
- //
- // Erase the drawing area
- //
- dc.FillSolidRect(&rect, GetSysColor(COLOR_MENU));
-
- //
- // Redisplay the text
- //
- CString strText;
- GetWindowText(strText);
- dc.SelectStockObject(ANSI_VAR_FONT);
- rect.top++;
- rect.left++;
- dc.DrawText(strText, &rect, DT_TOP | DT_WORDBREAK);
-
- //
- // Redraw each line
- //
- LINE line;
- POSITION posLine = m_listLines.GetHeadPosition();
- while (posLine != NULL)
- {
- line = m_listLines.GetNext(posLine);
- dc.MoveTo(line.ptStart);
- dc.LineTo(line.ptEnd);
- }
-
- // Do not call CEdit::OnPaint() for painting messages
- }
-
-
- void CDrawArea::OnRButtonUp(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
-
- //
- // Clear the drawing area
- //
- SetSel(0, -1);
- Clear();
- m_listLines.RemoveAll();
- RedrawWindow();
- }
-
-
- BOOL CDrawArea::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
- {
- // TODO: Add your message handler code here and/or call default
-
- return 0;
- }
-
-
- void CDrawArea::OnSetFocus(CWnd* pOldWnd)
- {
- CEdit::OnSetFocus(pOldWnd);
-
- // TODO: Add your message handler code here
-
- HideCaret();
- }
-
-
- HBRUSH CDrawArea::CtlColor(CDC* pDC, UINT nCtlColor)
- {
- // TODO: Change any attributes of the DC here
- pDC->SetBkColor(GetSysColor(COLOR_MENU));
-
- // TODO: Return a non-NULL brush if the parent's handler should not be called
- return HBRUSH((CBrush *)pDC->SelectStockObject(LTGRAY_BRUSH));
- }
-
-
- void CDrawArea::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- // TODO: Add your message handler code here and/or call default
-
- switch (nChar)
- {
- case VK_LEFT:
- case VK_RIGHT:
- case VK_UP:
- case VK_DOWN:
- case VK_HOME: break;
- default: CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
- }
- }
-
-
- void CDrawArea::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- // TODO: Add your message handler code here and/or call default
- ((CDisdrawDlg *)GetParent())->SendKeystroke(nChar);
-
- CEdit::OnChar(nChar, nRepCnt, nFlags);
-
- RedrawWindow();
- }
-
-
- void CDrawArea::OnLButtonDblClk(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- }
-