www.pudn.com > mischat.rar > mischatView.cpp


// mischatView.cpp : implementation of the CmischatView class 
// 
 
#include "stdafx.h" 
#include "mischat.h" 
#include "mischatDoc.h" 
#include "mischatView.h" 
#include "MainFrm.h" 
#include "Draw.h" 
#include ".\mischatview.h" 
#include "DrawTypeId.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
// CmischatView 
#define LINESIZE 5 
extern CmischatDoc* pDoc; 
extern CMainFrame* pMainWnd; 
 
IMPLEMENT_DYNCREATE(CmischatView, CView) 
 
BEGIN_MESSAGE_MAP(CmischatView, CView) 
	ON_WM_SIZE() 
	ON_WM_HSCROLL() 
	ON_WM_VSCROLL() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_CREATE() 
END_MESSAGE_MAP() 
 
// CmischatView construction/destruction 
 
CmischatView::CmischatView() 
{ 
	// TODO: add construction code here 
	beginTrack=isSelected=isGroupSelected=false; 
	pDraw=pDrawSelect=pCurve=NULL; 
	editRect.SetRect(0,0,150,20); 
	m_tracker.m_nStyle =CRectTracker::dottedLine|CRectTracker::resizeInside; 
	m_tracker.m_nHandleSize =4; 
	m_tracker.m_sizeMin.cx=20; 
	m_tracker.m_sizeMin.cy=20; 
} 
 
CmischatView::~CmischatView() 
{ 
	while(!psList.IsEmpty ()) psList.RemoveHead(); 
} 
 
BOOL CmischatView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
	cs.style |=WS_VSCROLL|WS_HSCROLL; 
	return CView::PreCreateWindow(cs); 
} 
 
// CmischatView drawing 
 
void CmischatView::OnDraw(CDC* pDC) 
{ 
	// TODO: add draw code for native data here 
	pDC->SetWindowOrg (m_nHScrollPos, m_nVScrollPos); 
	if(!imgOriginal.IsNull()){ 
		imgOriginal.StretchBlt(*pDC,0,0,(int)imgOriginal.GetWidth(),(int)imgOriginal.GetHeight(),SRCCOPY); 
	} 
	drawListContent(pDC); 
} 
 
// CmischatView diagnostics 
 
