?? order.cpp
字號(hào):
#include "stdafx.h"
#include ".\order.h"
COrder::COrder()
{
Width =GetSystemMetrics(SM_CXSCREEN);
Height =GetSystemMetrics(SM_CYSCREEN);
HWND hWndDesk=GetDesktopWindow();
HDC hDCDesk=GetDC(hWndDesk);
hDC=CreateCompatibleDC(hDCDesk);
hBitmap=CreateCompatibleBitmap(hDCDesk,Width,Height);
hBitmapOld=(HBITMAP)SelectObject(hDC,hBitmap);
Cls(0,0,Width,Height,GetSysColor(COLOR_BTNFACE));
ReleaseDC(hWndDesk,hDCDesk);
hFont=CreateFont(12,0,0,0,0,0,0,0,0,0,0,0,0,"宋體");
hFontOld=(HFONT)SelectObject(hDC,hFont);
SetBkColor(hDC,GetSysColor(COLOR_BTNFACE));
State=State_Stop;
Interval=400;
Work=Work_None;
Arrow[0]=8*4;
Arrow[1]=4*4;
Arrow[2]=11*4;
Arrow[3]=2*4;
Arrow[4]=12*4;
Arrow[5]=9*4;
Arrow[6]=6*4;
Arrow[7]=5*4;
Arrow[8]=7*4;
Arrow[9]=3*4;
Arrow[10]=10*4;
Arrow[11]=1*4;
n=12;
Parent=Root=Cur=NULL;
d=u=m=f=j=i=-1;
ti=0;
}
COrder::~COrder()
{
SelectObject(hDC,hFontOld);
DeleteObject(hFont);
SelectObject(hDC,hBitmapOld);
DeleteObject(hBitmap);
DeleteDC(hDC);
}
int COrder::Next(void)
{
if (Work==Work_Bubble)return BubbleNext();
if (Work==Work_Insert)return InsertNext();
if (Work==Work_Select)return SelectNext();
if (Work==Work_Quick)return QuickNext();
if (Work==Work_Heap)return HeapNext();
if (Work==Work_Add)return AddNext();
if (Work==Work_Find)return FindNext();
return State=State_Stop;
}
void COrder::InsertFirst(void)
{
j=1;
Step=0;
InsertDraw();
}
int COrder::InsertNext(void)
{
if (j==n) return State=State_Stop;
if ((Step==0) && (Current[j]<Current[j-1]))
{
i=j;
Step=1;
}
else if ((Step==1) && i>0 &&(Current[i]<Current[i-1]))
{
int t=Current[i];
Current[i]=Current[i-1];
Current[i-1]=t;
i--;
}
else
{
Step=0;
j++;
i=-1;
}
InsertDraw();
return 1;
}
void COrder::InsertDraw(void)
{
BubbleDraw();
}
int COrder::SelectNext(void)
{
if (i==n-1)return State=State_Stop;
if ((Step==0) && j!=n)
{
if (((m==-1) && (Current[i]>Current[j]) || ((m!=-1) && Current[m]>Current[j])) )m=j;
j++;
}
else if (Step==1)
{
int t=Current[m];
Current[m]=Current[i];
Current[i]=t;
Step=2;
}
else if (Step==2)
{
Finish[i]=1;
i++;
j=i+1;
m=i;
Step=0;
}
if ((Step==0) && (j==n))
{
if (m!=i)Step=1;
else
{
Finish[i]=1;
i++;
j=i+1;
m=i;
}
}
SelectDraw();
return 1;
}
int COrder::QuickNext(void)
{
if (Step==0)
{
for (d=0;d<n && Finish[d]==1;d++);
if (d==n)return State=State_Stop;
for (u=d+1;u<n && Finish[u]==0;u++);
u--;
i=d;
if (d!=u) Step=1;
else Finish[d]=1;
}
else
{
if (d==u)
{
Finish[d]=1;
Step=0;
}
else if (i==d)
{
if (Current[i]>Current[u])
{
int t=Current[i];
Current[i]=Current[u];
Current[u]=t;
i=u;
}
else u--;
}
else
{
if (Current[i]<Current[d])
{
int t=Current[i];
Current[i]=Current[d];
Current[d]=t;
i=d;
}
else d++;
}
}
QuickDraw();
return 1;
}
int COrder::BubbleNext(void)
{
if (j==0) return State=State_Stop;
if (i==j)
{
if(f==0) return State=State_Stop;
else
{
i=0;
Finish[j]=1;
j--;
f=0;
}
}
if ( (Step == 0) && (Current[i]>Current[i+1]) ) Step = 1;
else if((Step==1) && (Current[i]>Current[i+1]))
{
int t=Current[i];
Current[i]=Current[i+1];
Current[i+1]=t;
i++;
f=1;
}
else
{
i++;
Step=0;
}
BubbleDraw();
return 1;
}
void COrder::BubbleFirst(void)
{
i=0;
j=n-1;
f=0;
BubbleDraw();
}
void COrder::BubbleDraw(void)
{
RECT r;
char * tStr;
DrawVar();
r.top=8+(8+24+8)+8+(8+24+8)+8;
r.left=8;
r.bottom=r.top+8+24+8+24+8+24+8;
r.right =r.left+8+72+8+n*(24+8);
DrawEdge(hDC,&r,EDGE_ETCHED,BF_RECT|BF_MIDDLE);
r.left=8+8;
r.right=r.left+72;
r.top =8+(8+24+8)+8+(8+24+8)+8+8+24+8;
r.bottom=r.top+24;
DrawText(hDC,"當(dāng)前數(shù)組:",9,&r,DT_VCENTER|DT_SINGLELINE);
HBRUSH hBrush,hBrush2;
SetBkColor(hDC,0xC0C0FF);
hBrush=CreateSolidBrush(0xC0C0FF);
hBrush2=CreateSolidBrush(0xFFC0C0);
for (int a=0;a<n;a++)
{
r.left=8+8+72+8+a*(24+8);
r.right=r.left+24;
if (Finish[a]==1)
{
FillRect(hDC,&r,hBrush2);
DrawEdge(hDC,&r,EDGE_BUMP,BF_RECT);
tStr=Str(Current[a]);
COLORREF Old=SetBkColor(hDC,0xFFC0C0);
DrawText(hDC,tStr,lstrlen(tStr),&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
SetBkColor(hDC,Old);
}
else
{
if ((Step ==0) || ((Step==1) && (a!=i)) || ((Step==2) && (a!=m)) || ((Step==3) && (a!=j))) FillRect(hDC,&r,hBrush);
DrawEdge(hDC,&r,EDGE_BUMP,BF_RECT);
tStr=Str(Current[a]);/////////////////////////////////////////////////////////////////
if ((Step ==0) || ((Step==1) && (a!=i)) || ((Step==2) && (a!=m)) || ((Step==3) && (a!=j))) DrawText(hDC,tStr,lstrlen(tStr),&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}
DeleteObject(hBrush2);
if (Step==0)
{
if (m!=-1 && i!=m)
{
POINT p;
MoveToEx(hDC,8+8+72+8+i*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+24+8,&p);
LineTo(hDC,8+8+72+8+i*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+m*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+m*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
}
if (Step==1)
{
r.top =8+(8+24+8)+(8+24+8)+8+8+8;
r.bottom=r.top+24;
r.left=8+8+72+8+i*(24+8);
r.right=r.left+24;
HBRUSH hBrush=CreateSolidBrush(0x80FF80);
COLORREF ColorOld= SetBkColor(hDC,0x80FF80);
FillRect(hDC,&r,hBrush);
DeleteObject(hBrush);
DrawEdge(hDC,&r,EDGE_BUMP,BF_RECT);
tStr=Str(Current[i]);//////////////////////////////////////////////
DrawText(hDC,tStr,lstrlen(tStr),&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
SetBkColor(hDC,ColorOld);
if (m!=-1)
{
POINT p;
MoveToEx(hDC,8+8+72+8+i*(24+8)+24,8+(8+24+8)+(8+24+8)+8+8+8+12,&p);
LineTo(hDC,8+8+72+8+m*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+m*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
if (p!=-1)
{
POINT p;
MoveToEx(hDC,8+8+72+8+i*(24+8)+24,8+(8+24+8)+(8+24+8)+8+8+8+12,&p);
if (adjust==0)
{
LineTo(hDC,8+8+72+8+j*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+j*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
else
{
int node=i*2+1;
if (node+1<j && Current[node+1]>Current[node])node=node+1;
if (node<j)
{
LineTo(hDC,8+8+72+8+node*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+node*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
}
}
if (d!=-1 && u!=i)
{
POINT p;
MoveToEx(hDC,8+8+72+8+i*(24+8)+24,8+(8+24+8)+(8+24+8)+8+8+8+12,&p);
LineTo(hDC,8+8+72+8+u*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+u*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
if (u!=-1 && d!=i)
{
POINT p;
MoveToEx(hDC,8+8+72+8+i*(24+8),8+(8+24+8)+(8+24+8)+8+8+8+12,&p);
LineTo(hDC,8+8+72+8+d*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+d*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
}
if (Step==2)
{
if (m!=-1)
{
POINT p;
MoveToEx(hDC,8+8+72+8+m*(24+8),8+(8+24+8)+(8+24+8)+8+8+8+12,&p);
LineTo(hDC,8+8+72+8+i*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+i*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
r.top =8+(8+24+8)+(8+24+8)+8+8+8;
r.bottom=r.top+24;
r.left=8+8+72+8+m*(24+8);
r.right=r.left+24;
HBRUSH hBrush=CreateSolidBrush(0x80FF80);
COLORREF ColorOld= SetBkColor(hDC,0x80FF80);
FillRect(hDC,&r,hBrush);
DrawEdge(hDC,&r,EDGE_BUMP,BF_RECT);
tStr=Str(Current[m]);//////////////////////////////////////////////
DrawText(hDC,tStr,lstrlen(tStr),&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
SetBkColor(hDC,ColorOld);
}
if (Step==3)
{
if (j!=-1)
{
POINT p;
MoveToEx(hDC,8+8+72+8+j*(24+8),8+(8+24+8)+(8+24+8)+8+8+8+12,&p);
LineTo(hDC,8+8+72+8+i*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12);
LineTo(hDC,8+8+72+8+i*(24+8)+12,8+(8+24+8)+(8+24+8)+8+8+8+12+12+8);
}
r.top =8+(8+24+8)+(8+24+8)+8+8+8;
r.bottom=r.top+24;
r.left=8+8+72+8+j*(24+8);
r.right=r.left+24;
HBRUSH hBrush=CreateSolidBrush(0x80FF80);
COLORREF ColorOld= SetBkColor(hDC,0x80FF80);
FillRect(hDC,&r,hBrush);
DrawEdge(hDC,&r,EDGE_BUMP,BF_RECT);
tStr=Str(Current[j]);//////////////////////////////////////////////
DrawText(hDC,tStr,lstrlen(tStr),&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
DeleteObject(hBrush);
SetBkColor(hDC,ColorOld);
}
DeleteObject(hBrush);
SetBkColor(hDC,GetSysColor(COLOR_BTNFACE));
r.top =8+(8+24+8)+(8+24+8)+8+8+24+8+24+8+8;
r.bottom=r.top+24;
r.left=8+8+72+8+i*(24+8)-3;
r.right=r.left+24;
if (i>=0 && i<n) DrawText(hDC,"I↑",3,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
r.left=8+8+72+8+j*(24+8)+3;
r.right=r.left+24;
if (j>=0 && j<n) DrawText(hDC,"↑J",3,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
r.left=8+8+72+8+d*(24+8)+3;
r.right=r.left+24;
if (d>=0 && d<n) DrawText(hDC,"↑D",3,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
r.left=8+8+72+8+u*(24+8)+3;
r.right=r.left+24;
if (u>=0 && u<n) DrawText(hDC,"↑U",3,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
r.left=8+8+72+8+m*(24+8)+3;
r.right=r.left+24;
if (m>=0 && m<n) DrawText(hDC,"↑M",3,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
r.left=8+8+72+8+p*(24+8)+3;
r.right=r.left+24;
if (p>=0 && p<n) DrawText(hDC,"↑P",3,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
HDC hDCDest=GetDC(hWnd);
BitBlt(hDCDest,8,8+(8+24+8)+8+(8+24+8),8+(8+72+8)+n*(24+8),8+(8+24+8+24+8+24+8),hDC,8,8+(8+24+8)+8+(8+24+8),SRCCOPY);
ReleaseDC(hWnd,hDC);
}
int COrder::HeapNext(void)
{
if (adjust)
{
if (j==1)return State=State_Stop;
int node=i*2+1;
if (node+1<j && Current[node+1]>Current[node])node=node+1;
if (node<j && Current[node]>Current[i])
{
if (Step==0)Step=1;
else
{
int t=Current[i];
Current[i]=Current[node];
Current[node]=t;
i=node;
}
}
else
{
Step=0;
if (p>0)
{
p--;
}
else
{
adjust=0;
j--;
}
i=p;
}
}
else
{
if (Step==0)Step=1;
else if (Step==1)
{
int t=Current[i];
Current[i]=Current[j];
Current[j]=t;
i=j;
Step=3;
}
else
{
i=0;
Finish[j]=1;
Step=0;
adjust=1;
}
}
HeapDraw();
return 1;
}
void COrder::SelectFirst(void)
{
i=0;
m=i;
j=i+1;
SelectDraw();
}
void COrder::QuickFirst(void)
{
d=0;
u=n-1;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -