www.pudn.com > WBDraw.rar > MyWnd.cpp


// MyWnd.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "resource.h" 
#include  
#include "MyWnd.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// MyWnd 
 
 
struct TOOLBARCMD{ 
	int icmd;int idx;char m_str[10];int m_icon;char strText[20]; 
}; 
 
TOOLBARCMD g_Dcmd[]= 
{ 
	{ID_LINE1,0,"LE",IDC_LINE,"直线"}, 
	{ID_PEN,1,"PN",IDC_PAINT,"画笔"}, 
	{ID_ELLPLE,2,"EL",IDC_ELLPLE,"画圆"}, 
	{ID_ELLFILL,3,"EF",IDC_ELLFILL,"填充圆"}, 
	{ID_RECT,4,"RT",IDC_RECT,"画框"}, 
	{ID_RECTFILL,5,"RF",IDC_RECTFILL,"填充框"}, 
	{ID_TEXT1,6,"TE",IDC_TEXT1,"文字"}, 
	{ID_ERASE,7,"ER",IDC_ERASE,"橡皮擦"}, 
	{ID_COPYSCRN,8,"CS",IDC_COPYSCRN,"截屏"}, 
	{ID_SAVEWB,9,"SW",0,"保存"}, 
	{ID_COLOR,10,"CR",0,"颜色"}, 
}; 
 
MyWnd::MyWnd() 
{ 
	m_bRun = FALSE; 
	m_hPen = CreatePen(PS_SOLID, 1, 0); 
	m_hBrush=CreateHatchBrush(HS_BDIAGONAL,0); 
} 
 
MyWnd::~MyWnd() 
{ 
	if(m_hPen){ 
		DeleteObject(m_hPen); 
	} 
 
	if(m_hBrush){ 
		DeleteObject(m_hBrush); 
	} 
} 
 
 
BEGIN_MESSAGE_MAP(MyWnd, CWnd) 
	//{{AFX_MSG_MAP(MyWnd) 
	ON_WM_MOUSEMOVE() 
	ON_WM_PAINT() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_COMMAND(ID_LINE, OnLine) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_HAND, OnHand) 
	ON_WM_SIZE() 
	ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify ) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// MyWnd message handlers 
 
BOOL MyWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)  
{ 
	HDC		hdc; 
	hdc = ::GetDC(pParentWnd->m_hWnd);	 
	m_hMemDC = ::CreateCompatibleDC(hdc); 
	::GetClientRect(pParentWnd->m_hWnd, &m_ClientRect); 
 
	m_ClientRect.right	=1024; 
	m_ClientRect.bottom	=768; 
	m_ClientRect.left	=0; 
	m_ClientRect.top	=0; 
 
	bFlag =			FALSE; 
	m_PenWidth =	0; 
	m_nIconMode =   IDC_PAINT; 
	m_nMouseMode =	ID_PEN; 
	m_bSelecting=	FALSE; 
	m_mycolor =		RGB(0, 0, 0); 
	m_PenWidth =	0; 
	m_bShowEdit=	false; 
	g_pCallBackInterface =NULL; 
 
	m_hBitmap = ::CreateCompatibleBitmap(hdc, m_ClientRect.right-m_ClientRect.left, m_ClientRect.bottom-m_ClientRect.top); 
	::ReleaseDC(pParentWnd->m_hWnd, hdc); 
	::SelectObject(m_hMemDC, m_hBitmap); 
	::FillRect(m_hMemDC, &m_ClientRect, HBRUSH(RGB(0xFF,0xFF,0xFF)));	 
 
	BOOL bRetCode=CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);//CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); 
	CRect m_CRect(rect.left-10,rect.top,rect.right,rect.bottom); 
	MoveWindow(m_CRect,true); 
	return bRetCode; 
} 
 
void MyWnd::RegCallBackFun(WBCallBackInterface *pCallBack) 
{ 
	g_pCallBackInterface = pCallBack; 
} 
 
void MyWnd::OnPaint()  
{ 
	HDC			hdc; 
	BITMAP		bm; 
	PAINTSTRUCT ps; 
 
    ::SelectObject(m_hMemDC, m_hBitmap); 
    hdc = ::BeginPaint(m_hWnd, &ps); 
	::GetObject(m_hBitmap, sizeof(bm), &bm); 
	::BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,m_hMemDC,0,0,SRCCOPY); 
    ::EndPaint(m_hWnd, &ps);	 
} 
 