#ifdef _DEBUG 
void CmischatView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CmischatView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CmischatDoc* CmischatView::GetDocument() const // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CmischatDoc))); 
	return (CmischatDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
 
// CmischatView message handlers 
 
void CmischatView::clearAll() 
{ 
	pDoc->csDrawInfo.Lock (); 
	while(!pDoc->drawList.IsEmpty ()) delete pDoc->drawList.RemoveHead(); 
	pDoc->csDrawInfo.Unlock (); 
	pCurve=NULL; 
	pDrawSelect=NULL; 
	isSelected=false; 
	isGroupSelected=false; 
	pMainWnd->RefreshPropList (); 
	Invalidate (); 
} 
 
void CmischatView::AddToTail(CDraw * pdw) 
{ 
	//pDoc->csDrawInfo.Lock (); 
	pDoc->drawList.AddTail (pdw); 
	//pDoc->csDrawInfo.Unlock (); 
} 
 
void CmischatView::Load(LPCTSTR fileName) 
{ 
	HRESULT hr; 
	CRect rect; 
	imgOriginal.Destroy(); 
	hr=imgOriginal.Load( fileName ); 
	if(FAILED(hr)){ 
		CString str; 
		str.Format("读入图象文件失败\n%x---%s",hr,_com_error(hr).ErrorMessage()); 
		::AfxMessageBox(str); 
		m_nViewWidth=0; 
		m_nViewHeight=0; 
	} 
	else{ 
        m_nViewWidth=imgOriginal.GetWidth(); 
		m_nViewHeight=imgOriginal.GetHeight(); 
	} 
	GetWindowRect(rect); 
	InitScroll(rect.Width(),rect.Height()); 
	Invalidate(); 
} 
 
void CmischatView::OnSize(UINT nType, int cx, int cy) 
{ 
	CWnd::OnSize(nType, cx, cy); 
 
	// TODO: 在此处添加消息处理程序代码 
	InitScroll(cx, cy); 
} 
 
void CmischatView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
 
	CWnd::OnHScroll(nSBCode, nPos, pScrollBar); 
	int nDelta; 
 
    // 
    // Compute the horizontal scroll distance, or "delta." 
    // 
    switch (nSBCode) { 
 
    case SB_LINELEFT: 
        nDelta = -LINESIZE; 
        break; 
 
    case SB_PAGELEFT: 
        nDelta = -m_nHPageSize; 
        break; 
 
    case SB_THUMBTRACK: 
        nDelta = (int) nPos - m_nHScrollPos; 
        break; 
 
    case SB_PAGERIGHT: 
        nDelta = m_nHPageSize; 
        break; 
 
    case SB_LINERIGHT: 
        nDelta = LINESIZE; 
        break; 
 
    default: // Ignore other scroll bar messages 
        return; 
    } 
 
    // 
    // Adjust the delta if adding it to the current scroll position would 
    // cause an underrun or overrun. 
    // 
    int nScrollPos = m_nHScrollPos + nDelta; 
    int nMaxPos = m_nViewWidth - m_nHPageSize; 
 
    if (nScrollPos < 0) 
        nDelta = -m_nHScrollPos; 
    else if (nScrollPos > nMaxPos) 
        nDelta = nMaxPos - m_nHScrollPos; 
 
    // 
    // Update the scroll position and scroll the window. 
    // 
    if (nDelta != 0) { 
        m_nHScrollPos += nDelta; 
        SetScrollPos (SB_HORZ, m_nHScrollPos, TRUE); 
		ScrollWindow (-nDelta, 0); 
    } 
} 
 
void CmischatView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
 
	CWnd::OnVScroll(nSBCode, nPos, pScrollBar); 
	    int nDelta; 
 
    // 
    // Compute the vertical scroll distance, or "delta." 
    // 
    switch (nSBCode) { 
 
    case SB_LINEUP: 
        nDelta = -LINESIZE; 
        break; 
 
    case SB_PAGEUP: 
        nDelta = -m_nVPageSize; 
        break; 
 
    case SB_THUMBTRACK: 
        nDelta = (int) nPos - m_nVScrollPos; 
        break; 
 
    case SB_PAGEDOWN: 
        nDelta = m_nVPageSize; 
        break; 
 
    case SB_LINEDOWN: 
        nDelta = LINESIZE; 
        break; 
 
    default: // Ignore other scroll bar messages 
        return; 
    } 
 
    // 
    // Adjust the delta if adding it to the current scroll position would 
    // cause an underrun or overrun. 
    // 
    int nScrollPos = m_nVScrollPos + nDelta; 
    int nMaxPos = m_nViewHeight - m_nVPageSize; 
 
    if (nScrollPos < 0) 
        nDelta = -m_nVScrollPos; 
    else if (nScrollPos > nMaxPos) 
        nDelta = nMaxPos - m_nVScrollPos; 
 
    // 
    // Update the scroll position and scroll the window. 
    // 
    if (nDelta != 0) { 
        m_nVScrollPos += nDelta; 
        SetScrollPos (SB_VERT, m_nVScrollPos, TRUE); 
        ScrollWindow (0, -nDelta); 
    } 
 
} 
 
void CmischatView::InitScroll(int cx, int cy) 
{ 
	int nHScrollMax = 0; 
    m_nHScrollPos = m_nHPageSize = 0; 
 
    if (cx < m_nViewWidth) { 
        nHScrollMax = m_nViewWidth - 1; 
        m_nHPageSize = cx; 
        m_nHScrollPos = min (m_nHScrollPos, m_nViewWidth - 
            m_nHPageSize - 1); 
    } 
 
    SCROLLINFO si; 
    si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; 
    si.nMin = 0; 
    si.nMax = nHScrollMax; 
    si.nPos = m_nHScrollPos; 
    si.nPage = m_nHPageSize; 
 
    SetScrollInfo (SB_HORZ, &si, TRUE); 
 
    // 
    // Set the vertical scrolling parameters. 
    // 
    int nVScrollMax = 0; 
    m_nVScrollPos = m_nVPageSize = 0; 
 
    if (cy < m_nViewHeight) { 
        nVScrollMax = m_nViewHeight - 1; 
        m_nVPageSize = cy; 
        m_nVScrollPos = min (m_nVScrollPos, m_nViewHeight - 
            m_nVPageSize - 1); 
    } 
 
    si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; 
    si.nMin = 0; 
    si.nMax = nVScrollMax; 
    si.nPos = m_nVScrollPos; 
    si.nPage = m_nVPageSize; 
 
    SetScrollInfo (SB_VERT, &si, TRUE); 
} 
 
