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

📄 baizheshudlg.cpp

📁 用VC编写的一个树生成的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void CBaizheshuDlg::setcolor(int i)
{
 	switch(i)
	{ 
    case  0:
	m_pOwner->m_MyList3.SetItemColor(0/*行*/,(DWORD)RGB(255,0,0)/*颜色*/);	
    break;
    case  1:
    m_pOwner->m_MyList4.SetItemColor(0/*行*/,(DWORD)RGB(255,0,0)/*颜色*/);
	break;
    case  2:
	m_pOwner->m_MyList5.SetItemColor(0/*行*/,(DWORD)RGB(255,0,0)/*颜色*/);
   break;
    case  3:
	m_pOwner->m_MyList1.SetItemColor(0/*行*/,(DWORD)RGB(255,0,0)/*颜色*/);
    break;
    case  4:
    m_pOwner->m_MyList2.SetItemColor(0/*行*/,(DWORD)RGB(255,0,0)/*颜色*/);
	break;
    case  5:
    m_pOwner->m_MyList6.SetItemColor(temp6/*行*/,(DWORD)RGB(0,255,255)/*颜色*/);
	break;
	}
}

void CBaizheshuDlg::OnControl() 
{
	// TODO: Add your control notification handler code here
    switch(flag)
	{
	    case 0: // 按下“继续”按钮
		SetWindowLong(GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE)& (~WS_MINIMIZEBOX)); // 使对话框最小化按钮不可用
		m_pThread->ResumeThread(); // 使线程1继续运行
		flag=1; // 线程1继续运行的标志
		m_zt.SetWindowText("暂停"); // 将“继续”按钮改为“暂停”按钮
		break;
	    case 1: // 按下“暂停”按钮
		SetWindowLong(GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE)^ (WS_MINIMIZEBOX)); // 使对话框最小化按钮重新可用
		m_pThread->SuspendThread(); // 使线程1挂起(暂停)
		flag=0; // 线程1挂起的标志
		m_zt.SetWindowText("继续"); // 将“暂停”按钮改为“继续”按钮
		break;
	    case 2: // 按下“重置”按钮
		SetWindowLong(GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE)^ (WS_MINIMIZEBOX)); // 使对话框最小化按钮重新可用
        m_zt.EnableWindow(FALSE); // 使“重置”按钮控件不再可用
		init(); // 绘制初态*/
	}	
}

void CBaizheshuDlg::init()
{
   m_MyList1.DeleteAllItems( );//删除列表控件的所有行
   m_MyList2.DeleteAllItems( );
   m_MyList3.DeleteAllItems( );
   m_MyList4.DeleteAllItems( );
   m_MyList5.DeleteAllItems( );
   m_MyList6.DeleteAllItems( );
   CWnd *pWnd=AfxGetApp()->m_pMainWnd;
   CDC *ClientDC;
   ClientDC=pWnd->GetDC();
   repaint();//重绘败者树
   data();
   GetDlgItem(IDC_BEGIN)->EnableWindow(TRUE); // 使“开始”按钮控件可用
   m_zt.SetWindowText("暂停");
}

