自己动手开发计算器

我在上一篇博客中已经教了大家在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都修改一下

控件名 清零 退格 二进制 八进制 十六进制 1 2 3 4 5 6 7 8 9 0 等于 小数点 & ~ | ^ << >>
ID IDC_CLEAR IDC_BACK IDC_TWO IDC_EIGHT IDC_SIXTEEN IDC_1 IDC_2 IDC_3 IDC_4 IDC_5 IDC_6 IDC_7 IDC_8 IDC_9 IDC_0 IDC_ADD IDC_SUB IDC_MUL IDC_DIV IDC_OK IDC_POINT  IDC_AND IDC_VERSA IDC_OR IDC_UNNO IDC_LEFT IDC_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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值