void CmischatView::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
	//指针 文本工具 清除工具 铅笔工具 矩形选择 画笔工具 喷枪工具 填充工具 线条工具 空心矩形  
	//0    1        2        3        4        5        6        7        8        9         
	//实心矩形 矩形工具 空心圆角矩形 实心圆角矩形 圆角矩形工具 空心椭圆 实心椭圆 椭圆工具 
	//10       11       12           13           14           15       16       17 
	CClientDC dc(this); 
	POSITION ps; 
	bool rel=false; 
	CPoint pt=point; 
	pt.Offset (m_nHScrollPos,m_nVScrollPos); 
	CRect rect; 
 
	pDoc->csDrawInfo.Lock (); 
 
	if(isSelected && pDrawSelect!=NULL) 
	{ 
		m_rect=pDrawSelect->GetOutside (&dc); 
		m_rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
		isSelected=false; 
		pDrawSelect=NULL; 
		m_rect.InflateRect (10,10); 
		InvalidateRect (m_rect); 
		 
	} 
 
	dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos); 
 
	if(isGroupSelected) 
	{ 
		POSITION pos; 
		for( pos =psList.GetHeadPosition(); pos != NULL; ) 
		{ 
			ps=psList.GetNext (pos); 
			pDraw=pDoc->drawList.GetAt (ps); 
			rel=pDraw->HitTest(pt,&dc); 
			if(rel) break; 
		} 
		if(rel) 
		{ 
			m_rect=GetGroupSelectOutSide(&dc); 
			dc.LPtoDP (m_rect);			 
			m_tracker.m_rect =m_rect; 
			if(m_tracker.Track (this,point)) MoveGroupDraw(&dc); 
			goto label; 
		} 
		else 
		{ 
			isGroupSelected=false; 
			rect=GetGroupSelectOutSide(&dc); 
			rect.InflateRect (10,10); 
			rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
			InvalidateRect (rect); 
		} 
	} 
	 
	switch(pDoc->flag){ 
		case NOTHING: 
		ps=pDoc->drawList.GetHeadPosition (); 
		while(ps!=NULL){ 
			pSelect=ps; 
			pDrawSelect=pDoc->drawList.GetNext (ps); 
			rel=pDrawSelect->HitTest(pt,&dc); 
			if(rel) break; 
		} 
		if(rel){ 
			isSelected=true; 
			m_rect=pDrawSelect->GetOutside (&dc); 
 
			rect=m_rect; 
			rect.InflateRect (10,10); 
			rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
			InvalidateRect (rect); 
 
			dc.LPtoDP (m_rect);			 
			m_rect2=m_rect; 
			m_tracker.m_rect =m_rect; 
			if(m_tracker.Track (this,point)) MoveDraw(&dc); 
		} 
		break; 
 
		case RECTSELECT: 
		if(m_tracker.TrackRubberBand(this, point)) 
		{ 
			while(!psList.IsEmpty ()) psList.RemoveHead(); 
			m_rect=m_tracker.m_rect ; 
			dc.DPtoLP (m_rect); 
			m_rect.NormalizeRect (); 
 
			ps=pDoc->drawList.GetHeadPosition (); 
			while(ps!=NULL){ 
				pSelect=ps; 
				pDrawSelect=pDoc->drawList.GetNext (ps); 
				m_rect2=pDrawSelect->GetOutside (&dc); 
				if(rect.IntersectRect(m_rect,m_rect2)) psList.AddTail (pSelect); 
			} 
			if(psList.GetCount ()>0){ 
				isGroupSelected=true; 
				DrawGroupSelect(&dc); 
			} 
		} 
		break; 
 
		case BLANKRECTANGLE: case SOLIDRECTANGLE:case RECTANGLE: 
		case BLANKROUNDRECT: case SOLIDROUNDRECT:case ROUNDRECT: 
		if(m_tracker.TrackRubberBand(this, point)){ 
			m_rect=m_tracker.m_rect; 
			dc.DPtoLP (m_rect); 
			m_rect.NormalizeRect (); 
		} 
		pDraw=new CRectangle(m_rect,pDoc->corPen,pDoc->corBrush,pDoc->widthPen,pDoc->flag); 
		AddToTail(pDraw); 
		pDraw->Draw (&dc); 
 
		if(pDoc->server.isStart()) 
		pDoc->SendMsgToAll (pDraw); 
		if(pDoc->client.isStart()) 
		pDoc->SendMsg(pDraw); 
		break; 
 
		case BLANKELLIPSE: case SOLIDELLIPSE: case ELLIPSE: 
		if(m_tracker.TrackRubberBand(this, point)){ 
			m_rect=m_tracker.m_rect; 
			dc.DPtoLP (m_rect); 
			m_rect.NormalizeRect (); 
		} 
		pDraw=new CEllipse(m_rect,pDoc->corPen,pDoc->corBrush,pDoc->widthPen,pDoc->flag); 
		AddToTail(pDraw); 
		pDraw->Draw (&dc); 
 
		if(pDoc->server.isStart()) 
		pDoc->SendMsgToAll (pDraw); 
		if(pDoc->client.isStart()) 
		pDoc->SendMsg(pDraw); 
		break; 
 
		case LINE: 
			beginTrack=true; 
			topLeft=point; 
			rightBottom=point; 
			topLeft.Offset(m_nHScrollPos, m_nVScrollPos); 
			rightBottom.Offset(m_nHScrollPos, m_nVScrollPos); 
			break; 
		case CURVE: 
			beginTrack=true; 
			topLeft=point; 
			rightBottom=point; 
			rightBottom.Offset(m_nHScrollPos, m_nVScrollPos); 
			pCurve=new CCurve(); 
			if(pCurve!=NULL){ 
				pCurve->Init (pDoc->widthPen,pDoc->corPen); 
				pCurve->AddPoint (rightBottom);			 
				AddToTail(pCurve); 
			} 
			break; 
		case DRAWTEXT: 
			if(!m_wndEdit.IsWindowVisible ()) 
			{ 
				editRect.MoveToXY (point); 
				m_wndEdit.MoveWindow (editRect); 
				m_wndEdit.ShowWindow (SW_SHOW); 
				m_wndEdit.SetWindowText (""); 
				m_wndEdit.SetFocus (); 
			}else{ 
				CString str; 
				m_wndEdit.ShowWindow (SW_HIDE); 
				m_wndEdit.GetWindowText (str); 
				if(!str.Trim().IsEmpty ()){ 
					point.Offset (m_nHScrollPos, m_nVScrollPos); 
					pDraw=new CText(point,str,pDoc->lf,pDoc->corText); 
					AddToTail(pDraw); 
					pDraw->Draw (&dc); 
 
					if(pDoc->server.isStart()) 
					pDoc->SendMsgToAll (pDraw); 
					if(pDoc->client.isStart()) 
					pDoc->SendMsg(pDraw); 
				} 
			} 
			break; 
	} 
	pMainWnd->RefreshPropList (); 
