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

📄 mainframe.cpp

📁 几种排序算法的动画演示,包括冒泡排序,选择排序,插入排序,快速排序,堆排序,支持单步演示,
💻 CPP
字号:
#include "StdAfx.h"
#include ".\mainframe.h"
#include "resource.h"
#include "InputDlg.h"
#include "Order.h"
COrder Order;
const char * const CMainFrame::lpClassName="CMainFrame";
HINSTANCE CMainFrame::hInstance=0;
CMainFrame::CMainFrame(void)
{
	hWnd=NULL;
}
int CMainFrame::Register(HINSTANCE hInst)
{
	hInstance=hInst;
	WNDCLASSEX wc;
	wc.cbClsExtra=0;
	wc.cbSize=sizeof(wc);
	wc.cbWndExtra=0;
	wc.hbrBackground=HBRUSH(COLOR_BTNFACE+1);
	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
	wc.hInstance=hInstance;
	wc.lpfnWndProc=(WNDPROC)WinProc;
	wc.lpszClassName=lpClassName;
	wc.lpszMenuName=(LPCSTR)IDM_MainFrame;
	wc.style=0;
	return RegisterClassEx(&wc);
}
void CMainFrame::Create(void)
{
	hWnd=CreateWindowEx(0,lpClassName,"实验七",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT ,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,this);
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
LRESULT CMainFrame::WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CMainFrame *that=(CMainFrame *)GetWindowLong(hWnd,GWL_USERDATA);
	if (msg==WM_CREATE)
	{
		SetWindowLong(hWnd,GWL_USERDATA,(LONG)((CREATESTRUCT *)lParam)->lpCreateParams);
		that=(CMainFrame *)((CREATESTRUCT *)lParam)->lpCreateParams;
		that->hFont=CreateFont(12,0,0,0,0,0,0,0,0,0,0,0,0,"宋体");
		SendMessage(hWnd,WM_SETFONT,(WPARAM)that->hFont,1);
	}
	if (msg==WM_TIMER) that->OnTimer();
	if (msg==WM_COMMAND)that->OnCommand(LOWORD(wParam));
	if (msg==WM_PAINT)that->OnPaint();
	if (msg==WM_DESTROY)
	{
		DeleteObject(that->hFont);
		PostQuitMessage(0);
	}
	if (msg==WM_INITMENU)that->OnInitMenu();
	return DefWindowProc(hWnd,msg,wParam,lParam);
}
void CMainFrame::OnTimer(void)
{	
	if (Order.State==State_Stop)
	{
		Order.State=State_Break;
		Order.First();
	}
	else if (!Order.Next())
	{
		KillTimer(hWnd,0);
		MessageBox(hWnd,"排序演示完成!","实验七",MB_ICONINFORMATION);
	}
}
void CMainFrame::OnCommand(UINT wmId)
{
	if (wmId==ID_Exit)DestroyWindow(hWnd);
	if (wmId==ID_Start)
	{
		SetTimer(hWnd,0,Order.Interval ,0);
		if (Order.State==State_Stop) Order.First();
		Order.State=State_Run;
	}
	if (wmId==ID_Step)if(Order.State!=State_Run)OnTimer();
	if (wmId==ID_Break)
	{
		Order.State=State_Break;
		KillTimer(hWnd,0);
	}
	if (wmId==ID_End)
	{
		Order.State=State_Stop;
		KillTimer(hWnd,0);
	}
	if (wmId==ID_Bubble)
	{
		Order.Work=Work_Bubble;
		Order.First();
		Order.State=State_Break;
	}
	if (wmId==ID_Select)
	{
		Order.Work=Work_Select;
		Order.First();
		Order.State=State_Break;
	}
	if (wmId==ID_Insert)
	{
		Order.Work=Work_Insert;
		Order.First();
		Order.State=State_Break;
	}
	if (wmId==ID_Quick)
	{
		Order.Work=Work_Quick;
		Order.First();
		Order.State=State_Break;
	}
	if (wmId==ID_Heap)
	{
		Order.Work=Work_Heap;
		Order.First();
		Order.State=State_Break;
	}
	if (wmId==ID_SpeedUp)
	{
		if (Order.Interval>100)Order.Interval/=2;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_SpeedDown)
	{
		if (Order.Interval<1600)Order.Interval*=2;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_Sp1)
	{
		Order.Interval=100;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_Sp2)
	{
		Order.Interval=200;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_Sp4)
	{
		Order.Interval=400;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_Sp8)
	{
		Order.Interval=800;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_Sp16)
	{
		Order.Interval=1600;
		if (Order.State!=State_Break)SetTimer(hWnd,0,Order.Interval,0);
	}
	if (wmId==ID_Add)
	{
		CInputDlg InputDlg;
		int a=0;
		if (Order.ti<Order.n)
		{
			a=Order.Arrow[Order.ti];
		}
		Order.ti++;
		if (InputDlg.DoModal(hWnd,"输入要插入的数值",a))
		{
			Order.State=State_Run;

			Order.ToFind=InputDlg.Value;
			Order.Work=Work_Add;
			Order.First();
			SetTimer(hWnd,0,Order.Interval,0);
		}
	}
	if (wmId==ID_Find)
	{
		CInputDlg InputDlg;
		if (Order.Depth())
		{
			if (InputDlg.DoModal(hWnd,"输入要查找的数值",10))
			{
				Order.State=State_Run;
				Order.ToFind=InputDlg.Value;
				Order.Work=Work_Find;
				Order.First();
				SetTimer(hWnd,0,Order.Interval,0);
			}
		}
		else MessageBox(hWnd,"当前树为空,建树先!","实验七",MB_ICONINFORMATION);
	}
	if (wmId==ID_Edit)MessageBox(hWnd,"不用了把,演示版的修改原始数组干吗啊?","实验七",MB_ICONINFORMATION);
}
void CMainFrame::OnPaint(void)
{
	Order.Paint(hWnd);
}
int CMainFrame::Run(void)
{
	HACCEL hAccel=LoadAccelerators(hInstance,(LPCSTR)IDR_MainFrame);
	MSG msg;
	while (GetMessage(&msg,NULL,0,0))
	{
		if (!TranslateAccelerator(hWnd,hAccel,&msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}
void CMainFrame::OnInitMenu(void)
{
	HMENU hMenu=GetMenu(hWnd);
	if (Order.Work==Work_Bubble)CheckMenuItem(hMenu,ID_Bubble,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Bubble,MF_UNCHECKED);
	if (Order.Work==Work_Insert)CheckMenuItem(hMenu,ID_Insert,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Insert,MF_UNCHECKED);
	if (Order.Work==Work_Select)CheckMenuItem(hMenu,ID_Select,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Select,MF_UNCHECKED);
	if (Order.Work==Work_Quick)CheckMenuItem(hMenu,ID_Quick,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Quick,MF_UNCHECKED);
	if ( Order.Work==Work_Heap)CheckMenuItem(hMenu,ID_Heap,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Heap,MF_UNCHECKED);
	if (Order.Work==Work_Add)CheckMenuItem(hMenu,ID_Add,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Add,MF_UNCHECKED);
	if ( Order.Work==Work_Find)CheckMenuItem(hMenu,ID_Find,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Find,MF_UNCHECKED);
	if (Order.Interval==100)CheckMenuItem(hMenu,ID_Sp1,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Sp1,MF_UNCHECKED);
	if (Order.Interval==200)CheckMenuItem(hMenu,ID_Sp2,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Sp2,MF_UNCHECKED);
	if (Order.Interval==400)CheckMenuItem(hMenu,ID_Sp4,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Sp4,MF_UNCHECKED);
	if (Order.Interval==800)CheckMenuItem(hMenu,ID_Sp8,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Sp8,MF_UNCHECKED);
	if (Order.Interval==1600)CheckMenuItem(hMenu,ID_Sp16,MF_CHECKED);
	else CheckMenuItem(hMenu,ID_Sp16,MF_UNCHECKED);
	if (Order.Interval==1600)CheckMenuItem(hMenu,ID_Sp16,MF_CHECKED);
	if (Order.State==State_Stop)
	{
		EnableMenuItem(hMenu,ID_End,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Edit,MF_ENABLED);
	}
	else 
	{
		EnableMenuItem(hMenu,ID_End,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Edit,MF_GRAYED);
	}
	if (Order.State==State_Run)
	{
		EnableMenuItem(hMenu,ID_Bubble,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Insert,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Select,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Quick,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Heap,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Add,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Find,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Break,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Start,MF_GRAYED);
		EnableMenuItem(hMenu,ID_Step,MF_GRAYED);
	}
	else
	{
		EnableMenuItem(hMenu,ID_Bubble,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Insert,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Select,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Quick,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Heap,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Add,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Find,MF_ENABLED);
		EnableMenuItem(hMenu,ID_Break,MF_GRAYED);
		if (Order.Work)EnableMenuItem(hMenu,ID_Start,MF_ENABLED);
		else EnableMenuItem(hMenu,ID_Start,MF_GRAYED);
		if (Order.Work) EnableMenuItem(hMenu,ID_Step,MF_ENABLED);
		else  EnableMenuItem(hMenu,ID_Step,MF_GRAYED);
	}
}

⌨️ 快捷键说明

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