CWnd::UpdateData()是做什么用的?该在什么时候使用?

flyingghost 2003-11-07 02:15:53
如题。

附MSDN中解释,但不大明白:)
BOOL CWnd::UpdateData(BOOL bSaveAndValidate = TRUE )是什么意思?
CWnd::UpdateDataSee Also
CWnd Overview | Class Members | Hierarchy Chart | CWnd::DoDataExchange
Call this member function to initialize data in a dialog box, or to retrieve and validate dialog data.

BOOL UpdateData(
BOOL bSaveAndValidate = TRUE
);
Parameters
bSaveAndValidate
Flag that indicates whether dialog box is being initialized (FALSE) or data is being retrieved (TRUE).
Return Value
Nonzero if the operation is successful; otherwise 0. If bSaveAndValidate is TRUE, then a return value of nonzero means that the data is successfully validated.

Remarks
The framework automatically calls UpdateData with bSaveAndValidate set to FALSE when a modal dialog box is created in the default implementation of CDialog::OnInitDialog. The call occurs before the dialog box is visible. The default implementation of CDialog::OnOK calls this member function with bSaveAndValidate set to TRUE to retrieve the data, and if successful, will close the dialog box. (If the Cancel button is clicked in the dialog box, the dialog box is closed without the data being retrieved.)
...全文
200 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingghost 2003-11-07
  • 打赏
  • 举报
回复
收获真是快啊!谢谢大家!
vcforever 2003-11-07
  • 打赏
  • 举报
回复
UpdateData(true);
用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量)
例如:你在你的窗体中有一个Edit控件,为这个控件关联了CString类型的变量m_strName;
你在控件中添入内容之后,必须调用UpdateData(true);才能把你添入的内容传给m_strName这个变量

UpdateData(false);
和上面的正好相反,还是以上面的Edit为例,当你在程序中改变了m_strName变量的内容的时候,如果你想让那个Edit也显示更新后的m_strName,就必须调用UpdateData(false);
这样在你的Edit中才能显示更新完的变量的值!

希望对你有所帮助!
wangtao2003new 2003-11-07
  • 打赏
  • 举报
回复
用来更新例如编辑框中的数据信息的。
例如:获取和设置编辑框中的文字
void CEditDlg::OnGetText()
{
UpDateData();
if(m_strFirst.IsEmpty()==FALSE)
{
MessageBox(m_StrFirst);
m_strFirst.MakeReverse();
UpdateData(FALSE);
}
}
ablefirst 2003-11-07
  • 打赏
  • 举报
