使用MFC!我有一个详细设计,请人按照这个设计补全代码,大概需要多少钱?

puin 2014-05-05 02:14:30
22.1、总体方案
    采用Microsoft Visual Studio 6.0中的VC开发平台,开发单文档应用程序。工程名为:SortDemo。
2.1.1 界面布局
  将主窗口分为四个同步的子窗口,通过CSplitterWnd 类实现。各窗口
布局和功能如图1所示。
   图 1

CChooseView

功能:
1、选择排序法
2、弹出对话框输入排序元素
3、通过按钮控制演示过程
CSortDemoView

功能:
  以图形方式表示各个排序元素,动态演示元素的比较、移动、交换等过程。


CarithmeticView

功能:
  显示排序法代码,跟踪正在运行的那一行代码。
CvariableView

功能:
列出排序法中的变量,显示各变量的变化情况。

2.1.2 窗口间的通信
  某子窗口——>主框架窗口的指针——>各分隔条(CSplitterWnd 类的对象)——>分隔条分割的子窗口指针
2.1.3 演示原理
  首先,在CChooseView视中选择排序法,并弹出对话框接收用户的排序数据,同时程序检验数据的有效性。数据检验通过后将相关数据传给其它窗口,并让其显示。
  其次,开始运行该排序函数对数据进行排序。程序每读一行算法代码,就通知CarithmeticView视加亮该窗口中列出的算法中的对应行。程序每改变排序元素或者代码中变量的值,就将该变化传给CSortDemoView 视和CvariableView视,并让窗口刷新。从而达到右边三个视均与数据的排序过程同步的目的。其中,CChooseView中的按钮可以随时控制算法的运行,即对整个排序演示进行控制。
  最后,通过Sleep()函数可以让排序过程达到用户想要的速度。在Sleep()函数中嵌入消息的接收和传递代码,可以让程序随时响应用户的指令,达到适时控制的目的。
2.2、详细设计
2.2.1 静态切分窗口的实现
  静态分割器窗口是调用CSplitterWnd 类的CreatStatic成员函数创建的。CChooseView、CarithmeticView、CvariableView都是CFormView格式窗口,可以加入一些控件;CSortDemoView由向导自动生成。具体步骤如下:
  1、新建三个对话框模版,用于创建一个CFormView的派生类。对话框ID分别为IDD_FORMVIEW、IDD_ARITHMETIC_FORMVIEW、IDD_VARIABLE_FORMVIEW,并修改其属性:Style置为Child,Border置为None,去掉Title Bar的勾选。使用ClassWizared为对话框模板资源分别添加名为CChooseView、CarithmeticView、CvariableView的视图类,选择基类为CFormView。
  2、在主框架窗口类CMainFrame头文件MainFrm.h中声明CSplitterWnd 类对象。代码如下:
   public:
     CSplitterWnd m_wndSplitter1; // 用于产生第一次静态切分
    CSplitterWnd m_wndSplitter2; // 用于产生第二次静态切分
    CSplitterWnd m_wndSplitter3; // 用于产生第三次静态切分
   3、使用ClassWizared为框架窗口类CMainFrame添加基于OnCreateClient消息的OnCreateClient函数,函数原形为:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) ;
在MainFrm.Cpp文件的开始部分添加包含文件:
      #include "SortDemoDoc.h"
      #include "SortDemoView.h"
      #include "ChooseView.h"
      #include "arithmeticView.h"
      #include "variableView.h"
   在OnCreateClient(参数)函数中通过CsplitterWnd类对象m_wndSplitter(1..3)调用函数CreateStatic(参数)产生静态切分窗格,调用函数CreateView(参数)为窗格产生视图。最后 return 1,不再调用基类的OnCreateClient(参数)函数。
2.2.2 CChooseView窗口的实现
  1、为IDD_FORMVIEW对话框模板资源添加控件,并布局成如图2所示格式。各控件
属性如表1所示(注意:对于一组单选按钮,只需对第一个单选按钮设置Group属性,并添加成员变量)。

图 2