void CBaizheshuDlg::move()
{
  int t=m_pOwner->m_ss.GetPos(); 
  int i=ls[0],n,m;
  FLAG=0;
  CWnd *pWnd=AfxGetApp()->m_pMainWnd;
  CDC *ClientDC;
  ClientDC=pWnd->GetDC();
  ClientDC->SetTextAlign(TA_CENTER); // 设置文本居中
  CPen pen,*p_pen,pen1;
  pen.CreatePen(PS_SOLID|PS_ENDCAP_SQUARE  ,35,RGB(255,255,204));//创建背景色画笔
  pen1.CreatePen(PS_SOLID|PS_ENDCAP_SQUARE|PS_JOIN_BEVEL|PS_USERSTYLE|PS_INSIDEFRAME,35,RGB(0,255,255));//创建黑色画笔
  if(i<=2)
  n=13;//控制矩形框移动的次数
  else
  n=16;
  for( C=1;C<=n;C++)
  {

  p_pen=ClientDC->SelectObject(&pen1);
  ClientDC->MoveTo(b[i].center.x-5,b[i].center.y-(2+C)*20);//画矩形
  ClientDC->LineTo(b[i].center.x+5,b[i].center.y-(2+C)*20);
  ClientDC->SelectObject(p_pen);
  AfxBeginThread(ThreadProc3,hWnd); 
  ::Sleep(t/6);
  p_pen=ClientDC->SelectObject(&pen);
  ClientDC->MoveTo(b[i].center.x-5,b[i].center.y-(2+C)*20);//擦矩形
  ClientDC->LineTo(b[i].center.x+5,b[i].center.y-(2+C)*20);
  ClientDC->SelectObject(p_pen);

  CString s,s1;
  int k;
  for(k=0;k<4;k++)
	{ s="ls[";
      s1.Format("%d", k);
      s=s+s1+"]"; 
      ClientDC->SetBkColor(RGB(255,255,204));//定义文本背景
      ClientDC->TextOut(c[k].center.x-40,c[k].center.y-10,s);//重绘非叶子结点的标记
	}

  int h,f,w;
  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);
    ClientDC->MoveTo(p[w].x+h,p[w].y+f); // 由两顶点的圆周起画边
	ClientDC->LineTo(p[v].x-h,p[v].y-f);
	}
  }
  for(w=1;w<=3;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);
    ClientDC->MoveTo(p[w].x+h,p[w].y+f); // 由两顶点的圆周起画边
	ClientDC->LineTo(p[v].x-h,p[v].y-f);
	}
  }

  }//end for
  FLAG=1;//矩形控件开始横向移动
  switch(i)
  {
   case 0:m=22;break;
   case 1:m=16;break;
   case 2:m=9;break;
   case 3:m=34;break;
   case 4:m=29;break;
  }
 for( D=1;D<=m;D++)
 {
  p_pen=ClientDC->SelectObject(&pen1);
  ClientDC->MoveTo(b[i].center.x+D*20-5,b[i].center.y-(2+n)*20);//画矩形
  ClientDC->LineTo(b[i].center.x+D*20+5,b[i].center.y-(2+n)*20);
  ClientDC->SelectObject(p_pen);
  AfxBeginThread(ThreadProc3,hWnd);
 
  ::Sleep(t/6);
  p_pen=ClientDC->SelectObject(&pen);
  ClientDC->MoveTo(b[i].center.x+D*20-5,b[i].center.y-(2+n)*20);//擦除矩形
  ClientDC->LineTo(b[i].center.x+D*20+5,b[i].center.y-(2+n)*20);
  ClientDC->SelectObject(p_pen);
 
 }
 pen.DeleteObject();
 pen1.DeleteObject();  
 }
   
UINT CBaizheshuDlg::ThreadProc3(LPVOID pPar)//move()过程中调用
{

  CWnd *pWnd=AfxGetApp()->m_pMainWnd;
  CDC *ClientDC;
  ClientDC=pWnd->GetDC();
  ClientDC->SetTextAlign(TA_CENTER); // 设置文本居中
  ClientDC->SetBkColor(RGB(0,255,255));//定义文本背景
  int i=ls[0],n;
  if(i<=2)
  n=13;
  else
  n=16;
  STR.Format("%d",b[i].key);
  if(FLAG==0)//矩形框竖向移动
  ClientDC->TextOut(b[i].center.x,b[i].center.y-(2+C)*20-5,STR);
  else//矩形框竖横向移动
  ClientDC->TextOut(b[i].center.x+D*20+5,b[i].center.y-(2+n)*20-5,STR);
  return 0;
}
UINT CBaizheshuDlg::ThreadProc4(LPVOID pPar)//Adjust()中调用
{

   CWnd *pWnd=AfxGetApp()->m_pMainWnd;
   CDC *ClientDC;
   ClientDC=pWnd->GetDC();
   ClientDC->SetTextAlign(TA_CENTER); // 设置文本居中
   ClientDC->SetBkColor(RGB(0,255,0));//定义文本背景
   CString str;
   str.Format("%d",ls[tt]);
   ClientDC->TextOut(c[tt].center.x,c[tt].center.y,str);
   return 0;
}

void CBaizheshuDlg::repaint()
{
	CWnd *pWnd=AfxGetApp()->m_pMainWnd;
    CDC *ClientDC;
    ClientDC=pWnd->GetDC();
	ClientDC->SelectStockObject(NULL_BRUSH); // 设置图形填充为透明
    CBrush br,br1,*pbr;
    br.CreateSolidBrush(RGB(245,73,99));
    br1.CreateSolidBrush(RGB(0,255,255));
    double ViewY;  // 视图纵向占屏幕的百分比
    double ViewX;  // 视图横向占屏幕的百分比
    int t,i,j;
    t=int(log(10)/log(2))+1;//败者树的层数
    ViewX=0.7*10/2*0.1;
    ViewY=0.2;
    c[0].center.x= long(Dialog.x*ViewX);
    c[0].center.y=long(Dialog.y*ViewY);
    pbr=ClientDC->SelectObject(&br);
    ClientDC->Ellipse(c[0].center.x-r,c[0].center.y-r,c[0].center.x+r,c[0].center.y+r); // 画圆
    ClientDC->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=ClientDC->SelectObject(&br1);
           ClientDC->Rectangle(p[d].x-r,p[d].y-r,p[d].x+r,p[d].y+r); // 画矩形
           d++;
		   ClientDC->SelectObject(pbr);
		 }
		 else
		 { pbr=ClientDC->SelectObject(&br);
           ClientDC->Ellipse(p[d].x-r,p[d].y-r,p[d].x+r,p[d].y+r); // 画圆
           d++;
		   ClientDC->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=ClientDC->SelectObject(&br1);
         ClientDC->Rectangle(p[d].x-r,p[d].y-r,p[d].x+r,p[d].y+r); // 画矩形
         ClientDC->SelectObject(pbr);
         k=k+1;
		 q++;
		 d++;
	}
}