label: 
	pDoc->csDrawInfo.Unlock (); 
 
	if(beginTrack)  SetCapture (); 
	if(pDoc->flag!=DRAWTEXT) m_wndEdit.ShowWindow (SW_HIDE); 
	CView::OnLButtonDown(nFlags, point); 
} 
 
void CmischatView::drawListContent(CDC* pdc) 
{ 
	pDoc->csDrawInfo.Lock (); 
	POSITION pos; 
    for( pos =pDoc->drawList.GetHeadPosition(); pos != NULL; ) 
    { 
		pDraw=pDoc->drawList.GetNext (pos); 
		pDraw->Draw (pdc); 
    } 
	if(isSelected && pDrawSelect!=NULL) 
	{ 
		m_rect=pDrawSelect->GetOutside (pdc); 
		pdc->LPtoDP (m_rect); 
		m_tracker.m_rect =m_rect; 
		m_tracker.Draw (pdc); 
	} 
	if(isGroupSelected) 
	{ 
		POSITION pos,ps; 
		CRect rect; 
		for( pos =psList.GetHeadPosition(); pos != NULL; ) 
		{ 
			ps=psList.GetNext (pos); 
			pDraw=pDoc->drawList.GetAt (ps); 
			rect=pDraw->GetOutside (pdc); 
			pdc->LPtoDP (rect); 
			m_tracker.m_rect =rect; 
			m_tracker.Draw (pdc); 
		} 
	} 
	pDoc->csDrawInfo.Unlock (); 
} 
 
void CmischatView::OnMouseMove(UINT nFlags, CPoint point) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
	//指针 文本工具 清除工具 铅笔工具 矩形选择 画笔工具 喷枪工具 填充工具 线条工具 空心矩形  
	//0    1        2        3        4        5        6        7        8        9         
	//实心矩形 矩形工具 空心圆角矩形 实心圆角矩形 圆角矩形工具 空心椭圆 实心椭圆 椭圆工具 
	//10       11       12           13           14           15       16       17 
    if(beginTrack){ 
		CClientDC dc(this); 
		dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos); 
		if(pDoc->flag==LINE){ 
			int nOldMode = dc.SetROP2 (R2_NOT); 
			dc.MoveTo (topLeft); 
			dc.LineTo (rightBottom); 
			rightBottom=point; 
			rightBottom.Offset(m_nHScrollPos, m_nVScrollPos); 
			dc.MoveTo (topLeft); 
			dc.LineTo (rightBottom); 
			dc.SetROP2 (nOldMode); 
		} 
		else if(pDoc->flag==CURVE){ 
            point.Offset(m_nHScrollPos, m_nVScrollPos); 
			if(pCurve){ 
				pCurve->AddPoint (point); 
				pCurve->Draw (&dc); 
			} 
		} 
	} 
	CView::OnMouseMove(nFlags, point); 
} 
 
