要建立一个多文档程序。
使用一个对话框来接收圆的圆心和半经,点击“确定”按钮以后可以在当前的窗口中画出这个圆。如果再次输入,则在一个新的窗口中画出第二次输入参数的圆。依此类推,输入多少组数据就打开几个窗口画出这些圆。最好能有源代码。

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc.asp?id=440
    一个基于UDP的网络通迅程序
    作者:刘永超下载本文配套源代码我们知道TCP/IP协议是至今发展最为成功的协议之一,也是整个互联网的基础。它在传输层有两个不同的协议:TCP和UDP,用途都很广泛,下面我就UDP做一个示例程序。整个例子有两个程序组成,一个发送数据,另一个程序接收数据后,完成绘图工作。本文程序运行效果图如下: 一、发送程序
    首先建立数据发送程序(Fason)。一共发送四个数据:圆心的X坐标、圆心的Y坐标、圆半径R、圆的颜色。它的实现主要如下: void CFasonDlg::OnSend() 
    {
    UpdateData(TRUE);
    CString m_Getstring;

    this->m_Cob.GetLBText(m_Cob.GetCurSel(),m_Getstring);
    if(m_Getstring==_T("Red"))
    yuan1.color=1;
    if(m_Getstring==_T("Green"))
    yuan1.color=2;
    if(m_Getstring==_T("Blue"))
    yuan1.color=3;
    yuan1.x=m_x;
    yuan1.y=m_y;
    yuan1.r=m_r; p=&yuan1; CDSocket m_hSocket;
    m_hSocket.Create(2330,SOCK_DGRAM);
    m_hSocket.SendTo( p,sizeof(yuan1),3550,"127.0.0.1");//用结构体发送。    m_x=0;
        m_y=0;
        m_r=0;
        m_hSocket.Close();
        UpdateData(FALSE);
    }
    发送数据时有一个技巧,就是所有数据放在一个结构体中来发送,不用一个一个发送。但是不能在结构体中包含CString等可以变长的数据类型。二、接收程序 
    下面我们看一下接收数据端的程序(Jieshou)。如下: void CDASocket::OnReceive(int nErrorCode) 
    {
    char buff[256];
    int ret=0;
    ret=Receive(buff,256);
    if(ret==ERROR)
    {
    TRACE("ERROR!");
    }
    else 
    m_pDoc->Presscessding(buff);
    class CAsyncSocket::OnReceive(nErrorCode);
    }三、数据处理与显示
    我们设计程序时,数据通常在文档中处理,显示工作在视图中完成。当整个程序较小时,这感觉不到有何好处,但整个程序较大时,程序的条理就会较清晰,易读性好。所以一定要时时养成良好的设计习惯。数据在文档中处理如下:void CJieshouDoc::Presscessding(char* lbuff)
    {
    buff=(struct yuan*)lbuff;
    p.x=buff->x; p.y=buff->y;
    p.r=buff->r;
    p.color=buff->color;
    UpdateAllViews(NULL);
    }
    在视图中的显示如下: void CJieshouView::OnDraw(CDC* pDC)
    {
    CJieshouDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    x=pDoc->p.x;
    y=pDoc->p.y;
    r=pDoc->p.r;
    if(pDoc->p.color==1)
    pDC->SelectObject(new CBrush(RGB(255,0,0)));
    if(pDoc->p.color==2)
    pDC->SelectObject(new CBrush(RGB(0,255,0)));
    if(pDoc->p.color==3)
    pDC->SelectObject(new CBrush(RGB(0,0,255)));

      pDC->Ellipse(x-r,y-r,x+r,y+r);
    }http://www.vckbase.com/code/downcode.asp?id=1657
      

  2.   

    在程序中加一个文档模板;
    class CMyApp : public CWinApp
    {
    public:
    CMyApp(); //文档模板
    CMultiDocTemplate*   m_pMyTemplate;
    .......
    BOOL CSPSAPApp::InitInstance()
    {
    .... m_pMyTemplate = new CMultiDocTemplate(
    IDR_SPSAPTYPE,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMyView));
    AddDocTemplate(m_pMyTemplate);
    ....}作一个模态对话,在OnOk函数中加上:
            //获得当前文档
    CMDIChildWnd* pActiveChild = pmain->MDIGetActive();
    CDocument* pDocument;
    if (pActiveChild == NULL ||
      (pDocument = pActiveChild->GetActiveDocument()) == NULL)
    {
    TRACE0("Warning: No active document for WindowNew command.\n");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    return;     // command failed
    } CDocTemplate* pTemplate;
             pTemplate = ((CSPSAPApp*)AfxGetApp())->m_pMyTemplate;
             ASSERT_VALID(pTemplate);
    CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
    if (pFrame == NULL)
    {
    TRACE0("Warning: failed to create new frame.\n");
    return;     // command failed
    } pTemplate->InitialUpdateFrame(pFrame, pDocument);
    待续。
      

  3.   

    还在OnOk函数中:
    CMyDoc* pDoc = (CMyDoc*)pDocument;
    pDoc->m_arrCenterPoints.Add(m_CenterPoint);//m_CenterPoint是对话框的成员变量
    pDoc->m_arrRadii.Add(m_Radius);//m_Radius是对话框的成员变量在文档类中加两个动态数组:
    CArray<CPoint,CPoint&> m_arrCenterPoints;
    CUIntArray             m_arrRadii;在视图类的ondraw函数中:
    int nCount = pDoc->m_arrCenterPoints.GetSize();
    if ( nCount > 0 )
    {
        CPoint point = pDoc->m_arrCenterPoints.GetAt(nCount-1);
        int Radius = pDoc->m_arrRadii.GetAt(nCount-1);
       //画圆。}上面的代码是凭空想的,没有作实验,你先试试,有问题再讨论