自己动手开发计算器

来源:互联网 发布:最难搞定的星座知乎 编辑:程序博客网 时间:2024/04/30 10:20

我在上一篇博客中已经教了大家在VC6.0中安装了 Win32 DialogBased Application 开发向导,今天我将叫大家使用Win32 DialogBased Application开发Windows程序中的简单的程序员计算器

在制作之前先给大家看一下效果

主界面


用程序员计算器计算 11*12

打开程序员计算器


用鼠标点击键盘上的1点两下


点击*然后再点击一下1一下2


最后点击等号,得到计算结果


制作程序员计算器

打开VC6.0--->选择 Win32 Dialog Based Application --->输入工程名为:程序员计算器-->单击确定--->选择ResourceView---->选择Resource Resource文件夹---->选择Dialog---->选择 IDD_MAIN

操作完成后会出现如下图所示的界面


修改程序的名字;将程序的名字改为<<<程序员计算器>>>

在对话框上单击右键----->选择属性------>标题改为<<<程序员计算器>>>

未修改


修改


添加最小化选择项

在对话框上双击----->弹出对话框的属性选项对话框----->选择样式----->勾上最小化框


弹出属性选项对话框并且选择样式


选择样式


在最小化框前打钩


修改编辑框控件中的文本排列方式

在编辑框控件上单击右键----->选择属性------>------>样式------>排列文本选择为靠右


在编辑框控件上单击右键弹出编辑框的属性界面



选择样式


在排列文本选项中选择靠右


控件库

选择一个编辑框控件并拖到对话框上,并且调整好位置和大小


按照上面的方法先对话框上放一些按钮,并将标题改成数字或者符号


修改控件的ID:

选择一个按钮---->右击---->属性--->常规---->将清零按钮的ID改为IDC_CLEAR

选择按钮右击选择属性弹出属性对话框


修改ID


注:双击右键也可以弹出属性对话框


按照上面的方法将所有的按钮的ID都修改一下

控件名清零退格二进制八进制十六进制1234567890加减乘除等于小数点&~|^<<>>IDIDC_CLEARIDC_BACKIDC_TWOIDC_EIGHTIDC_SIXTEENIDC_1IDC_2IDC_3IDC_4IDC_5IDC_6IDC_7IDC_8IDC_9IDC_0IDC_ADDIDC_SUBIDC_MULIDC_DIVIDC_OKIDC_POINT IDC_ANDIDC_VERSAIDC_ORIDC_UNNOIDC_LEFTIDC_RIGHT


添加图标:

添加前:


添加后


添加步骤:

ResourceView---->resource resource----->选定 resource resource ------>单击右键----->引入---选择一个图标(.icon图片)


添加图标成功的标志



界面搭建完成后,做完所有的准备工作后开始写代码

在写代码之前我们的学习几个函数


函数名:strcat

函数按功能:连接两个字符串

函数原型:extern char *strcat(char *dest,char *src);

参数:

dest 第一个字符串的地址

src 第二个字符串的地址

应用:利用 strcat函数实现hello 与 world 的连接

#include <stdio.h>#include <string.h>int main(){char str1[] = "hello";char str2[] = " world";strcat(str1,str2);printf("%s\n",str1);return 0;}


执行结果


函数名:memset

函数原型:void *memset(void *s, int ch, size_t n)

函数功能:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s

参数:

s 空指针

ch 整型数据

n s的大小

应用:利用memset实现清零

#include <stdio.h>#include <string.h>int main(){char str[] = "hello world";memset(str,0,sizeof(str));printf("%s\n",str);return 0;}


执行结果


函数名:strcpy

函数原型:extern char *strcpy(char* dest, const char *src)

函数功能:实现字符串的复制

参数:

dest  字符指针

src 字符指针

应用: 复制hello world

#include <stdio.h>#include <string.h>int main(){char str1[20] = "hello world";char str2[20];strcpy(str2,str1);printf("%s\n",str2);return 0;}


执行结果


函数名: atoi

函数原型:int atoi(const char *nptr);

函数功能: 将字符串转换成整数

应用

#include <stdio.h>#include <stdlib.h>int main(){char str1[20] = "12345";int i = atoi(str1);printf("%d\n",i);return 0;}


执行结果


 


函数名:itoa


函数原型: char *itoa(int value,char*string,intradix)

函数功能:将整数转换成字符串

参数:

value 整数值

string 字符串