void CmischatView::OnLButtonUp(UINT nFlags, CPoint point) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
	//指针 文本工具 清除工具 铅笔工具 矩形选择 画笔工具 喷枪工具 填充工具 线条工具 空心矩形  
	//0    1        2        3        4        5        6        7        8        9         
	//实心矩形 矩形工具 空心圆角矩形 实心圆角矩形 圆角矩形工具 空心椭圆 实心椭圆 椭圆工具 
	//10       11       12           13           14           15       16       17 
    if(beginTrack){ 
		CClientDC dc(this); 
		dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos); 
		if(pDoc->flag==LINE){ 
			int nOldMode = dc.SetROP2 (R2_NOT); 
			dc.MoveTo (topLeft); 
			dc.LineTo (rightBottom); 
			rightBottom=point; 
			dc.SetROP2 (nOldMode); 
			rightBottom.Offset(m_nHScrollPos, m_nVScrollPos); 
			pDraw=new CLine(topLeft,rightBottom,pDoc->corPen,pDoc->widthPen); 
			AddToTail(pDraw); 
			pDraw->Draw (&dc); 
 
			if(pDoc->server.isStart()) 
			pDoc->SendMsgToAll (pDraw); 
			if(pDoc->client.isStart()) 
			pDoc->SendMsg(pDraw); 
		} 
		else if(pDoc->flag==CURVE){ 
            point.Offset(m_nHScrollPos, m_nVScrollPos); 
		    if(pCurve){ 
				pCurve->AddPoint (point); 
				pCurve->Draw (&dc); 
			} 
 
			if(pDoc->server.isStart()) 
			pDoc->SendMsgToAll (pCurve); 
			if(pDoc->client.isStart()) 
			pDoc->SendMsg(pCurve); 
 
			pCurve=NULL; 
		} 
		beginTrack=false; 
		::ReleaseCapture(); 
	} 
	CView::OnLButtonUp(nFlags, point); 
} 
 
BOOL CmischatView::PreTranslateMessage(MSG* pMsg) 
{ 
	// TODO: 在此添加专用代码和/或调用基类 
	if (pMsg->message == WM_KEYDOWN) 
	{ 
		int nVirtKey = (int) pMsg->wParam; 
		if (nVirtKey == VK_ESCAPE && (GetFocus()->m_hWnd  == m_wndEdit.m_hWnd)) 
		{ 
			m_wndEdit.ShowWindow(SW_HIDE); 
			return TRUE; 
		} 
		if (nVirtKey == VK_RETURN && (GetFocus()->m_hWnd  == m_wndEdit.m_hWnd)) 
		{ 
			CString str; 
			m_wndEdit.GetWindowText (str); 
			if(!str.Trim().IsEmpty ()){ 
				CPoint point=editRect.TopLeft (); 
				point.Offset (m_nHScrollPos, m_nVScrollPos); 
				pDraw=new CText(point,str,pDoc->lf,pDoc->corText); 
				AddToTail(pDraw); 
				CClientDC dc(this); 
				dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos); 
				pDraw->Draw (&dc); 
 
				if(pDoc->server.isStart()) 
				pDoc->SendMsgToAll (pDraw); 
				if(pDoc->client.isStart()) 
				pDoc->SendMsg(pDraw); 
			} 
			m_wndEdit.ShowWindow (SW_HIDE); 
			return TRUE; 
		} 
		if (nVirtKey == VK_DELETE) 
		{ 
			CClientDC dc(this); 
			pDoc->csDrawInfo.Lock (); 
			if(isSelected && pSelect!=NULL) 
			{ 
				if(pDoc->drawList.GetAt (pSelect)==pDrawSelect) 
				{ 
					pDoc->drawList.RemoveAt (pSelect);					 
					m_rect=pDrawSelect->GetOutside (&dc); 
					m_rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
					delete pDrawSelect; 
					isSelected=false; 
					pDrawSelect=NULL; 
					m_rect.InflateRect (10,10); 
					InvalidateRect (m_rect); 
				} 
			} 
 
			if(isGroupSelected) 
			{ 
				m_rect=GetGroupSelectOutSide(&dc); 
				m_rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
				m_rect.InflateRect (10,10); 
				POSITION pos,ps; 
				for( pos =psList.GetHeadPosition(); pos != NULL; ) 
				{ 
					ps=psList.GetNext (pos); 
					pDraw=pDoc->drawList.GetAt (ps); 
					pDoc->drawList.RemoveAt (ps); 
					delete pDraw; 
				} 
				isGroupSelected=false; 
				InvalidateRect (m_rect); 
			} 
			pDoc->csDrawInfo.Unlock (); 
			return TRUE; 
		} 
	} 
	return CView::PreTranslateMessage(pMsg); 
} 
 
int CmischatView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	// TODO:  在此添加您专用的创建代码 
	CSimpleArray aguidFileTypes; 
	HRESULT hResult; 
	CString str; 
	hResult = imgOriginal.GetExporterFilterString(str,aguidFileTypes); 
	str=str.Left (str.GetLength ()-1)+"All files(*.*)|*.*||"; 
	pDoc->strImageFilter=str; 
	if (FAILED(hResult)) { 
		str.Format("GetExporterFilter failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage()); 
		::AfxMessageBox(str); 
	} 
	if(!m_wndEdit.Create (WS_CHILD|WS_BORDER|ES_AUTOHSCROLL,CRect(0,0,0,0),this,IDC_EDIT)) return -1; 
	m_wndEdit.SetFont (CFont::FromHandle ((HFONT) GetStockObject (DEFAULT_GUI_FONT))); 
    return 0; 
} 
void CmischatView::Draw(CDraw* pdw) 
{ 
	// TODO: 在此添加专用代码和/或调用基类 
	CClientDC dc(this); 
	dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos); 
	pdw->Draw (&dc); 
} 
 
void CmischatView::MoveDraw(CDC* pdc) 
{ 
	m_rect2=m_tracker.m_rect; 
	CSize s=m_rect2.TopLeft() -m_rect.TopLeft() ; 
	pdc->DPtoLP (&s); 
	pDrawSelect->Offset (s); 
	pDrawSelect->Draw (pdc); 
 
	LONG left,top,right,bottom; 
	left=m_rect.leftm_rect2.right?m_rect.right:m_rect2.right; 
	bottom=m_rect.bottom>m_rect2.bottom?m_rect.bottom:m_rect2.bottom; 
	m_rect.SetRect (left,top,right,bottom); 
	pdc->DPtoLP (m_rect); 
	m_rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
	m_rect.InflateRect (10,10); 
	InvalidateRect (m_rect); 
} 
 
void CmischatView::DrawGroupSelect(CDC* pdc) 
{ 
	POSITION pos,ps; 
	CRect rect; 
    for( pos =psList.GetHeadPosition(); pos != NULL; ) 
    { 
		ps=psList.GetNext (pos); 
		pDraw=pDoc->drawList.GetAt (ps); 
		rect=pDraw->GetOutside (pdc); 
		pdc->LPtoDP (rect); 
		m_tracker.m_rect =rect; 
		m_tracker.Draw (pdc); 
    } 
} 
 
void CmischatView::MoveGroupDraw(CDC* pdc) 
{ 
	m_rect2=m_tracker.m_rect; 
	CSize s=m_rect2.TopLeft() -m_rect.TopLeft() ; 
	pdc->DPtoLP (&s); 
 
	POSITION pos,ps; 
	CRect rect; 
    for( pos =psList.GetHeadPosition(); pos != NULL; ) 
    { 
		ps=psList.GetNext (pos); 
		pDraw=pDoc->drawList.GetAt (ps); 
		pDraw->Offset (s); 
		pDraw->Draw (pdc); 
    } 
 
	LONG left,top,right,bottom; 
	left=m_rect.leftm_rect2.right?m_rect.right:m_rect2.right; 
	bottom=m_rect.bottom>m_rect2.bottom?m_rect.bottom:m_rect2.bottom; 
	rect.SetRect (left,top,right,bottom); 
	pdc->DPtoLP (rect); 
	rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
	rect.InflateRect (10,10); 
	InvalidateRect (rect); 
} 
 
