⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baizheshudlg.cpp

📁 用VC编写的一个树生成的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
       ViewX=0.7*10/2*0.1;

       ViewY=0.2;
       p[0].x= long(Dialog.x*ViewX);
       p[0].y=long(Dialog.y*ViewY);
       pbr=dc.SelectObject(&br);
       dc.Ellipse(p[0].x-r,p[0].y-r,p[0].x+r,p[0].y+r); // 画圆
       dc.SelectObject(pbr);
       int d=1;
       ViewY=3*0.1;
       for(i=1;i<t;i++)
	   {
            for(j=1;j<=pow(2,(i-1));j++)
			{  
		         ViewX=0.7*10/(pow(2,(i-1))+1)*0.1;
                 p[d].x= long(Dialog.x*ViewX*j);
                 p[d].y=long(Dialog.y*(ViewY+i*0.1-0.1));     
	             if(i==3&&j!=1)
				 {
				  pbr=dc.SelectObject(&br1);
                  dc.Rectangle(p[d].x-r,p[d].y-r,p[d].x+r,p[d].y+r); // 画圆
                  d++;
		          dc.SelectObject(pbr);
				 }
		         else
				 { 
				  pbr=dc.SelectObject(&br);
                  dc.Ellipse(p[d].x-r,p[d].y-r,p[d].x+r,p[d].y+r); // 画圆
                  d++;
		          dc.SelectObject(pbr);
				 }//end else
			}//end for
	   }//end for
       double k;
       k=pow(2,(t-1));
       int q=1;
       while(k<=9)
	   {        

         ViewX=0.7*10/(pow(2,(t-1))+1)*0.1;
		 if(d==8)
         {
		 p[d].x=long(Dialog.x*ViewX*q-20);
         p[d].y=long(Dialog.y*(ViewY+i*0.1-0.1));
		 }
		 else
		 {
		 p[d].x=long(Dialog.x*ViewX*q+30);
         p[d].y=long(Dialog.y*(ViewY+i*0.1-0.1));
		 }

         pbr=dc.SelectObject(&br1);
         dc.Rectangle(p[d].x-r,p[d].y-r,p[d].x+r,p[d].y+r); // 画圆
         dc.SelectObject(pbr);
         k=k+1;
		 q++;
		 d++;
	   }
       int h,f,w;
       dc.MoveTo(p[0].x,p[0].y+r); // 由两顶点的圆周起画边
       dc.LineTo(p[1].x,p[1].y-r);
       for(w=1;w<=9;w++)
	   {
	     if(2*w<=9)
		 {  
		
	      int v;
          v=2*w;
          X=p[v].x-p[w].x;
          Y=p[v].y-p[w].y;
          R=sqrt(X*X+Y*Y); // 边的长度,由顶点中心算起
          h=int(r*X/R); // 按以上倾角,圆心到圆周水平、垂直的距离
          f=int(r*Y/R);
          dc.MoveTo(p[w].x+h,p[w].y+f); // 由两顶点的圆周起画边
	      dc.LineTo(p[v].x-h,p[v].y-f);
		 }
	   }
       for(w=1;w<=9;w++)
	   {
	      if((2*w+1)<=9)
		  {  
		
	        int v;
            v=2*w+1;
            X=p[v].x-p[w].x;
            Y=p[v].y-p[w].y;
            R=sqrt(X*X+Y*Y); // 边的长度,由顶点中心算起
            h=int(r*X/R); // 按以上倾角,圆心到圆周水平、垂直的距离
            f=int(r*Y/R);
            dc.MoveTo(p[w].x+h,p[w].y+f); // 由两顶点的圆周起画边
	        dc.LineTo(p[v].x-h,p[v].y-f);
	        for(i=0;i<=4;i++)
	        c[i].center=p[i];
	        b[0].center=p[5];
	        b[1].center=p[6];
	        b[2].center=p[7];
	        b[3].center=p[8];
	        b[4].center=p[9];
		  }
	   }

       CString s,s1;
      for(i=0;i<5;i++)//在非叶子结点旁边输出标记
	  {
        s="ls[";
        s1.Format("%d", i);
        s=s+s1+"]"; 
        dc.TextOut(c[i].center.x-40,c[i].center.y-10,s);
	  }
       for(i=0;i<5;i++)//在叶子结点旁边输出标记
	   {
         s="b[";
         s1.Format("%d", i);
         s=s+s1+"]"; 
         dc.TextOut(b[i].center.x-40,b[i].center.y-10,s);
	   }
       for(i=0;i<5;i++)//在列表控件旁边输出标记
	   {
         s="有序文件";
         s1.Format("%d", i);
         s=s+s1;
		 if(i==0)
         dc.TextOut(b[i].center.x+10,b[3].center.y+40,s);
		 else
		 
         dc.TextOut(b[i].center.x-10,b[3].center.y+40,s);

	   }
	   s="排序后大文件";
	   dc.TextOut(c[0].center.x+480,c[0].center.y-100,s);

    CDialog::OnPaint();
	}


}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CBaizheshuDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}



 

void CBaizheshuDlg::K_Merge()
{	CWnd *pWnd=AfxGetApp()->m_pMainWnd;
	CDC *ClientDC;
    ClientDC=pWnd->GetDC();
    ClientDC->SetBkColor(RGB(0,255,255));//背景颜色
	CString str1,str2;
    int t=m_pOwner->m_ss.GetPos(); 
   // t=m_pOwner->m_ss.GetPos();//使TIME得到slider控件的数据
	int i,j;
    for(i=0;i<5;i++)
	{
	input(i,b[i].key);
    setcolor(i);//设置第一行的颜色
    str1.Format("%d",b[i].key);
    ClientDC->TextOut(b[i].center.x-10,b[i].center.y-5,str1);//将关键字写到叶子结点
	}
    CreateLoserTree();
    while(b[ls[0]].key!=999)
	{
	 j=ls[0];
     output();//将胜者输出到代表大文件的列表中
     setcolor(j);
     ::Sleep(t);
     input(j,b[j].key);
	 str1.Format("%d",b[j].key);
     ClientDC->TextOut(b[j].center.x-10,b[j].center.y-5,str1);
     Adjust(j);
	}
    output();
}

void CBaizheshuDlg::input(int i, int &a)//将列表的第一行的关键字赋值给a
{
 CString Str1;
 
 
	switch(i)
	{ 
 case  0:
		
    Str1=m_pOwner->m_MyList3.GetItemText(0,0);//取列表控件第0行第0列的内容
	a=atoi((LPCTSTR)Str1);

	break;
case  1:
	Str1=m_pOwner->m_MyList4.GetItemText(0,0);
	a=atoi((LPCTSTR)Str1);
    
	break;
case  2:
	Str1=m_pOwner->m_MyList5.GetItemText(0,0);
	a=atoi((LPCTSTR)Str1);
    
	break;
case  3:
	Str1=m_pOwner->m_MyList1.GetItemText(0,0);
	a=atoi((LPCTSTR)Str1);
     
	break;
case  4:
	Str1=m_pOwner->m_MyList2.GetItemText(0,0);
	a=atoi((LPCTSTR)Str1);
   
	break;


	}
}
 
void CBaizheshuDlg::Adjust(int s) //沿从叶子结点b[s]到根结点ls[0]的路径调整败者树
{
 int i;
 CWnd *pWnd=AfxGetApp()->m_pMainWnd;
 CDC *ClientDC;
 ClientDC=pWnd->GetDC();
 ClientDC->SetTextAlign(TA_CENTER); 
 ClientDC->SetBkColor(RGB(245,73,99));
 CBrush br,br1,*pbr;
 br.CreateSolidBrush(RGB(0,255,0));
 br1.CreateSolidBrush(RGB(245,73,99));
 CString str;
 int T=m_pOwner->m_ss.GetPos(); 
 tt=(s+5)/2;//ls[tt]是b[s]的双亲结点
  while (tt>0)
  {
  	if(b[s].key>b[ls[tt]].key)
  	{ i=s;
  	s=ls[tt]; //s指示新的胜者
  	ls[tt]=i;

    str.Format("%d",ls[tt]);//用RGB(0,255,0)重画有变化的非叶子结点
    pbr=ClientDC->SelectObject(&br);
    ClientDC->Ellipse(c[tt].center.x-r,c[tt].center.y-r,c[tt].center.x+r,c[tt].center.y+r); // 画圆
    ClientDC->SelectObject(pbr);
    AfxBeginThread(ThreadProc4,hWnd); // ThreadProc3()结束时调用ThreadProc4()
    
	::Sleep(T*3);

    pbr=ClientDC->SelectObject(&br1);//再用原来的颜色RGB(245,73,99)画有变化的非叶子结点
    ClientDC->Ellipse(c[tt].center.x-r,c[tt].center.y-r,c[tt].center.x+r,c[tt].center.y+r); // 画圆
    ClientDC->SelectObject(pbr);
    ClientDC->TextOut(c[tt].center.x,c[tt].center.y,str);
	}
  	tt=tt/2; 
  }
   ls[0]=s; 
   str.Format("%d",ls[0]);
   ClientDC->TextOut(c[0].center.x,c[0].center.y,str);

}

void CBaizheshuDlg::CreateLoserTree()//创建败者树
{int i;
 CWnd *pWnd=AfxGetApp()->m_pMainWnd;
 CDC *ClientDC;
 ClientDC=pWnd->GetDC();
 ClientDC->SetBkColor(RGB(245,73,99));
 ClientDC->SetTextAlign(TA_CENTER); 
 CString str;
 b[5].key=0;
 for(i=0;i<5;++i)
 {
	 ls[i]=5;//为败者树赋初值
     str.Format("%d",ls[i]);
     ClientDC->TextOut(c[i].center.x,c[i].center.y,str);
 }
     for(i=4;i>=0;--i)
     Adjust(i);

}