void MyWnd::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	HPEN		oldpen; 
	HBRUSH		oldhBrush; 
 
	SetCursor(AfxGetApp()->LoadCursor(m_nIconMode)); 
	if(m_bSelecting&&(nFlags == MK_LBUTTON)){ 
		switch(m_nMouseMode){ 
		case ID_LINE1: 
			{ 
				m_nIconMode = IDC_LINE; 
				oldpen = (HPEN)SelectObject(m_hMemDC,m_hPen); 
				SelectObject(m_hMemDC,m_hPen); 
				SetROP2(m_hMemDC,R2_NOTXORPEN); 
				MoveToEx(m_hMemDC,m_StartPoint.x, m_StartPoint.y,NULL); 
				LineTo(m_hMemDC,m_oldpoint.x, m_oldpoint.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				MoveToEx(m_hMemDC,m_StartPoint.x, m_StartPoint.y,NULL); 
				LineTo(m_hMemDC,m_oldpoint.x, m_oldpoint.y); 
				SelectObject(m_hMemDC,oldpen); 
			} 
			break; 
		case ID_PEN: 
			{ 
				oldpen = (HPEN)SelectObject(m_hMemDC,m_hPen); 
				SelectObject(m_hMemDC,m_hPen); 
				MoveToEx(m_hMemDC,m_oldpoint.x, m_oldpoint.y,NULL); 
				LineTo(m_hMemDC,point.x, point.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				if(m_wrtPacket.getSize()>6000){ 
					m_wrtPacket<<(uint32)point.x; 
					m_wrtPacket<<(uint32)point.y; 
 
					if(g_pCallBackInterface){ 
						g_pCallBackInterface->callbackSendMsg((unsigned char *)m_wrtPacket.getData() , m_wrtPacket.getSize() ) ; 
					} 
 
					m_wrtPacket.Reset(); 
					m_wrtPacket<<(uint32)m_nMouseMode; 
					m_wrtPacket<<(uint32)point.x; 
					m_wrtPacket<<(uint32)point.y; 
					m_wrtPacket<<(uint32)m_mycolor; 
					m_wrtPacket<<(uint32)m_PenWidth; 
				} 
				else 
				{ 
					m_wrtPacket<<(uint32)point.x; 
					m_wrtPacket<<(uint32)point.y; 
				} 
				SelectObject(m_hMemDC,oldpen); 
			} 
			break; 
		case ID_ELLPLE: 
			{ 
				oldpen = (HPEN)SelectObject(m_hMemDC,m_hPen); 
				SelectObject(m_hMemDC,m_hPen);	 
				SetROP2(m_hMemDC,R2_NOTXORPEN); 
	       		Ellipse(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				Ellipse(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
				SelectObject(m_hMemDC,oldpen); 
			} 
			break; 
		case ID_TEXT1: 
		case ID_ERASE: 
			{ 
				HPEN pen1=CreatePen(PS_DOT, 1, RGB(0,0,0)); 
				oldpen = (HPEN)SelectObject(m_hMemDC,pen1); 
				SelectObject(m_hMemDC,pen1);	 
				SetROP2(m_hMemDC,R2_NOTXORPEN); 
	       		Rectangle(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				Rectangle(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
				SelectObject(m_hMemDC,oldpen); 
				DeleteObject(pen1); 
			} 
			break; 
		case ID_RECT: 
			{ 
				oldpen = (HPEN)SelectObject(m_hMemDC,m_hPen); 
				SelectObject(m_hMemDC,m_hPen);	 
				SetROP2(m_hMemDC,R2_NOTXORPEN); 
	       		Rectangle(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				Rectangle(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
				SelectObject(m_hMemDC,oldpen); 
			} 
			break; 
		case ID_RECTFILL: 
			{ 
				oldhBrush=CreateHatchBrush(WHITE_BRUSH,RGB(255,255,255)); 
				SelectObject(m_hMemDC,m_hBrush); 
				SetROP2(m_hMemDC,R2_NOTXORPEN); 
				Rectangle(m_hMemDC,m_StartPoint.x,m_StartPoint.y,m_oldpoint.x,m_oldpoint.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				Rectangle(m_hMemDC,m_StartPoint.x,m_StartPoint.y,m_oldpoint.x,m_oldpoint.y); 
				SelectObject(m_hMemDC,oldhBrush); 
				 
			} 
			break; 
		case ID_ELLFILL: 
			{ 
				oldhBrush=CreateHatchBrush(WHITE_BRUSH,RGB(255,255,255)); 
				SelectObject(m_hMemDC,m_hBrush); 
				SetROP2(m_hMemDC,R2_NOTXORPEN); 
				Ellipse(m_hMemDC,m_StartPoint.x,m_StartPoint.y,m_oldpoint.x,m_oldpoint.y); 
				m_oldpoint.x=point.x; 
				m_oldpoint.y=point.y; 
				Ellipse(m_hMemDC,m_StartPoint.x,m_StartPoint.y,m_oldpoint.x,m_oldpoint.y); 
				SelectObject(m_hMemDC,oldhBrush); 
			} 
			break; 
		} 
 
		RECT rect; 
		GetWindowRect(&rect); 
		ScreenToClient(&rect); 
		rect.top=rect.top+35; 
		InvalidateRect(&rect); 
		//Invalidate(FALSE); 
	} 
	 
	CWnd::OnMouseMove(nFlags, point); 
} 
 
void MyWnd::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	SetCursor(AfxGetApp()->LoadCursor(m_nIconMode)); 
	m_StartPoint=m_oldpoint = point; 
 
	if(m_nMouseMode == ID_TEXT1 && !m_bRun){ 
		m_DEdit.Create(CRect(0,0,0,0),this,1); 
		m_bRun=true; 
	} 
 
	m_hPen = CreatePen(PS_SOLID, m_PenWidth, m_mycolor); 
	m_hBrush=CreateHatchBrush(HS_BDIAGONAL,m_mycolor); 
 
	SetCapture(); 
	m_bSelecting=TRUE; 
	m_wrtPacket.Reset(); 
	m_wrtPacket<<(uint32)m_nMouseMode; 
	m_wrtPacket<<(uint32)point.x; 
	m_wrtPacket<<(uint32)point.y; 
	m_wrtPacket<<(uint32)m_mycolor; 
	m_wrtPacket<<(uint32)m_PenWidth; 
	 
	CWnd::OnLButtonDown(nFlags, point); 
} 
 
void MyWnd::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	SetCursor(AfxGetApp()->LoadCursor(m_nIconMode)); 
	switch(m_nMouseMode) 
	{ 
	case ID_TEXT1: 
		{ 
			if(m_bShowEdit){ 
				::SendMessage(m_hWnd,ID_SETTEXT,0,0); 
			} 
			m_DEdit.MoveWindow(CRect(m_StartPoint,point)); 
			m_DEdit.SetWindowText(""); 
			m_DEdit.ShowWindow(SW_SHOW); 
			m_DEdit.SetFocus(); 
 
			HPEN pen=CreatePen(PS_DOT, 1, RGB(0,0,0)); 
			HPEN oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen);	 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
	       	Rectangle(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
			SelectObject(m_hMemDC,oldpen); 
			DeleteObject(pen); 
 
			m_bShowEdit=TRUE; 
		} 
		break; 
	case ID_ERASE: 
		{ 
			HPEN pen=CreatePen(PS_DOT, 1, RGB(0,0,0)); 
			HPEN oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen);	 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
	       	Rectangle(m_hMemDC,m_StartPoint.x, m_StartPoint.y,m_oldpoint.x, m_oldpoint.y); 
			SelectObject(m_hMemDC,oldpen); 
			DeleteObject(pen); 
 
			CRect m_pRect(m_StartPoint,m_oldpoint); 
			::FillRect(m_hMemDC,&m_pRect, HBRUSH(RGB(0xFF,0xFF,0xFF))); 
 
			m_wrtPacket<<(uint32)point.x; 
			m_wrtPacket<<(uint32)point.y; 
 
			if(g_pCallBackInterface){ 
				g_pCallBackInterface->callbackSendMsg((unsigned char *)m_wrtPacket.getData() , m_wrtPacket.getSize() ) ; 
			} 
			Invalidate(FALSE); 
		} 
		break; 
	default: 
		m_wrtPacket<<(uint32)point.x; 
		m_wrtPacket<<(uint32)point.y; 
		 
		if(g_pCallBackInterface){ 
			g_pCallBackInterface->callbackSendMsg((unsigned char *)m_wrtPacket.getData() , m_wrtPacket.getSize() ) ; 
		} 
		break; 
	} 
 
	if(m_hPen){ 
		DeleteObject(m_hPen); 
	} 
 
	if(m_hBrush){ 
		DeleteObject(m_hBrush); 
	} 
 
	ReleaseCapture(); 
	m_bSelecting=FALSE; 
	CWnd::OnLButtonUp(nFlags, point); 
} 
 
void MyWnd::OnLine()  
{	 
} 
 
LRESULT MyWnd::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	if(message==ID_SETTEXT){ 
		if(m_bShowEdit){ 
			CString cs; 
			m_DEdit.GetWindowText(cs); 
			m_bShowEdit=false; 
			m_DEdit.ShowWindow(SW_HIDE); 
			if(!cs.IsEmpty()){ 
				CDC * pdc=GetDC(); 
				CRect rt; 
				pdc->SetROP2(R2_WHITE); 
				m_DEdit.GetWindowRect(rt); 
				ScreenToClient(rt); 
				ValidateRect(rt);  
				::TextOut(m_hMemDC,rt.left,rt.top,cs,strlen(cs)); 
				ReleaseDC(pdc); 
				m_wrtPacket.Reset(); 
				m_wrtPacket<<(uint32)m_nMouseMode; 
				m_wrtPacket<<(uint32)rt.left<<(uint32)rt.top<callbackSendMsg((unsigned char *)m_wrtPacket.getData() , m_wrtPacket.getSize() ) ; 
				} 
				InvalidateRect(rt,true); 
			} 
		} 
		 
	}	 
	return CWnd::DefWindowProc(message, wParam, lParam); 
} 
 
BOOL MyWnd::DestroyWindow()  
{ 
	return CWnd::DestroyWindow(); 
} 
 
BOOL MyWnd::OnCommand(WPARAM wParam, LPARAM lParam)  
{ 
	for(int i=0;i<11;i++){ 
		if(g_Dcmd[i].icmd==wParam ){ 
			if(m_bShowEdit&& wParam!=ID_TEXT1){ 
				::SendMessage(m_hWnd,ID_SETTEXT,0,0); 
			} 
 
			switch(wParam) 
			{ 
			case ID_COLOR: 
				{ 
					CColorDialog dlg; 
					if(IDOK==dlg.DoModal()) 
					{ 
						m_mycolor=dlg.GetColor(); 
						DeleteObject(m_hPen); 
						m_hPen = CreatePen(PS_SOLID, 1, m_colors); 
					} 
				} 
				break; 
			case ID_SAVEWB: 
				{ 
					SaveWB(); 
				} 
				break; 
			default: 
				m_nMouseMode = wParam; 
				m_nIconMode = g_Dcmd[i].m_icon; 
			} 
			 
			break; 
		} 
	}	 
	return CWnd::OnCommand(wParam, lParam); 
} 
 
int MyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CWnd::OnCreate(lpCreateStruct) == -1) 
		return -1;	 
 
	int m_bitmapsize=32; 
	int image=0;				 
	int bid=ID_ARROW; 
	COLORREF mask=RGB(0,255,255); 
 
	m_BtList.Create(g_Dcmd[3].icmd,m_bitmapsize,m_bitmapsize,mask); 
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;     
	} 
	m_wndToolBar.ShowWindow(SW_SHOW); 
	RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);  
 
	//设置ToolBar的图标列表 
	m_ilTB.Create(24,24, TRUE | ILC_COLOR8, 8, 0); 
	HICON hIcon = NULL; 
 
 
	m_BtList.Create(24,24,ILC_COLOR32| ILC_MASK  ,0,32); 
	CToolBarCtrl& bar = m_wndToolBar.GetToolBarCtrl(); 
 
	for(int i=0;i<11;i++){ 
		m_BtList.Add(AfxGetApp()->LoadIcon(g_Dcmd[i].icmd)); 
	} 
	bar.SetImageList(&m_BtList); 
 
	return 0; 
} 
 
BOOL MyWnd::PreCreateWindow(CREATESTRUCT& cs)  
{	 
	if (!CWnd::PreCreateWindow(cs))	return FALSE; 
	return CWnd::PreCreateWindow(cs); 
} 
 
void MyWnd::SaveWB() 
{ 
	CClientDC	dc(this); 
	CDC 		memDC; 
	CRect		rect; 
	GetClientRect(rect); 
	memDC.CreateCompatibleDC(&dc); 
	CBitmap bm; 
	int Width = rect.Width(); 
	int Height = rect.Height(); 
	bm.CreateCompatibleBitmap(&dc, Width, Height); 
	CBitmap*  pOld = memDC.SelectObject(&bm); 
	memDC.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY); 
	memDC.SelectObject(pOld); 
	BITMAP  btm; 
	bm.GetBitmap(&btm); 
	DWORD  size = btm.bmWidthBytes * btm.bmHeight; 
	LPSTR lpData = (LPSTR)GlobalAllocPtr(GPTR, size); 
	BITMAPFILEHEADER   bfh; 
	BITMAPINFOHEADER  bih; 
	bih.biBitCount = btm.bmBitsPixel; 
	bih.biClrImportant = 0; 
	bih.biClrUsed = 0; 
	bih.biCompression = 0; 
	bih.biHeight = btm.bmHeight; 
	bih.biPlanes = 1; 
	bih.biSize = sizeof(BITMAPINFOHEADER); 
	bih.biSizeImage = size; 
	bih.biWidth = btm.bmWidth; 
	bih.biXPelsPerMeter = 0; 
	bih.biYPelsPerMeter = 0; 
	GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); 
	bfh.bfReserved1 = bfh.bfReserved2 = 0; 
	bfh.bfType = ((WORD)('M'<< 8)|'B'); 
	bfh.bfSize = 54 + size; 
	bfh.bfOffBits = 54; 
	 
	CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|")); 
	if (dlg.DoModal()!=IDOK) 
		return; 
	 
	CFile  bf; 
	 
	CString ss=dlg.GetPathName(); 
	if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite)) 
	{ 
		bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER)); 
		bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER)); 
		bf.WriteHuge(lpData, size); 
		bf.Close(); 
		AfxMessageBox((LPCTSTR)"保存成功",MB_OK); 
	} 
	GlobalFreePtr(lpData); 
} 
 
 
void MyWnd::DrawMsg(long m_SendMsg, short m_nLen)  
{ 
	CReadPacket rdPacket((char *)m_SendMsg,m_nLen); 
 
	rdPacket.getData(); 
 
	unsigned long		nType ; 
	unsigned long		PenWidth; 
	unsigned long		nBeginPosX; 
	unsigned long		nBeginPosY; 
	unsigned long		nEndPosX; 
	unsigned long		nEndPosY; 
	unsigned long		nPosX,nPosY ; 
 
	rdPacket>>nType; 
 
	COLORREF	cColor; 
	HPEN		pen,oldpen; 
	HBRUSH		hBrush,oldhBrush; 
	char*		m_textstr; 
 
	if( nType==ID_TEXT1 ){ 
		rdPacket>>(uint32&)nPosX >> (uint32&)nPosY >>m_textstr ; 
	} 
	else{ 
		rdPacket>>(uint32&)nBeginPosX ; 
		rdPacket>>(uint32&)nBeginPosY ; 
		rdPacket>>(uint32&)cColor ; 
		rdPacket>>(uint32&)PenWidth ; 
		rdPacket>>(uint32&)nEndPosX ; 
		rdPacket>>(uint32&)nEndPosY ; 
	} 
	pen = CreatePen(PS_SOLID, PenWidth, cColor); 
 
	switch(nType){ 
	case ID_TEXT1: 
		{ 
			if(strlen(m_textstr)>0){ 
				::TextOut(m_hMemDC,nPosX,nPosY,m_textstr,strlen(m_textstr)); 
				Invalidate(FALSE); 
			} 
		} 
		break; 
	case ID_PEN: 
		{ 
			CPoint cp,cp1; 
			cp1.x=-1; 
			pen=CreatePen(PS_SOLID, PenWidth,cColor); 
			oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen); 
			MoveToEx(m_hMemDC,nBeginPosX, nBeginPosY,NULL); 
			while(1){				 
				rdPacket>>(uint32&)cp1.x>>(uint32&)cp1.y; 
				if((cp1.x==0) && (cp1.y==0)){ 
					LineTo(m_hMemDC,cp.x,cp.y); 
					break; 
				} 
				else{ 
					cp=cp1; 
				} 
				LineTo(m_hMemDC,cp1.x,cp1.y); 
				MoveToEx(m_hMemDC,cp1.x, cp1.y,NULL); 
				cp1.x=-1; 
			} 
			SelectObject(m_hMemDC,oldpen); 
		} 
		break; 
	case ID_LINE1: 
		{ 
			oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen); 
			MoveToEx(m_hMemDC,nBeginPosX, nBeginPosY,NULL); 
			LineTo(m_hMemDC,nEndPosX, nEndPosY ); 
			SelectObject(m_hMemDC,oldpen); 
		} 
		break; 
	case ID_ELLPLE: 
		{ 
			oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen);	 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
			Ellipse(m_hMemDC,nBeginPosX, nBeginPosY,nEndPosX, nEndPosY); 
			SelectObject(m_hMemDC,oldpen); 
		} 
		break; 
	case ID_RECT: 
		{ 
			oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen);	 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
			Rectangle(m_hMemDC,nBeginPosX, nBeginPosY,nEndPosX, nEndPosY); 
			SelectObject(m_hMemDC,oldpen); 
		} 
		break; 
	case ID_RECTFILL: 
		{ 
			hBrush=CreateHatchBrush(3,cColor); 
			oldhBrush=CreateHatchBrush(WHITE_BRUSH,RGB(255,255,255)); 
			SelectObject(m_hMemDC,hBrush); 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
			Rectangle(m_hMemDC,nBeginPosX, nBeginPosY,nEndPosX, nEndPosY); 
			SelectObject(m_hMemDC,oldhBrush); 
		} 
		break; 
	case ID_ERASE: 
		{ 
			pen=CreatePen(PS_DOT, 1, RGB(0,0,0)); 
			oldpen = (HPEN)SelectObject(m_hMemDC,pen); 
			SelectObject(m_hMemDC,pen);	 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
	       	Rectangle(m_hMemDC,nBeginPosX, nBeginPosY,nEndPosX, nEndPosY); 
			SelectObject(m_hMemDC,oldpen); 
			DeleteObject(pen); 
 
			CRect m_pRect(nBeginPosX, nBeginPosY,nEndPosX, nEndPosY); 
			::FillRect(m_hMemDC,&m_pRect, HBRUSH(RGB(0xFF,0xFF,0xFF))); 
		} 
		break; 
	case ID_ELLFILL: 
		{ 
			hBrush=CreateHatchBrush(3,cColor); 
			oldhBrush=CreateHatchBrush(WHITE_BRUSH,RGB(255,255,255)); 
			SelectObject(m_hMemDC,hBrush); 
			SetROP2(m_hMemDC,R2_NOTXORPEN); 
			Ellipse(m_hMemDC,nBeginPosX, nBeginPosY,nEndPosX, nEndPosY); 
			SelectObject(m_hMemDC,oldhBrush); 
		} 
		break; 
	} 
 
	DeleteObject(pen); 
	DeleteObject(hBrush); 
 
	RECT rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect); 
	rect.top=rect.top+35; 
	InvalidateRect(&rect); 
} 
 
void MyWnd::OnHand()  
{	 
} 
 
void MyWnd::OnSize(UINT nType, int cx, int cy)  
{ 
	CWnd::OnSize(nType, cx, cy);	 
} 
 
BOOL MyWnd::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult ) 
{ 
	TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
	UINT nID =pNMHDR->idFrom; 
 
	for(int i=0;i<11;i++){ 
		if(g_Dcmd[i].icmd==nID ){ 
			strcpy(pTTT->lpszText,(LPCSTR)g_Dcmd[i].strText); 
			pTTT->hinst = AfxGetResourceHandle(); 
			return TRUE; 
		} 
	}	 
	return FALSE; 
}