radix 进制

应用将123转换成 十进制 二进制 八进制 十六进制

#include <stdio.h>#include <stdlib.h>int main(){int num = 123;char str[10];itoa(num,str,2);printf("二进制:%s\n",str);itoa(num,str,8);printf("八进制:%s\n",str);itoa(num,str,10);printf("十进制:%s\n",str);itoa(num,str,16);printf("十六进制%s\n",str);return 0;}

运行结果


函数名:sprintf

函数原型:int sprintf( char *buffer, const char *format, [ argument] … )

函数功能:将数据打印到字符串中

参数:

buffer 解释打印的字符串

format 打印格式

第三个参数 打印的数据

应用:将 hello world 打印到字符串中

#include <stdio.h>#include <string.h>int main(){char str[20];sprintf(str,"%s","hello world !");printf("%s\n",str);return 0;}


执行结果:



 

函数名: GetDlgItemText

函数功能:得到控件中的文本

函数原型:

UINT WINAPI GetDlgItemText(
  _In_   HWND hDlg,
  _In_   int nIDDlgItem,
  _Out_  LPTSTR lpString,
  _In_   int nMaxCount
);

参数:

第一个参数:程序的句柄

第二个参数:控件的ID

第三个参数:字符串

第四个参数:字符串的大小

参考文章:GetDlgItemTex函数


函数名:SetDlgItemTex

函数功能:向控件中写入文本

函数参数:

BOOL WINAPI SetDlgItemText(
  _In_  HWND hDlg,
  _In_  int nIDDlgItem,
  _In_  LPCTSTR lpString
)

参数:

第一个参数:程序的句柄

第二个参数:控件的ID

第三参数:字符串

参考文章:SetDlgItemText函数


函数名:SendMessage

函数功能:发送Windows信息

函数原型:

LRESULT WINAPI SendMessage(
  _In_  HWND hWnd,
  _In_  UINT Msg,
  _In_  WPARAM wParam,
  _In_  LPARAM lParam
);


第一个参数:窗口的句柄

第二个参数:发送的Windows信息

第三个参数:指定附加的消息特定信息

第四个参数:指定附加的消息特定信息。

参考文章:SendMessage函数


函数名:LoadIcon

函数功能:加载图标

函数原型:

HICON WINAPI LoadIcon(
  _In_opt_  HINSTANCE hInstance,
  _In_      LPCTSTR lpIconName
);

第一个参数:程序的实例句柄

第二个参数:图标的ID

参考文章:LoadIcon函数


函数名:ZeroMemory

函数功能:清零

函数原型:

void ZeroMemory(
  [in]  PVOID Destination,
  [in]  SIZE_T Length
);
第一个参数:数据的地址

第一个参数:数据的大小

参考文章:ZeroMemory函数



学完函数的使用后现在开始写代码:

FileView------->工作区程序员计算器------>程序员计算器 file------->Source file----->MainDlg.cpp


程序员计算器的全部代码

在写代码之前先学习几个算法

1清零算法

  memset(temp,0,sizeof(temp));   SetDlgItemText(hwnd,IDC_EDIT1,"0");


2退格算法

   TCHAR temp1[256];   GetDlgItemText(hwnd,IDC_EDIT1,temp1,sizeof(temp1));/*获得编辑框中的字符串*/   temp1[strlen(temp1) - 1] = temp1[strlen(temp1)];/*将'\0'向前移一位*/   strcpy(temp,temp1);   SetDlgItemText(hwnd,IDC_EDIT1,temp);/*输出结果*/


MainDlg.cpp中的代码

#include "stdafx.h"#include <windows.h>#include <windowsx.h>#include "resource.h"#include "MainDlg.h"TCHAR str1[256];/*存取第一个数字*/TCHAR str2[256];/*存取第二个数字*/TCHAR str3[256];/*存取运算结果*/TCHAR temp[256]; /*存取输入的数字*/char op;/*用于开关语句中选择运算符号*/float f1,f2,f3;TCHAR binary[256];/*用于进制转换*/int i;/*用于进制转换*/int p,q;/*用于按位取反*/BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){    switch(uMsg)    {        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);    }    return FALSE;}BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam){ZeroMemory(str1,sizeof(str1));/*清零*/ZeroMemory(str2,sizeof(str2));/*清零*/SetDlgItemText(hwnd,IDC_EDIT1,"0");/*文本框中显示0*//*在窗口的标题栏上显示图标*/SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)));    return TRUE;}void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify){    switch(id)    {   case IDC_1:/*输入数字1*/   {   strcat(temp,"1");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;   case IDC_2:/*输入数字2*/   {   strcat(temp,"2");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;     case IDC_3:/*输入数字3*/{   strcat(temp,"3");   SetDlgItemText(hwnd,IDC_EDIT1,temp);}        break;   case IDC_4:/*输入数字4*/   {   strcat(temp,"4");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;   case IDC_5:/*输入数字5*/   {   strcat(temp,"5");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;     case IDC_6:/*输入数字6*/{   strcat(temp,"6");   SetDlgItemText(hwnd,IDC_EDIT1,temp);}        break;   case IDC_7:/*输入数字7*/   {   strcat(temp,"7");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;   case IDC_8:/*输入数字8*/   {   strcat(temp,"8");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;     case IDC_9:/*输入数字9*/{   strcat(temp,"9");   SetDlgItemText(hwnd,IDC_EDIT1,temp);}        break;   case IDC_0:/*输入数字0*/   {   strcat(temp,"0");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;   case IDC_POINT:/*输入小数点*/   {   strcat(temp,".");   SetDlgItemText(hwnd,IDC_EDIT1,temp);   }   break;   case IDC_ADD:/*加*/   {   op = '+';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_SUB:/*减*/   {   op = '-';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_MUL:/*乘*/   {   op = '*';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_DIV:/*除*/   {   op = '/';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_CLEAR:/*清零*/   {   memset(temp,0,sizeof(temp));   SetDlgItemText(hwnd,IDC_EDIT1,"0");   }   break;   case IDC_BACK:/*退格*/   {   TCHAR temp1[256];   GetDlgItemText(hwnd,IDC_EDIT1,temp1,sizeof(temp1));/*获得编辑框中的字符串*/   temp1[strlen(temp1) - 1] = temp1[strlen(temp1)];/*将'\0'向前移一位*/   strcpy(temp,temp1);   SetDlgItemText(hwnd,IDC_EDIT1,temp);/*输出结果*/   }   break;   case IDC_TWO:/*转换为二进制*/   {   i = atoi(temp);   itoa(i,binary,2);   SetDlgItemText(hwnd,IDC_EDIT1,binary);   }   break;   case IDC_EIGHT:/*转换为八进制*/   {   i = atoi(temp);   itoa(i,binary,8);   SetDlgItemText(hwnd,IDC_EDIT1,binary);   }   break;   case IDC_SIXTEEN:/*转换为十六进制*/   {   i = atoi(temp);   itoa(i,binary,16);   SetDlgItemText(hwnd,IDC_EDIT1,binary);   }   break;   case IDC_AND:/*按位与*/   {   op = '&';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_VERSA:/*按位取反*/   {   p = atoi(temp);   memset(temp,0,sizeof(temp));   q = ~p;   wsprintf(str3,"%d",q);   SetDlgItemText(hwnd,IDC_EDIT1,str3);   }   break;   case IDC_OR:/*按位或*/   {           op = '|';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_UNNO:/*按位异或*/   {           op = '^';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_LEFT:/*按位左移*/   {           op = '<';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;      case IDC_RIGHT:/*按位右移*/   {           op = '>';   strcpy(str1,temp);   memset(temp,0,sizeof(temp));   }   break;   case IDC_OK:/*等于*/   {   f1 = atof(str1);   strcpy(str2,temp);   f2 = atof(str2);   switch(op)   {   case '+':   {   f3 = f1 + f2;   }   break;   case '-':   {   f3 = f1 - f2;   }   break;   case '*':   {   f3 = f1 * f2;   }   break;   case '/':   {   f3 = f1 / f2;   }   break;   case '&':   {   f3 = (int)f1 & (int)f2;   }   break;   case '|':   {   f3 = (int)f1 | (int)f2;   }   break;   case '^':   {   f3 = (int)f1 ^ (int)f2;   }   break;   case '<':   {   f3 = (int)f1 << (int)f2;   }   break;   case '>':   {   f3 = (int)f1 >> (int)f2;   }   break;   }   sprintf(str3,"%g",f3);   SetDlgItemText(hwnd,IDC_EDIT1,str3);   }    break;         default:break;    }}void Main_OnClose(HWND hwnd){    EndDialog(hwnd, 0);}


程序员计算器下载

                                   








0 0