void CBaizheshuDlg::output()//将一次归并之后的胜者输出到代表大文件的列表控件中
{   int pos;
    int   i=ls[0];
    CString str;
	CWnd *pWnd=AfxGetApp()->m_pMainWnd;
    CDC *ClientDC;
    ClientDC=pWnd->GetDC();
	ClientDC->SelectStockObject(NULL_BRUSH); // 设置图形填充为透明
    CPen pen,*p_pen,pen1;
    pen.CreatePen(PS_SOLID|PS_ENDCAP_SQUARE  ,1,RGB(255,255,204));//创建背景色画笔
    pen1.CreatePen(PS_SOLID|PS_ENDCAP_SQUARE|PS_JOIN_BEVEL|PS_USERSTYLE|PS_INSIDEFRAME,1,RGB(255,0,0));//创建黑色画笔
    p_pen=ClientDC->SelectObject(&pen1);
    ClientDC->MoveTo(c[0].center.x,c[0].center.y+20);//连接线
    ClientDC->LineTo(b[i].center.x+10,b[i].center.y-20);
    ClientDC->SelectObject(p_pen);
	::Sleep(300);
    p_pen=ClientDC->SelectObject(&pen);
    ClientDC->MoveTo(c[0].center.x,c[0].center.y+20);//擦除连接线
    ClientDC->LineTo(b[i].center.x+10,b[i].center.y-20);
    ClientDC->SelectObject(p_pen);
    repaint2();//重新绘制被连接线挡住的用户区
    move();//制作矩形漂移效果
    str.Format("%d",b[i].key);
    pos=m_pOwner->m_MyList6.InsertItem(temp6,str); // 在第temp行插入,0列的内容,成功返回行号
 
    switch(i)
	{ 
    case  0:
	str=m_pOwner->m_MyList3.GetItemText(0,1);
    m_pOwner->m_MyList6.SetItemText(pos,1,str);//在第pos行的1列插入"其它信息"内容,成功返回非零
    m_pOwner->m_MyList3.DeleteItem(0);
    break;
    case  1:
	str=m_pOwner->m_MyList4.GetItemText(0,1);
    m_pOwner->m_MyList6.SetItemText(pos,1,str);
    m_pOwner->m_MyList4.DeleteItem(0);
    break;
    case  2:
	str=m_pOwner->m_MyList5.GetItemText(0,1);
    m_pOwner->m_MyList6.SetItemText(pos,1,str);
    m_pOwner->m_MyList5.DeleteItem(0);
    break;
    case  3:
	str=m_pOwner->m_MyList1.GetItemText(0,1);
    m_pOwner->m_MyList6.SetItemText(pos,1,str);
    m_pOwner->m_MyList1.DeleteItem(0);
	break;
    case  4:
	str=m_pOwner->m_MyList2.GetItemText(0,1);
    m_pOwner->m_MyList6.SetItemText(pos,1,str);
    m_pOwner->m_MyList2.DeleteItem(0);
	break;
	}
    m_pOwner->m_MyList6.SetItemColor(temp6/*行*/,(DWORD)RGB(255,0,0)/*颜色*/);
    m_pOwner->m_MyList6.Update(temp6);
	if(temp6>0)
	{
    m_pOwner->m_MyList6.SetItemColor(temp6-1/*行*/,RGB(0,0,0));
    m_pOwner->m_MyList6.Update(temp6-1);
	}
    temp6++; 
 
}

void CBaizheshuDlg::OnButton1() 
{
    GetDlgItem(IDC_BEGIN)->EnableWindow(FALSE); // 使“开始”按钮控件不可用
	SetWindowLong(GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE)& (~WS_MINIMIZEBOX)); // 使对话框最小化按钮不可用
	m_zt.EnableWindow(TRUE);
	flag=1; // “暂停”按钮控件可用的标志
	m_pThread=AfxBeginThread(ThreadProc1,hWnd); // 利用多线程调用K_Merge()
	
}
UINT CBaizheshuDlg::ThreadProc1(LPVOID pPar)
{//线程1
	K_Merge();
    flag=2;
    AfxBeginThread(ThreadProc2,hWnd); // ThreadProc1()结束时调用ThreadProc2()
	return 0;
}
UINT CBaizheshuDlg::ThreadProc2(LPVOID pPar)
{ // 线程2
	CWnd *pWnd=AfxGetApp()->m_pMainWnd; // m_pMainWnd是对话框地址
    pWnd-> GetDlgItem(IDCANCLE)->SetWindowText("重置"); // 使“暂停”按钮显示“重置”
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -