📄 baizheshudlg.cpp
字号:
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 + -