CRect CmischatView::GetGroupSelectOutSide(CDC* pdc) 
{ 
	LONG left,top,right,bottom; 
	POSITION pos,ps; 
	CRect rect; 
	pos =psList.GetHeadPosition(); 
	if(pos){ 
		ps=psList.GetNext (pos); 
		pDraw=pDoc->drawList.GetAt (ps); 
		rect=pDraw->GetOutside (pdc); 
		left=rect.left ; 
		top=rect.top ; 
		right=rect.right ; 
		bottom=rect.bottom ; 
	} 
 
	while(pos) 
	{ 
		ps=psList.GetNext (pos); 
		pDraw=pDoc->drawList.GetAt (ps); 
		rect=pDraw->GetOutside (pdc); 
		left=rect.leftright?rect.right:right; 
		bottom=rect.bottom>bottom?rect.bottom:bottom; 
	} 
 
	rect.SetRect (left,top,right,bottom); 
	return rect; 
} 
 
void CmischatView::SaveCurDraw(CBCGPProp*pProp) 
{ 
	if(isSelected && pDrawSelect!=NULL) 
	{ 
		CClientDC dc(this); 
		CRect rect,rect1,rect2; 
		rect1=pDrawSelect->GetOutside (&dc); 
		CString strName; 
		strName=pProp->GetName ();			 
		if(pDrawSelect->IsKindOf (RUNTIME_CLASS(CCurve))) 
		{ 
			CCurve* p=(CCurve*)pDrawSelect; 
			if(strName==_T("对象笔粗")) p->m_width=pProp->GetValue ().intVal; 
			if(strName==_T("对象颜色")) p->m_crColor=(COLORREF)pProp->GetValue ().lVal ; 
		} 
		if(pDrawSelect->IsKindOf (RUNTIME_CLASS(CLine))) 
		{ 
			CLine* p=(CLine*)pDrawSelect; 
			if(strName==_T("对象笔粗")) p->m_width=pProp->GetValue ().intVal; 
			if(strName==_T("对象颜色")) p->m_crColor=(COLORREF)pProp->GetValue ().lVal ; 
		} 
		if(pDrawSelect->IsKindOf (RUNTIME_CLASS(CText))) 
		{ 
			CText* p=(CText*)pDrawSelect; 
			if(strName==_T("对象字体")){ 
				CBCGPFontProp* pf=(CBCGPFontProp*)pProp; 
				p->m_crColor=pf->GetColor (); 
				p->m_lf=*pf->GetLogFont (); 
			} 
			if(strName==_T("对象文字")) p->m_strText=pProp->GetValue ().bstrVal; 
		} 
		if(pDrawSelect->IsKindOf (RUNTIME_CLASS(CRectangle))) 
		{ 
			CRectangle * p=(CRectangle *) pDrawSelect; 
			if(strName==_T("对象笔粗")) p->m_width=pProp->GetValue ().intVal; 
			if(strName==_T("对象颜色")) p->m_crPen=(COLORREF)pProp->GetValue ().lVal ; 
			if(strName==_T("对象填充色")) p->m_crBrush=(COLORREF)pProp->GetValue ().lVal ;	 
		} 
		if(pDrawSelect->IsKindOf (RUNTIME_CLASS(CEllipse))) 
		{ 
			CEllipse* p=(CEllipse *) pDrawSelect; 
			if(strName==_T("对象笔粗")) p->m_width=pProp->GetValue ().intVal; 
			if(strName==_T("对象颜色")) p->m_crPen=(COLORREF)pProp->GetValue ().lVal ; 
			if(strName==_T("对象填充色")) p->m_crBrush=(COLORREF)pProp->GetValue ().lVal ; 
		} 
		rect2=pDrawSelect->GetOutside (&dc); 
 
		LONG left,top,right,bottom; 
		left=rect1.leftrect2.right?rect1.right:rect2.right; 
		bottom=rect1.bottom>rect2.bottom?rect1.bottom:rect2.bottom; 
		rect.SetRect (left,top,right,bottom); 
		rect.OffsetRect(-m_nHScrollPos,-m_nVScrollPos); 
		rect.InflateRect (10,10); 
		InvalidateRect (rect);	 
	} 
}