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