Windows SDK 教程(二)简单的计算器

茵蒂克丝

简单的相加

先做一个简单的加法功能,实现两个edit(文本控件)中的数字相加

#include <windows.h>
#include "resource.h"

BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	char textA[10], textB[10], text[20];
	int a, b, result;

	switch(Message)
	{
	case WM_COMMAND:

		switch(wParam)
		{
		case IDOK:
			//MessageBox(hwnd, TEXT("确定按钮被按下"), TEXT("标题"), MB_OK);

			// 获取两个edit中的文字(text)
			GetDlgItemText(hwnd, ID_A, textA, sizeof(textA));
			GetDlgItemText(hwnd, ID_B, textB, sizeof(textB));

			// 将文字装换为数字
			a = atoi(textA);
			b = atoi(textB);

			// 相加获得结果
			result = a+b;

			// 拼接输出字符串
			sprintf(text, "相加结果是 %d", result);

			MessageBox(hwnd, text, NULL, MB_OK);
		break;
		case IDCANCEL:
			//MessageBox(hwnd, TEXT("【取消】按钮被按下"), TEXT("标题"), MB_OK);
			EndDialog(hwnd, 0); // 结束对话框,并返回0
		break;
		}

	break;

	case WM_CLOSE:
		DestroyWindow(hwnd);
	break;
	}

	return 0;
}

入口函数我就隐去了,直接看窗口过程函数。中间过程还挺简单的,就是通过 GetDlgItemText 函数获取到edit控件中的文字,然后传化成为数字相加,在返回结果。

calc_1

控件ID的秘密

首先我们要确定数字按钮、运算符按钮等按钮的范围。具体可以找到 cal.rc(你的资源文件) 【右键】->【打开方式】->选择【C++ 源代码编辑器】也可以直接找到你的项目目录下然后用notepad之类的编辑器打开查看,然后可以发现如下格式的东西:

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

ID_MAIN DIALOGEX 0, 0, 113, 130
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,36,108,44,14
    EDITTEXT        ID_EDIT,7,13,99,14,ES_RIGHT | ES_AUTOHSCROLL
    PUSHBUTTON      "7",IDC_BUTTON2,8,33,17,16
    PUSHBUTTON      "8",IDC_BUTTON3,35,33,17,16
    PUSHBUTTON      "9",IDC_BUTTON4,63,33,17,16
    PUSHBUTTON      "4",IDC_BUTTON5,7,57,17,16
    PUSHBUTTON      "5",IDC_BUTTON6,35,57,17,16
    PUSHBUTTON      "6",IDC_BUTTON7,63,57,17,16
    PUSHBUTTON      "1",IDC_BUTTON8,7,81,17,16
    PUSHBUTTON      "2",IDC_BUTTON9,35,81,17,16
    PUSHBUTTON      "3",IDC_BUTTON10,63,81,17,16
    PUSHBUTTON      "0",IDC_BUTTON11,7,106,17,16
    PUSHBUTTON      "/",IDC_BUTTON12,89,33,17,16
    PUSHBUTTON      "*",IDC_BUTTON13,89,57,17,16
    PUSHBUTTON      "-",IDC_BUTTON14,89,81,17,16
    PUSHBUTTON      "+",IDC_BUTTON15,89,106,17,16
END
//控件类型 显示字符     控件ID    x,y坐标  宽高
PUSHBUTTON   "0",    IDC_BUTTON11, 7,106,  17,16

这个是我们的资源视图编辑器编辑的【窗口】对应的【生成脚本】。实际上这些控件我们都是可以手动创建的,不过这里我们有方便的视图编辑然后生成脚本来创建。

通过这些脚本,我们可以在这里确定【数字键】和【运算符】的id范围