表 1
控件类型 ID号 描述 变量类型 变量名 属性
Radio Button IDC_BUBBLESORT 冒泡排序 int m_kindOfSort Group
Radio Button IDC_QUICKSORT 快速排序
Radio Button IDC_INSERTIONSORT 直接插入排序
Radio Button IDC_BIINSERTIONSORT 折半插入排序
Radio Button IDC_TREESORT 树形选择排序
Button IDC_START 开始演示
Button IDC_PACE 速度调整 Disabled
Button IDC_PAUSE 暂停 Disabled
Button IDC_CONTINUE 继续 Disabled
Button IDC_END 结束 Disabled
  
  2、在CChooseView中为5个按钮控件映射消息处理函数。如表2所示:
   表 2
ID号 描述 消息 函数
IDC_START 开始演示

BN_CLICKEN
OnStart()
IDC_PACE 速度调整 OnPace()
IDC_PAUSE 暂停 OnPause()
IDC_CONTINUE 继续 OnContinue()
IDC_END 结束 OnEnd()
3、创建“排序元素输入”对话框模板资源,ID为IDD_DIALOG_ELEMENTS。该对话框由“开始演示”按钮调用,各控件布局如图3所示,属性如表3所示。
图 3


表 3
控件类型 ID号 描述 变量类型 变量名
Edit Box IDC_EDIT_NUM 输入元素个数 int m_nSize //(2—10)
Edit Box IDC_EDIT_ELEMENT 输入各元素 CString m_strElements
Static Text IDC_STATIC_OK 确定
Static Text IDC_STATIC_CANCEL 取消
Static Text IDC_STATIC_DEFAULT 系统默认

  为该对话框创建新类CElement,基类为CDialog。并为“确定”、“取消”、“系统默认”三个静态文本控件映射BN_CLICKEN消息处理函数:
       OnStaticOk()、OnStaticCancel()、OnStaticDefault()
为让“确定”和“取消”静态文本起到按钮的作用,可在这两个函数中分别调用:
   CDialog::OnOK()、 CDialog::OnCancel()
4、为了让用户输入有效的数据,可以派生一个CEdit类的子类CElemEdit,将“排序元素输入”对话框模板中的两个Edit Box映射成为只接收指定输入的新型控件,在该子类中重新处理WM_CHAR消息即可。具体步骤如下:
 (1)、创建CEdit类的子类CElemEdit。利用CElemEdit::SubclassDlgItem()函数把Edit Box控件与当前对话框窗口对象动态连接起来,从而使该控件具有新的特性。实现方法:在CElement.h中添加#include "ElemEdit.h",并为该类添加成员变量
private:
CElemEdit m_NumEdit;
CElemEdit m_ElementEdit;
为类CElement映射WM_INITDIALOG消息,在BOOL CElement::OnInitDialog()中添加
     m_NumEdit.SubclassDlgItem(IDC_EDIT_NUM,this);
m_ElementEdit.SubclassDlgItem(IDC_EDIT_ELEMENT,this);
 (2)、在void CElemEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)中指定编辑框的准许字符。
5、在void CElement:: OnStaticOk()中进一步检查用户输入的数据。
6、在void CElement:: OnStaticDefault()中设置该软件默认的一组排序元素。
7、为CChooseView类添加成员变量用于存储排序元素个数和各个元素:
   public:
int m_nSize; // 元素个数
double elements[10]; // 各个元素
在void CChooseView:: OnStart()中弹出“排序元素输入”对话框,获得用户输入的排序元素个数和各个元素,并存入m_nSize和elements[]中,再根据用户选择的排序法调用相应得排序函数。在该函数中用到了以下自定义函数:
   void CChooseView::GetElements(CString str,int nSize,CStringArray& list);
   //从以空格为间隔的数字串str中取出nSize个数字子串,存放在字符串数组list[]中
8、在void CChooseView::OnPace()中弹出“速度选择”对话框,获得用户选择的演示速度。该对话框模版ID为IDD_PACE_SET,添加一个Slider控件和两个Static Text控件。对话框如图4所示。
图 4


  为该对话框创建新类CPace,基类:CDialog。并为“确定”和“取消”两个静态文本控件映射BN_CLICKEN消息处理函数:OnStaticOk()、OnStaticCancel()