void CBaizheshuDlg::data()//将文件中数据写入列表控件
{ 
	int pos;
	for(int i=1;i<=H[0].length;i++)
	{ 
      str.Format("%d",H[0].r[i].key);
      pos=m_MyList1.InsertItem(i-1,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",H[0].r[i].otherinfo);
      m_MyList1.SetItemText(pos,1,str); // 在第pos行的1列插入"顺序信息"内容,成功返回非零
	}
      str.Format("%d",999);
      pos=m_MyList1.InsertItem(H[0].length,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",0);
      m_MyList1.SetItemText(pos,1,str);

    for( i=1;i<=H[1].length;i++)
	{ 
      str.Format("%d",H[1].r[i].key);
      pos=m_MyList2.InsertItem(i-1,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",H[1].r[i].otherinfo);
      m_MyList2.SetItemText(pos,1,str); // 在第pos行的1列插入"顺序信息"内容,成功返回非零
	}
      str.Format("%d",999);
      pos=m_MyList2.InsertItem(H[1].length,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",0);
      m_MyList2.SetItemText(pos,1,str);
    for( i=1;i<=H[2].length;i++)
	{ 
      str.Format("%d",H[2].r[i].key);
      pos=m_MyList3.InsertItem(i-1,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",H[2].r[i].otherinfo);
      m_MyList3.SetItemText(pos,1,str); // 在第pos行的1列插入"顺序信息"内容,成功返回非零
	}
      str.Format("%d",999);
      pos=m_MyList3.InsertItem(H[2].length,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",0);
      m_MyList3.SetItemText(pos,1,str);
    for( i=1;i<=H[3].length;i++)
	{
      str.Format("%d",H[3].r[i].key);
      pos=m_MyList4.InsertItem(i-1,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",H[3].r[i].otherinfo);
      m_MyList4.SetItemText(pos,1,str); // 在第pos行的1列插入"顺序信息"内容,成功返回非零
	}
      str.Format("%d",999);
      pos=m_MyList4.InsertItem(H[3].length,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",0);
      m_MyList4.SetItemText(pos,1,str);
    for( i=1;i<=H[4].length;i++)
	{ 
      str.Format("%d",H[4].r[i].key);
      pos=m_MyList5.InsertItem(i-1,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",H[4].r[i].otherinfo);
      m_MyList5.SetItemText(pos,1,str); // 在第pos行的1列插入"顺序信息"内容,成功返回非零
	}
      str.Format("%d",999);
      pos=m_MyList5.InsertItem(H[4].length,str); // 在第i-1行插入,0列的内容,成功返回行号
      str.Format("%d",0);
      m_MyList5.SetItemText(pos,1,str);

}

void CBaizheshuDlg::OnOK() 
{
	
	CBaizheshuDlg::OnOK();	
}

void CBaizheshuDlg::repaint2()//output()中调用
{   
	
   CWnd *pWnd=AfxGetApp()->m_pMainWnd;
   CDC *ClientDC;
   ClientDC=pWnd->GetDC();
   ClientDC->SetTextAlign(TA_CENTER); // 设置文本居中
   CPen pen,*p_pen;
   CBrush br,br1,*pbr;
   br.CreateSolidBrush(RGB(245,73,99));
   pen.CreatePen(PS_SOLID  ,1,RGB(245,73,99));//创建背景色画笔
   ClientDC->SelectStockObject(NULL_BRUSH); // 设置图形填充为透明
   ClientDC->SetBkColor(RGB(245,73,99));//定义文本背景
   CString s;
	for(int jj=1;jj<=4;jj++)
	{
	  pbr=ClientDC->SelectObject(&br);	
      ClientDC->Ellipse(c[jj].center.x-r,c[jj].center.y-r,c[jj].center.x+r,c[jj].center.y+r);//重绘非叶子结点
	  ClientDC->SelectObject(pbr); 
      p_pen=ClientDC->SelectObject(&pen);
      s.Format("%d",ls[jj]);
      ClientDC->TextOut(c[jj].center.x,c[jj].center.y,s);//重写非叶子结点上的字符串
      ClientDC->SelectObject(p_pen);
	}
}

⌨️ 快捷键说明

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