// Microsoft Visual C++ generated include file.
// Used by Calc.rc
//
#define ID_MAIN                         101
#define ID_A                            1002
#define ID_EDIT                         1002
#define IDC_BUTTON3                     1003
#define IDC_BUTTON2                     1004
#define IDC_BUTTON4                     1006
#define IDC_BUTTON5                     1007
#define IDC_BUTTON6                     1008
#define IDC_BUTTON7                     1009
#define IDC_BUTTON8                     1016
#define IDC_BUTTON9                     1017
#define IDC_BUTTON10                    1018
#define IDC_BUTTON11                    1019
#define IDC_BUTTON12                    1020
#define IDC_BUTTON13                    1021
#define IDC_BUTTON14                    1022
#define IDC_BUTTON15                    1023

然后根据刚刚的id范围,到 resource.h 中去确定控件的范围,注意对应的值是可以修改的,这个值是我们定义好之后,微软的资源生成器,在创建控件时自动调用并注册的id,之后再点击系统就会通过wParam发送我们定义好的这些控件id过来。(也就说只要值不冲突,我们是可以手动调整的)

仿系统的原始的计算器

1.点出来一个数字
2.点一个操作符
3.点出来一个数字
4.点【确定】出来一个结果


#include <windows.h>
#include "resource.h"

int num_a, num_b;
int result;
char op;
int flag = 0;

BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	char num[10];
	char text[30], edit[30];
	char tmp[30];
	char op_tmp[10];

	switch(Message)
	{
	case WM_COMMAND:

		// 获取数字键(范围上面确定的)
		if (wParam >= 1003 && wParam <= 1019)
		{
			if(flag)
			{
				SetDlgItemText(hwnd, ID_EDIT, "");
				flag = 0;
			}

			GetDlgItemText(hwnd, wParam, num, sizeof(num));
			GetDlgItemText(hwnd, ID_EDIT, edit, sizeof(edit));

			sprintf(edit, "%s%s", edit, num);
			SetDlgItemText(hwnd, ID_EDIT, edit);
		}

		// 获取运算符(范围上面确定的)
		if(wParam >= 1020 && wParam <= 1023)
		{			
			// 把前一个edit中的数字拿出来保存
			GetDlgItemText(hwnd, ID_EDIT, tmp, sizeof(tmp));
			num_a = atoi(tmp);
			
			// 获取到运算符
			GetDlgItemText(hwnd, wParam, op_tmp, sizeof(op_tmp));
			op = op_tmp[0];			

			SetDlgItemText(hwnd, ID_EDIT, "");
		}

		switch(wParam)
		{
		case IDOK:

			GetDlgItemText(hwnd, ID_EDIT, tmp, sizeof(tmp));
			num_b = atoi(tmp);

			switch(op)
			{
				case '+':
					result = num_a + num_b;
				break;
				case '-':
					result = num_a - num_b;
				break;
				case '*':
					result = num_a * num_b;
				break;
				case '/':
					result = num_a / num_b;
				break;
			}

			sprintf(text, "%d", result);

			SetDlgItemText(hwnd, ID_EDIT, text);

			flag = 1;

		break;
		case IDCANCEL:
			// MessageBox(hwnd, TEXT("【取消】按钮被按下"), TEXT("标题"), MB_OK);
		break;
		}

	break;

	case WM_CLOSE:
		DestroyWindow(hwnd);
	break;
	}

	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	DialogBox(
			hInstance,
			MAKEINTRESOURCE(ID_MAIN),
			NULL,
			DlgProc
		);

	return 0;
}

calc_2

加强一点的版本

博主有空了再写(下一次空闲时间有点长 Orz..),各位也可以自己改进上面的版本,把一些其他的功能补齐,如果觉得不错的话也可以发给博主,博主肯定会 偷懒用你的挂在这里 认真的帮你检查代码。


文章索引百度网盘
上一讲:Windows SDK 教程(一)创建简单的Dialog窗口
下一讲:Windows SDK 教程(三) 一些细节以及动态创建控件

Advertisements

4 thoughts on “Windows SDK 教程(二)简单的计算器

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s