回复
如果UpdateDate带有一个FALSE参数调用,函数会把数据从数据成员传送对话框控件。如果参数是TRUE,则函数所数据从对话框控件传送到数据成员
计算器 mfc 代码 基于VC++简易计算器实验详细过程 硬件环境: 软件环境:WinXP+VC++6.0 一、实验目的:构造一个类似Windows自带的计算器一样的简易计算器,能够连续进行加、减、乘、除四则整数运算,并能随时清除计算结果进行下一次计算。 二、具体实验步骤: 1、添加编辑框对应的变量m_Display 2、添加运算符类型变量 char CompuType; //用于存储运算符类型 CString FirstInput; //用于保存运算符前面的输入值 3、添加各种按钮的单击事件处理方法的函数 控件名称列表: 主对话框标识:IDD_CALC_DIALOG 关于对话框标识:IDD_ABOUTBOX 编辑框: IDC_EDIT 运算符按钮标识: 加: IDC_BUTTONADD 减: IDC_BUTTONSUBTRACT 乘: IDC_BUTTONMULTIPLY 除: IDC_BUTTONDIVIDE 等于: IDC_BUTTONEQUER 0~9数字符按钮标识: 7:IDC_BUTTONSEVEN 8:DC_BUTTONEIGHT 9: IDC_BUTTONNINE 4:IDC_BUTTONFOUR 5:IDC_BUTTONFIVE 6:IDC_BUTTONSIX 1:C_BUTTONONE 2:IDC_BUTTONTWO 3:IDC_BUTTONTHREE 0:IDC_BUTTONZERO 清除按钮标识:IDC_BUTTONCLEAR 关于按钮标识:IDC_BUTTONABOUT 类的成员变量: class CCalcDlg : public CDialog { // Construction public: char CompuType; //用于存储运算符类型 CCalcDlg(CWnd* pParent = NULL); // standard constructor //… (省略) protected: CString FirstInput; //用于保存运算符前面的输入值 //… (省略) }; 按钮单击的事件对应方法程序列表: void CCalcDlg::OnButtonone() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("1"); UpdateData(FALSE); } void CCalcDlg::OnButtontwo() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("2"); UpdateData(FALSE); } void CCalcDlg::OnButtonthree() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("3"); UpdateData(FALSE); } void CCalcDlg::OnButtonfour() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("4"); UpdateData(FALSE); } void CCalcDlg::OnButtonfive() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("5"); UpdateData(FALSE); } void CCalcDlg::OnButtonsix() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("6"); UpdateData(FALSE); } void CCalcDlg::OnButtonseven() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("7"); UpdateData(FALSE); } void CCalcDlg::OnButtoneight() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("8"); UpdateData(FALSE); } void CCalcDlg::OnButtonnine() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("9"); UpdateData(FALSE); } void CCalcDlg::OnButtonzero() { // TODO: Add your control notification handler code here m_Display = m_Display+_T("0"); UpdateData(FALSE); } void CCalcDlg::OnButtonadd() { // TODO: Add your control notification handler code here FirstInput = m_Display; m_Display = _T(""); UpdateData(FALSE); CompuType='+'; } void CCalcDlg::OnButtonsubtract() { // TODO: Add your control notification handler code here FirstInput = m_Display; m_Display = _T(""); UpdateData(FALSE); CompuType='-'; } void CCalcDlg::OnButtondivide() { // TODO: Add your control notification handler code here FirstInput = m_Display; m_Display = _T(""); UpdateData(FALSE); CompuType='/'; } void CCalcDlg::OnButtonmultiply() { // TODO: Add your control notification handler code here FirstInput = m_Display; m_Display = _T(""); UpdateData(FALSE); CompuType='*'; } void CCalcDlg::OnButtonequer() { // TODO: Add your control notification handler code here int TempResult; //定义存储结果的临时变量 int FirstInputValue,NewInputValue; //定义进行运算的临时变量 FirstInputValue=atoi(FirstInput.GetBuffer(24)); //将字符串变量转换成整型值 FirstInput.ReleaseBuffer(-1); NewInputValue=atoi(m_Display.GetBuffer(24)); //将字符串变量转换成整型值 m_Display.ReleaseBuffer(-1); switch(CompuType) //开关语句判断运算符类型 { case '+': TempResult = FirstInputValue + NewInputValue; //将加法运算结果传给出临时变量TempResult break; case '-': TempResult = FirstInputValue - NewInputValue; //将减法运算结果传给出临时变量TempResult break; case '*': TempResult = FirstInputValue * NewInputValue; //将乘法运算结果传给出临时变量TempResult break; case '/': TempResult = FirstInputValue / NewInputValue; //将除法运算结果传给出临时变量TempResult break; } sprintf(m_Display.GetBuffer(24),"%d",TempResult); //将运算结果变量值传递给出编辑控件变量m_Display m_Display.ReleaseBuffer(-1); UpdateData(FALSE); //刷新编辑控件变量,并在编辑框中显示运算结果 } void CCalcDlg::OnButtonclear() { // TODO: Add your control notification handler code here m_Display.Empty(); //清空存储在变量m_Display中的数据 UpdateData(FALSE); } void CCalcDlg::OnButtonabout() { // TODO: Add your control notification handler code here CAboutDlg DlgAbout; DlgAbout.DoModal();
MFC计算器课程设计报告 地信091 指导老师: 2010.11.15 一.题目:利用MFC框架编写简易计算器 要求使用MFC框架在Visual Studio 6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpace CE C功能。 二.设计过程 1. Windows消息处理机制的理解 首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。 2. 界面的设计 仿照Windows附件里面的计算器,在资源视图中画好界面,如图: 主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 3. 建立的变量,控件的命名,对应的消息处理函数对应表 ID CAPTION Message Handler IDD_CALC_DIALOG 简易计算器 1.0 Beta1版 N/A IDC_NUM0 0 OnNum0 IDC_NUM1 1 OnNum1 IDC_NUM2 2 OnNum2 IDC_NUM3 3 OnNum3 IDC_NUM4 4 OnNum4 IDC_NUM5 5 OnNum5 IDC_NUM6 6 OnNum6 IDC_NUM7 7 OnNum7 IDC_NUM8 8 OnNum8 IDC_NUM9 9 OnNum9 IDC_NEG +/- OnNeg IDC_PT . OnPt IDC_DIV / OnDiv IDC_MUL * OnMul IDC_MIN - OnMin IDC_ADD + OnAdd IDC_BACKSPACE BACK OnBackspace IDC_CE CE OnCe IDC_CLEAR C OnClear IDC_EQU = OnEqu IDC_DIS N/A N/A OnCal(double num) 变量定义: double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; //Edit控件上需要显示的数字 BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; //保存计算过程中的前一个数字, double numsecond;//保存计算过程中的第二个数字 char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’ 变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0; 4. 设计思路 a) 首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储。符号需要一个char op来存储。 b) 然后考虑在计算的过程中,numfirst和numsecond的存储状态有三种,一种是numfirst==0 && numsecond==0 也就是程序刚开始运行还没有开始录入数字的状态。二种是numfirst!=0 && numsecond==0 也就是第一个数字已经录入,符号也已经录入时候把m_Dis的值直接赋值给numfirst,第三种是numfirst!=0 &&numsecond!=0,表示可以通过op来把两数合并为一个数。 c) 考虑到该计算器支持连续的计算,比如3.33+1.33*88/96= ?。所以必须在点符号Button也要计算出之前的结果,通过判断op,来计算,把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类。 d) 因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别出来小数和整数。 5. 成员函数及其释义 因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(double num)来简化源代码长度,增加模块性。 void CCalcDlg::OnCal(double num) { //分三种状态来处理 if(numfirst!=0 && numsecond!=0) { if(point_flag==TRUE) //判定为小数 { poz*=0.1; //小数进位 m_Dis=m_Dis+poz*num;//递增 UpdateData(false); //把结果从内存传递到屏幕 } else { m_Dis=m_Dis*10+num; UpdateData(false); } } if(numfirst!=0 && numsecond==0) { if(point_flag==TRUE) { poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData(false); } else//判定为整数 { m_Dis=m_Dis*10+num;//递增 UpdateData(false); } } if(numfirst==0 && numsecond==0) { if(point_flag==TRUE) { poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData(false); } else { m_Dis=m_Dis*10+num; UpdateData(false); } } } 以OnAdd()为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算。 void CCalcDlg::OnAdd() { //根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { numsecond=m_Dis; numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕 numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; //屏幕的值同时清空 } if(numfirst!=0 && numsecond==0&&op=='-') { numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='*') { numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='/') { numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst==0 && numsecond==0) { //该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; //屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; } op='+'; //最后记录最后一个操作是+ poz=1;//小数点位置归位 point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE } “+/-“按钮的处理函数 void CCalcDlg::OnNeg() { m_Dis=-m_Dis;//换个符号,其他都一样 UpdateData(FALSE); poz=1; point_flag=FALSE; } ‘.’按钮的处理函数 void CCalcDlg::OnPt() { point_flag=TRUE; //把标志位改为“小数点”状态 } “Backspace”按钮的处理 void CCalcDlg::OnBackspace() { //主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换 char buffer[30]; //定义个装字符的数组 _gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为string for(int i=0;i<30;i++) { if(buffer[i]=='.'&& buffer[i+1]==0)//判断是否为整数 { point_flag=FALSE; //标志位设置为“整数位” break; } } if(point_flag==TRUE) //如果是小数 { for(int j=0;jmessage,pMsg->wParam,pMsg->lParam); return CDialog::PreTranslateMessage(pMsg); } // CalculatorDlg.cpp : implementation file // #include "stdafx.h" #include "Calculator.h" #include "CalculatorDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCalculatorDlg dialog CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCalculatorDlg) poz=1; numfirst=0; numsecond=0; op=0; m_Dis = 0.0; // num=0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CCalculatorDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCalculatorDlg) DDX_Text(pDX, IDC_EDIT, m_Dis); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) //{{AFX_MSG_MAP(CCalculatorDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_NUM0, OnNum0) ON_BN_CLICKED(IDC_NUM1, OnNum1) ON_BN_CLICKED(IDC_NUM2, OnNum2) ON_BN_CLICKED(IDC_NUM3, OnNum3) ON_BN_CLICKED(IDC_NUM4, OnNum4) ON_BN_CLICKED(IDC_NUM5, OnNum5) ON_BN_CLICKED(IDC_NUM6, OnNum6) ON_BN_CLICKED(IDC_NUM7, OnNum7) ON_BN_CLICKED(IDC_NUM8, OnNum8) ON_BN_CLICKED(IDC_NUM9, OnNum9) ON_BN_CLICKED(IDC_ADD, OnAdd) ON_BN_CLICKED(IDC_NEG, OnNeg) ON_BN_CLICKED(IDC_PT, OnPt) ON_BN_CLICKED(IDC_BACKSPACE, OnBackspace) ON_BN_CLICKED(IDC_CE, OnCe) ON_BN_CLICKED(IDC_CLEAR, OnClear) ON_BN_CLICKED(IDC_MIN, OnMin) ON_BN_CLICKED(IDC_MUL, OnMul) ON_BN_CLICKED(IDC_DIV, OnDiv) ON_BN_CLICKED(IDC_EOU, OnEou) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCalculatorDlg message handlers BOOL CCalculatorDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CCalculatorDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CCalculatorDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CCalculatorDlg::OnCal(double num) {//分三种状态来处理 if(numfirst!=0 && numsecond!=0) { if(point_flag==TRUE) //判定为小数 { poz*=0.1; //小数进位 m_Dis=m_Dis+poz*num;//递增 UpdateData(false); //把结果从内存传递到屏幕 } else { m_Dis=m_Dis*10+num; UpdateData(false); } } if(numfirst!=0 && numsecond==0) { if(point_flag==TRUE) { poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData(false); } else//判定为整数 { m_Dis=m_Dis*10+num;//递增 UpdateData(false); } } if(numfirst==0 && numsecond==0) { if(point_flag==TRUE) { poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData(false); } else { m_Dis=m_Dis*10+num; UpdateData(false); } } } void CCalculatorDlg::OnNum0() { // TODO: Add your control notification handler code here OnCal(0); } void CCalculatorDlg::OnNum1() { // TODO: Add your control notification handler code here OnCal(1); } void CCalculatorDlg::OnNum2() { // TODO: Add your control notification handler code here OnCal(2); } void CCalculatorDlg::OnNum3() { // TODO: Add your control notification handler code here OnCal(3); } void CCalculatorDlg::OnNum4() { // TODO: Add your control notification handler code here OnCal(4); } void CCalculatorDlg::OnNum5() { // TODO: Add your control notification handler code here OnCal(5); } void CCalculatorDlg::OnNum6() { // TODO: Add your control notification handler code here OnCal(6); } void CCalculatorDlg::OnNum7() { // TODO: Add your control notification handler code here OnCal(7); } void CCalculatorDlg::OnNum8() { // TODO: Add your control notification handler code here OnCal(8); } void CCalculatorDlg::OnNum9() { // TODO: Add your control notification handler code here OnCal(9); } void CCalculatorDlg::OnAdd() { // TODO: Add your control notification handler code here { //根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { numsecond=m_Dis; numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕 numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; //屏幕的值同时清空 } if(numfirst!=0 && numsecond==0&&op=='-') { numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='*') { numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='/') { numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst==0 && numsecond==0) { //该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; //屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; } op='+'; //最后记录最后一个操作是+ poz=1;//小数点位置归位 point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE } } void CCalculatorDlg::OnNeg() { // TODO: Add your control notification handler code here m_Dis=-m_Dis;//换个符号,其他都一样 UpdateData(FALSE); poz=1; point_flag=FALSE; } void CCalculatorDlg::OnPt() { // TODO: Add your control notification handler code here point_flag=TRUE; //把标志位改为"小数点"状态 } void CCalculatorDlg::OnBackspace() { // TODO: Add your control notification handler code here //主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换 char buffer[30]; //定义个装字符的数组 _gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为string for(int i=0;i<30;i++) { if(buffer[i]=='.'&& buffer[i+1]==0)//判断是否为整数 { point_flag=FALSE; //标志位设置为"整数位" break; } } if(point_flag==TRUE) //如果是小数 { for(int j=0;j<30;j++) { if(buffer[j]==0) { buffer[j-1]=0; //把'\0'之前的字符赋值为'\0',就相当于剪掉最后一位 break; } } } else //如果是整数 { buffer[i-1]=0; //剪掉'.'之前那位 } m_Dis=strtod(buffer,NULL);//再用strtod弄成浮点数 UpdateData(FALSE); poz=1; } void CCalculatorDlg::OnCe() { // TODO: Add your control notification handler code here if(numfirst!=0 && numsecond==0)//CE只能修改第二个数字 { m_Dis=0; //把屏幕的值赋值为0 UpdateData(FALSE);//并显示出来 } } void CCalculatorDlg::OnClear() { // TODO: Add your control notification handler code here op=NULL; //清空符号 numfirst=0;//清空第一个数字 numsecond=0;//清空第二个数字 point_flag=FALSE;//改为默认整数位 poz=1;//小数点归位 m_Dis=0; UpdateData(FALSE); //屏幕显示归0 } void CCalculatorDlg::OnMin() { // TODO: Add your control notification handler code here { //根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { numsecond=m_Dis; numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕 numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; //屏幕的值同时清空 } if(numfirst!=0 && numsecond==0&&op=='-') { numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='*') { numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='/') { numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst==0 && numsecond==0) { //该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; //屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; } op='-'; //最后记录最后一个操作是+ poz=1;//小数点位置归位 point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE } } void CCalculatorDlg::OnMul() { // TODO: Add your control notification handler code here { //根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { numsecond=m_Dis; numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕 numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; //屏幕的值同时清空 } if(numfirst!=0 && numsecond==0&&op=='-') { numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='*') { numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='/') { numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst==0 && numsecond==0) { //该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; //屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; } op='*'; //最后记录最后一个操作是+ poz=1;//小数点位置归位 point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE } } void CCalculatorDlg::OnDiv() { // TODO: Add your control notification handler code here { //根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { numsecond=m_Dis; numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕 numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; //屏幕的值同时清空 } if(numfirst!=0 && numsecond==0&&op=='-') { numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='*') { numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='/') { numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst==0 && numsecond==0) { //该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; //屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; } op='/'; //最后记录最后一个操作是+ poz=1;//小数点位置归位 point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE } } void CCalculatorDlg::OnEou() { // TODO: Add your control notification handler code here { //根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { numsecond=m_Dis; numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕 numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; //屏幕的值同时清空 } if(numfirst!=0 && numsecond==0&&op=='-') { numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='*') { numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst!=0 && numsecond==0&&op=='/') { numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; } if(numfirst==0 && numsecond==0) { //该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; //屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; } op='='; //最后记录最后一个操作是+ poz=1;//小数点位置归位 point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE } } 总结: 本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小组开发的团结协作能力。对OOP编程的理解进一步加深。但是程序仍然没存在一定的问题,比如除数不能为0的Exception handle,符号键多次点击结果混乱。由于时间仓促,如果有更多的时间,必定这些问题会迎刃而解。通过这次课程设计,以后Windows 应用程序势必会轻车熟路。
主要是模拟初中的物理实验的有源代码,可供初学者使用! 采用 MFC 编制 MVC 模式之球体演示程序 作者:haykey 下载源代码   在传统面向过程的程序设计中,往往采用 Input-Processing-Output 模式,这“归功”于 DOS 操作系统的单任务。当 Windows 图形界面 OS 出现后,MVC(Model-View-Controller)模型更适合 Windows 图形界面程序的设计,它将数据处理和数据显示分离开,使维护,扩展系统更加灵活 。其中,View:负责 显示数据,它从Model处获得数据然后显示。当然,一个Model会有用户可从不同角度来观察的多个View。Model:存储数据以及对数据进行各种运算和处理 。Controller:负责接受用户输入,并且把用户输入转换成对 Model 的操作。因此Controller 可能会修改 Model 的数据,当数据修改后,更新 View。其结构示意图如下:   一直采用MFC编程的朋友可能不太熟悉它,这是因为MFC的文档视图结构就是基于MVC的高层结构,这蒙蔽了我们的双眼。虽然MS替我们了,我们还是有必要接触它,以在SDK or 其他地方有的放矢。我了一个球体演示的例子,其界面如下:   左侧两个表面积和体积Edit让使用者从文本的角度精确地观察,我们称其为TextView。右侧为从CStatic派生的CGraphicView,使得人们可直观地观察Sphere.对话窗口CMVCSphereDlg是控制器,来获取用户的键盘输入(输入半径后回车)和在Static上的鼠标点击与拖动(可动态调整球体半径并实时反馈球体变化)而CSphere类是模型,存储了球体半径和计算表面积,计算体积等处理半径数据的操作.   现在让我们详细看看代码,来感受下Model,View,Controller之间如何关联,如何协同工作的。 class CSphere { public: ... .... //更新Graphic-VIEW BOOL UpdateGraphicView(HWND hWnd,const CRect &rect,BOOL bErase); //更新Text-VIEW void UpdateTextView(); //外界Controller的接口:设置球体半径 void SetRadius(float r); private: //球体半径 float m_fRadius; //计算球体表面积 float CalculateArea(float radius); //计算球体体积 float CSphere::CalculateVolumn(float radius); };   这里面 UpdateTextView,UpdateTextView 就是当用户输入新半径或拖动鼠标 Controller 捕获后通知 Model,Model 通知两个View更新显示 。具体代码如下: BOOL CSphere::UpdateGraphicView(HWND hWnd,const CRect &rect,BOOL bErase) { //data format examination if(!::IsWindow(hWnd)||::IsRectEmpty(&rect)) { AfxMessageBox("View is not created by now or rect is empty"); return false; } //get the window pointer from window handle CWnd *pView = CWnd::FromHandle(hWnd); if(pView == NULL) return false; //set graphic view''s radius in order to painting ((CGraphicView*)pView)->SetRadius(m_fRadius); bPaintSphere = true;//set paint tag true //repaint if(!::InvalidateRect(hWnd,&rect,bErase)&& !::UpdateWindow(hWnd)) { AfxMessageBox("UpdateView failed"); return true; } pView = NULL; return false; } void CSphere::UpdateTextView() { CMVCSphereDlg *parent = (CMVCSphereDlg *)AfxGetMainWnd(); CWnd *wnd1 = parent->GetDlgItem(IDC_SURFACE); CWnd *wnd2 = parent->GetDlgItem(IDC_VOLUMN); CString str; str.Format("%.2f平方米",CalculateArea(m_fRadius)); wnd1->SetWindowText(str); str.Empty(); str.Format("%.2f立方米",CalculateVolumn(m_fRadius)); wnd2->SetWindowText(str); } CGraphicView中绘图关键代码如下: void CGraphicView::OnPaint() { ... ..... if(!bPaintSphere) dc.DrawText("球体演示",rect,DT_VCENTER|DT_CENTER|DT_SINGLELINE); else { int r=(int)m_radius;//半径取整 CPoint MiddlePoint = rect.CenterPoint();//以矩形框的中心为球心 int x=MiddlePoint.x; int y=MiddlePoint.y; oldpen = (CPen*)dc.SelectObject(&solid_pen); oldbru = (CBrush*)dc.SelectObject(&brush); dc.Ellipse(x-r,y-r,x+r,y+r); //先画一个圆形 dc.SelectObject(&dash_pen); dc.Arc(x-r/2,y-r,x+r/2,y+r,x,y-r,x,y+r); //再画4个半圆弧 dc.Arc(x-r/2,y-r,x+r/2,y+r,x,y+r,x,y-r); dc.Arc(x-r,y-r/2,x+r,y+r/2,x-r,y,x+r,y); dc.Arc(x-r,y-r/2,x+r,y+r/2,x+r,y,x-r,y); ... ... } } 关于控制器CMVCSphereDlg响应用户输入半径回车核心代码如下: BOOL CMVCSphereDlg::PreTranslateMessage(MSG* pMsg) { UpdateData(); //violation examination if(m_r100) { AfxMessageBox("半径输入范围(0---100)"); return false; } if(pMsg->message == WM_KEYDOWN) if(pMsg->wParam == VK_RETURN)//回车 { CRect rect; m_GraphicView.GetClientRect(rect); m_Sphere.SetRadius(m_r);//把用户输入转换成对Model的操作 m_Sphere.UpdateTextView();//更新View m_Sphere.UpdateGraphicView(m_GraphicView.GetSafeHwnd(),rect,true);//更新View return true; } ... ... } 响应鼠标拖动核心代码如下: void CMVCSphereDlg::OnMouseMove(UINT nFlags, CPoint point) { CRect rect; m_GraphicView.GetClientRect(rect); CPoint middlepoint = rect.CenterPoint(); //if click on the graphic view if(rect.PtInRect(point)&&bIsDragging) { double dbDistance2 = (point.x-middlepoint.x)*(point.x-middlepoint.x)+(point.y-middlepoint.y)*(point.y-middlepoint.y); double dbDistance = sqrt(dbDistance2); if(dbDistance>100.) dbDistance = 100.; m_r = (float)dbDistance; //update radius edit UpdateData(false); m_Sphere.SetRadius(m_r); m_Sphere.UpdateTextView(); m_Sphere.UpdateGraphicView(m_GraphicView.GetSafeHwnd(),rect,true); } ... ... } 该程序功能简单,只是示例性说明采用 MFC 如何实现MVC模型,就当抛砖引玉了。具体实现参考源代码例子。
课程设计:简易计算器,逻辑运算 功能代码: // 计算器1Dlg.cpp : implementation file // #include "stdafx.h" #include "计算器1.h" #include "计算器1Dlg.h" #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About int focus=0,point1=0,point2=0,i=0,j=0; double temp1=1,temp2=1,equal; double temp3[100],temp4[100]; class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMy1Dlg dialog CMy1Dlg::CMy1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CMy1Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CMy1Dlg) m_1 = 0.0; m_2 = 0.0; m_result = 0.0; m_string = _T(""); m_string2 = _T(""); m_string3 = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMy1Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMy1Dlg) DDX_Control(pDX, IDC_BUTTON_point, m_point); DDX_Text(pDX, IDC_EDIT1, m_1); DDX_Text(pDX, IDC_EDIT2, m_2); DDX_Text(pDX, IDC_EDIT3, m_result); DDX_Text(pDX, IDC_EDIT4, m_string); DDX_Text(pDX, IDC_EDIT5, m_string2); DDX_Text(pDX, IDC_EDIT7, m_string3); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMy1Dlg, CDialog) //{{AFX_MSG_MAP(CMy1Dlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1) ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1) ON_EN_SETFOCUS(IDC_EDIT2, OnSetfocusEdit2) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON_point, OnBUTTONpoint) ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) ON_BN_CLICKED(IDC_BUTTON4, OnButton4) ON_BN_CLICKED(IDC_BUTTON5, OnButton5) ON_BN_CLICKED(IDC_BUTTON6, OnButton6) ON_BN_CLICKED(IDC_BUTTON7, OnButton7) ON_BN_CLICKED(IDC_BUTTON8, OnButton8) ON_BN_CLICKED(IDC_BUTTON9, OnButton9) ON_BN_CLICKED(IDC_BUTTON0, OnButton0) ON_BN_CLICKED(IDC_BUTTON_delete, OnBUTTONdelete) ON_BN_CLICKED(IDC_BUTTON_equal, OnBUTTONequal) ON_BN_CLICKED(IDC_BUTTON15, OnButton15) ON_BN_CLICKED(IDC_BUTTON16, OnButton16) ON_BN_CLICKED(IDC_BUTTON17, OnButton17) ON_BN_CLICKED(IDC_BUTTON18, OnButton18) ON_BN_CLICKED(IDC_BUTTON19, OnButton19) ON_BN_CLICKED(IDC_BUTTON20, OnButton20) ON_BN_CLICKED(IDC_BUTTON21, OnButton21) ON_BN_CLICKED(IDC_BUTTON22, OnButton22) ON_BN_CLICKED(IDC_BUTTON23, OnButton23) ON_BN_CLICKED(IDC_BUTTON24, OnButton24) ON_BN_CLICKED(IDC_BUTTON25, OnButton25) ON_BN_CLICKED(IDC_BUTTON27, OnButton27) ON_BN_CLICKED(IDC_BUTTON28, OnButton28) ON_BN_CLICKED(IDC_BUTTON29, OnButton29) ON_BN_CLICKED(IDC_BUTTON26, OnButton26) ON_BN_CLICKED(IDC_BUTTON30, OnButton30) ON_BN_CLICKED(IDC_BUTTON31, OnButton31) ON_BN_CLICKED(IDC_BUTTON32, OnButton32) ON_BN_CLICKED(IDC_BUTTON10, OnButton10) ON_BN_CLICKED(IDC_RADIO1, OnRadio1) ON_BN_CLICKED(IDC_RADIO2, OnRadio2) ON_COMMAND(ID_MENUITEM32792, OnMenuitem32792) ON_COMMAND(ID_MENUITEM32793, OnMenuitem32793) ON_COMMAND(ID_MENUITEM32794, OnMenuitem32794) ON_COMMAND(ID_MENUITEM32795, OnMenuitem32795) ON_COMMAND(ID_MENUITEM32796, OnMenuitem32796) ON_COMMAND(ID_MENUITEM32797, OnMenuitem32797) ON_COMMAND(ID_MENUITEM32798, OnMenuitem32798) ON_COMMAND(ID_MENUITEM32799, OnMenuitem32799) ON_COMMAND(ID_MENUITEM32800, OnMenuitem32800) ON_COMMAND(ID_MENUITEM32801, OnMenuitem32801) ON_COMMAND(ID_MENUITEM32802, OnMenuitem32802) ON_COMMAND(ID_MENUITEM32791, OnMenuitem32791) ON_COMMAND(ID_MENUITEM32790, OnMenuitem32790) ON_COMMAND(ID_MENUITEM32789, OnMenuitem32789) ON_COMMAND(ID_MENUITEM32788, OnMenuitem32788) ON_COMMAND(ID_MENUITEM32803, OnMenuitem32803) ON_COMMAND(ID_MENUITEM32804, OnMenuitem32804) ON_BN_CLICKED(IDC_BUTTON33, OnButton33) ON_BN_CLICKED(IDC_BUTTON14, OnButton14) ON_COMMAND(ID_MENUITEM32809, OnMenuitem32809) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMy1Dlg message handlers BOOL CMy1Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CMy1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CMy1Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(▭); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CMy1Dlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CMy1Dlg::OnSetfocusEdit1() { focus=1; } void CMy1Dlg::OnChangeEdit1() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here } void CMy1Dlg::OnSetfocusEdit2() { focus=2; } void CMy1Dlg::OnBUTTONpoint() //--------------------------------------------------小数点键 { if(focus==1) point1=1; if(focus==2) point2=1; } void CMy1Dlg::OnChangeEdit2() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here } void CMy1Dlg::OnButton1() //-----------------------------------------------------数字键1 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+1; i++;temp3[i]=m_1;} if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1+m_1; i++;temp3[i]=m_1;point1++;} if(focus==2&&point2;==0) {m_2=m_2*10+1; j++;temp4[j]=m_2;} if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton2() //-----------------------------------------------------数字键2 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+2; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*2+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+2; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*2+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton3() //-----------------------------------------------------数字键3 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+3; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*3+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+3; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*3+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton4() //-----------------------------------------------------数字键4 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+4; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*4+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+4; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*4+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton5() //-----------------------------------------------------数字键5 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+5; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*5+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+5; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*5+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton6() //-----------------------------------------------------数字键6 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+6; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*6+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+6; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*6+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton7() //-----------------------------------------------------数字键7 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+7; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*7+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+7; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*7+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton8() //-----------------------------------------------------数字键8 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+8; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*8+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+8; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*8+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton9() //-----------------------------------------------------数字键9 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10+9; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*9+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10+9; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*9+m_2; j++;temp4[j]=m_2;point2++;} UpdateData(false); } void CMy1Dlg::OnButton0() //-----------------------------------------------------数字键0 {UpdateData(true); if(focus==1&&point1;==0) {m_1=m_1*10; i++;temp3[i]=m_1;} else if(focus==1&&point1;>=1) {temp1=temp1/10;m_1=temp1*0+m_1; i++;temp3[i]=m_1;point1++;} else if(focus==2&&point2;==0) {m_2=m_2*10; j++;temp4[j]=m_2;} else if(focus==2&&point2;>=1) {temp2=temp2/10;m_2=temp2*0+m_2; j++;temp4[j]=m_1;point2++;} UpdateData(false); } void CMy1Dlg::OnBUTTONdelete() //--------------------------------退格 {UpdateData(true); if(focus==1) {i--;m_1=temp3[i]; if(point1>0) {point1=point1-1;} if(temp1<1) {temp1=temp1*10;} } if(focus==2) {j--;m_2=temp4[j]; if(point2>0) {point2=point2-1;} if(temp2<1) {temp2=temp2*10;} } UpdateData(false); } void CMy1Dlg::OnBUTTONequal() {//--------------------------------------------------------------------等号键 UpdateData(true); m_result=equal; UpdateData(false); } void CMy1Dlg::OnButton14() { // TODO: Add your control notification handler code here------------- 加法 UpdateData(true); equal=m_1+m_2; m_string="+"; UpdateData(false); } void CMy1Dlg::OnButton15() { // TODO: Add your control notification handler code here-----------减法 UpdateData(true); equal=m_1-m_2; m_string="-"; UpdateData(false); } void CMy1Dlg::OnButton16() {// TODO: Add your control notification handler code here--------------乘法 UpdateData(true); equal=m_1*m_2; m_string="*"; UpdateData(false); } void CMy1Dlg::OnButton17() { // TODO: Add your control notification handler code here--------除法 UpdateData(true); equal=m_1/m_2; m_string="/"; UpdateData(false); } void CMy1Dlg::OnButton18() { // TODO: Add your control notification handler code here------------------逻辑与 UpdateData(true); equal=m_1&&m_2; m_string="And";m_string2=" "; UpdateData(false); } void CMy1Dlg::OnButton19() { // TODO: Add your control notification handler code here--------------逻辑或 UpdateData(true); equal=m_1||m_2; m_string="or"; m_string2=" "; UpdateData(false); } void CMy1Dlg::OnButton20() { // TODO: Add your control notification handler code here------------------逻辑非 UpdateData(true); equal=!m_1; m_string="not"; m_string2=" "; UpdateData(false); } void CMy1Dlg::OnButton21() { // TODO: Add your control notification handler code here---------------------逻辑异或 UpdateData(true); equal=int(m_1)^int(m_2); m_string="Xor"; m_string2=" "; UpdateData(false); } void CMy1Dlg::OnButton22() { // TODO: Add your control notification handler code here---------------------正弦 UpdateData(true); m_2=sin(m_1); m_string2="Sin";m_string="="; UpdateData(false); } void CMy1Dlg::OnButton23() { // TODO: Add your control notification handler code here----------------------余弦 UpdateData(true); m_2=cos(m_1); m_string2="Cos";m_string="="; UpdateData(false); } void CMy1Dlg::OnButton24() { // TODO: Add your control notification handler code here------------正切 UpdateData(true); m_2=tan(m_1); m_string2="tan";m_string="="; UpdateData(false); } void CMy1Dlg::OnButton25() { // TODO: Add your control notification handler code here----------------求余 UpdateData(true); equal=int(m_1)%int(m_2); m_string="Mod"; UpdateData(false); } void CMy1Dlg::OnButton27() { // TODO: Add your control notification handler code here------------------log UpdateData(true); m_result=log(m_2)/log(m_1); m_string2="log"; UpdateData(false); } void CMy1Dlg::OnButton28() { // TODO: Add your control notification handler code here--------------------ln UpdateData(true); m_2=log(m_1); m_string2="ln"; m_string="="; UpdateData(false); } void CMy1Dlg::OnButton29() { // TODO: Add your control notification handler code here-------------------乘方 UpdateData(true); equal=pow(m_1,m_2); m_string="^"; UpdateData(false); } void CMy1Dlg::OnButton26() { // TODO: Add your control notification handler code here----------------阶乘 UpdateData(true); int j=1,k=int(m_1); for(;jUpdateData(false); } void CMy1Dlg::OnButton30() { // TODO: Add your control notification handler code here---------------pi if(focus==1) m_1=3.1415926; else if(focus==2) m_2=3.1415926; UpdateData(false); } void CMy1Dlg::OnButton31() { // TODO: Add your control notification handler code here-------------00 m_string3="00"; UpdateData(false); } void CMy1Dlg::OnButton32() { // TODO: Add your control notification handler code here-----------------%(百分号) m_string3="%"; UpdateData(false); } void CMy1Dlg::OnButton10() { // TODO: Add your control notification handler code here-------------------复原MR focus=0,point1=0,point2=0,i=0,j=0,temp1=1,temp2=1; m_1=0;m_2=0;m_result=0; m_string=" ";m_string2=" ";m_string3=" "; UpdateData(false); } void CMy1Dlg::OnRadio1() { // TODO: Add your control notification handler code here----------------十进制转二进制 int change(int); m_2=change(int(m_1)); m_string="--->"; UpdateData(false); } int change(int c) {int h[100],k=0,x=0; for(;c!=0;) {h[k]=c%2; c=c/2; k++; } k=k-1; for(;k>=0;k--) {x=x*10+h[k]; } return x; } void CMy1Dlg::OnRadio2() { // TODO: Add your control notification handler code here------------二进制转十进制(Two to Ten) int q,num=int(m_1),shi=0; int TtT(int); q=TtT(num); for(;num>1;) {num=num-pow(10,q); shi=pow(2,q)+shi; q=TtT(num); } if(num==1) shi=shi+1; m_2=shi; m_string="--->"; UpdateData(false); } int TtT(int m) {int k,j=0; double n; n=m; for(k=0;n>2;k++) {n=n/10;} if(m==1) k=0; return k; } void CMy1Dlg::OnMenuitem32792() //------------------------菜单。加 { // TODO: Add your command handler code here CMy1Dlg::OnButton14() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32793() //----------------------菜单。减 { // TODO: Add your command handler code here CMy1Dlg::OnButton15() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32794() { // TODO: Add your command handler code here//---------------菜单。乘 CMy1Dlg::OnButton16() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32795() //-------------------------------菜单。除 { // TODO: Add your command handler code here CMy1Dlg::OnButton17() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32796() //------------------------------菜单。与 { // TODO: Add your command handler code here CMy1Dlg::OnButton18() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32797() //------------------------------菜单。或 { // TODO: Add your command handler code here CMy1Dlg::OnButton19() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32798() //------------------------------菜单。非 { // TODO: Add your command handler code here CMy1Dlg::OnButton20() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32799() //------------------------------菜单。异或 { // TODO: Add your command handler code here CMy1Dlg::OnButton21() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32800() //-------------------------------菜单。正弦 { // TODO: Add your command handler code here CMy1Dlg::OnButton22() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32801() //-------------------------------菜单。余弦 { // TODO: Add your command handler code here CMy1Dlg::OnButton23() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32802() //-------------------------------菜单。正切 { // TODO: Add your command handler code here CMy1Dlg::OnButton24() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32791() //-------------------------------菜单。求余 { // TODO: Add your command handler code here CMy1Dlg::OnButton25() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32790() //---------------------------------菜单。阶乘 { // TODO: Add your command handler code here CMy1Dlg::OnButton26() ; CMy1Dlg::OnBUTTONequal(); } void CMy1Dlg::OnMenuitem32789() //--------------------------------菜单。复位 { // TODO: Add your command handler code here CMy1Dlg::OnButton10() ; } void CMy1Dlg::OnMenuitem32788() //---------------------------------菜单。退格 { // TODO: Add your command handler code here CMy1Dlg::OnBUTTONdelete(); } void CMy1Dlg::OnMenuitem32803() //----------------------------------菜单。十进制转二进制 { // TODO: Add your command handler code here CMy1Dlg::OnRadio1() ; } void CMy1Dlg::OnMenuitem32804() //---------------------------------菜单。二进制转十进制 { // TODO: Add your command handler code here CMy1Dlg::OnRadio2() ; } void CMy1Dlg::OnButton33() //--------------------------------------求倒数 { // TODO: Add your control notification handler code here UpdateData(true); m_2=1/m_1; m_string="->"; UpdateData(false); } void CMy1Dlg::OnMenuitem32809() //----------------------------------菜单求倒数 { // TODO: Add your command handler code here CMy1Dlg::OnButton33(); }

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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