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);
}
}