为让“确定”和“取消”静态文本起到按钮的作用,可在这两个函数中分别调用:
   CDialog::OnOK()、 CDialog::OnCancel()
   添加类成员变量public: int pace,为Slider控件添加成员变量:CSliderCtrl slider。添加滑动条滑动消息WM_HSCROLL的处理函数:
   void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
在该函数中获得滑动条值,暂存pace中:
          pace=slider.GetPos();
   当该对话框单击“确定”退出时,void CChooseView::OnPace()函数获得pace值,并赋值给CChooseView中控制演示速度的类成员变量int sleep。从而达到调节演示速度的目的。
   在BOOL CPace::OnInitDialog()中初始化Slider控件:设置滑动条位置和滑动范围。
9、为CChooseView类添加成员变量:bool pause ,用于标记“暂停”状态。要结束暂停,只需在void CChooseView::OnContinue()中置pause为false 。
   在void CChooseView::OnPause()中调用Sleep()库函数让程序处于睡眠状态,但要使程序能够及时响应“继续”按钮的单击消息,还必须手动调用消息传送函数。
OnPause()函数实现代码:
void CChooseView::OnPause()
{
// TODO: Add your control notification handler code here
pause=true;
MSG message;
while(pause)
{
Sleep(30);
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)) // 每隔一段时间交出控制权一次
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
}
10、让正在演示的排序算法结束。该功能实现思路是:置CSortDemoView、CarithmeticView和CvariableView三个窗口的跟踪标志无效,并让三个窗口清空、刷新,这样三个窗口均回到起始状态;同时置排序减速标志无效,CChooseView视会在几毫秒内结束排序。该函数中也包含一些善后工作。具体实现函数为:
   void CChooseView::OnEnd();
   
   
   
   
   
   
   
   
   
2.2.3 CSortDemoView窗口的实现
1、画图函数。CSortDemoView的画图根据排序法的不同可以分为三类,如表4所示。
表 4
排序法 画图函数 效果预览
冒泡排序法 交换类
void OnDo1(参数)
图 5
快速排序法
直接插入排序法 插入类
void OnDo2(参数)
图 6
折半插入排序法
树形选择排序法 二叉树类
void OnDo3(参数)
图 7

图 5


                 图6
                 


图 7

(1)、交换类。函数原形:
   void OnDo1(double array[],int size,int sel1=-1,int sel2=-1);
参数:
double array[] // 传递排序的各个元素
int size // 元素个数
int sel1,int sel2 // 红色标记
该函数用到了CSortDemoView类的成员变量:
public: int sel[2]; // 用于存储参数
   int m_nSize; // 用于存储排序元素个数
   double elements[10]; // 用于存储各个排序元素
 (2)、插入类。函数原形:
void OnDo2(double array[],int size,int order=-1,int state=-1,int index=-1);
参数:
double array[] // 传递排序的各个元素
int size // 元素个数
int order // 记录有序部分
int state // 操作类型
int index // 操作对象序号
该函数用到了CSortDemoView类的成员变量:
public: CRect rect[22]; // 存储圆
CPoint point[22]; // 存储圆心位置
CString str[11]; // 存储圆中显示的数字
   int do2[5]; // 存储参数
 (3)、二叉树类。函数原形:
    void OnDo3(double array1[],int m_nsize,double array[],int floor,int sel1=-1,int sel2=-1,
int nstr=-1);
参数:
double array1[] // 传递排序的各个元素
int m_nsize // 元素个数
double array[] // 二叉树中各个元素值
int floor // 二叉树的深度
int sel1,int sel2 // 红色显示
   int nstr // 输出所有元素标记
该函数用到了CSortDemoView类的成员变量:
public: CRect rect[22]; // 存储圆
CPoint point[22]; // 存储圆心位置
CString str[11]; // 存储圆中显示的数字
   int sel[2]; // 存储参数
   int do2[5]; // 存储参数
   int m_nSize; // 用于存储排序元素个数
   double elements[10]; // 用于存储各个排序元素
   double Array[31]; // 存储二叉树结点
   double text[10]; // 存储排好序的元素
   CString do3[10]; // 存储排序元素
2、刷新窗口。当窗口刷新时,为让窗口继续画图。可在void CSortDemoView::OnDraw(CDC* pDC)函数中根据排序法调用相应的画图函数。画图函数中存储下来的参数派上用场。
2.2.4 CarithmeticView窗口的实现
  1、为IDD_ARITHMETIC_FORMVIEW对话框模板资源添加控件,并布局成如图8所示格式。各控件的属性如表5所示。
   图 8
   
   
    表 5
控件类型 ID号 描述 变量类型 变量名 属性
Static IDC_STATIC_ARITHMETIC 显示算法名称 CString m_static
List Box IDC_LIST1 列出算法代码 CListBox m_List Vertical scroll
   
   2、添加算法代码。添加函数void CarithmeticView::Add()。该函数根据用户选择的排序法改变Static静态文本,让其显示该算法名称,同时在List Box中列出该算法的代码。
2.2.5 CvariableView窗口的实现
  1、为IDD_VARIABLE_FORMVIEW对话框模板资源添加控件,并布局成如图9所示格式。各控件的属性如表6所示。
图 9
      
       表 6
控件类型 ID号 描述 变量类型 变量名 属性
Static IDC_STATIC 变量
List Control IDC_LIST1 列出变量和当前值 CListCtrl m_ListCtrl Report

2、初始化列表控件。在void CvariableView::OnInitialUpdate()中添加以下代码:
// 添加列标题
m_ListCtrl.InsertColumn(0,"变量",LVCFMT_CENTER,52,0);
m_ListCtrl.InsertColumn(1,"当前值",LVCFMT_CENTER,304,0);
    // 显示网格线
m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
  3、添加排序算法变量及排序元素初始值。函数原形:
         void CvariableView::Add(double array[],int size,int Bool);
参数:
double array[] // 排序元素
   int size // 元素个数
   int Bool // 加载变量名标记
4、更新变量当前值。函数原形:
   void CvariableView::Change(int line,double value);
参数:
int line // 变量在列表控件中的位置
   double value // 变量当前值

2.2.6 窗口之间的通信
1、在CChooseView窗口中获得其它窗口的指针。其代码为:
// 获得主框架窗口的指针
CMainFrame* pwnd=(CMainFrame*)AfxGetMainWnd();
// 获得CSortDemoView窗口的指针
CSortDemoView*pSortDemoView=(CSortDemoView*)(pwnd->m_wndSplitter2.GetPane(0,0));
// 获得CarithmeticView窗口的指针
CarithmeticView* pari=(CarithmeticView*)(pwnd->m_wndSplitter3.GetPane(0,0));
// 获得CvariableView窗口的指针
CvariableView* pvar=(CvariableView*)(pwnd->m_wndSplitter3.GetPane(0,1));



还有一些发不上来了。
大家帮忙看看请人将这个做出来大概需要多少钱?







...全文
217 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
caewow 2014-05-06
  • 打赏
  • 举报
回复
看楼上诸位说的,搞得我都想接受这活儿了 唉,可惜我只是一菜鸟
gz_qmc 2014-05-05
  • 打赏
  • 举报
回复
一般公司做,老板要提成 估计就要上浮动40%
BeanJoy 2014-05-05
  • 打赏
  • 举报
回复
看了前面的要求,觉得比较有意思。 一下子就想到了VC6的调试,源代码窗口、堆栈窗口、变量窗口、Watch窗口。
zhongyispace 2014-05-05
  • 打赏
  • 举报
回复
我不要钱! !!!!
gz_qmc 2014-05-05
  • 打赏
  • 举报
回复
1500~2000吧 技术没有难度,都是堆代码 连调带写按5天计算 每天300~400 当然,你可以通过讨价还价 一些新手可能每天100~150也做 估计最底也的600以上
Jarrylogin 2014-05-05
  • 打赏
  • 举报
回复
大家帮忙看看请人将这个做出来大概需要多少钱? 我估算要到350*12天=4200元吧。对搞IT的不能太抠。
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
参考MSDN98\SAMPLES\VC98\MFC\TUTORIAL\SCRIBBLE\STEP1~7\*.*

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