1.介绍
设计出一个有友好界面的计算器。
2.API函数的介绍
//1.当前对话框窗口句柄
//2.处理的ID号
//3.表示成功或失败(TRUE表示成功,FALSE表示失败)。
//如果此参数为NULL,则该函数不返回有关成功或失败的信息
//4.找到对应的int,进行返回
int nleft = GetDlgItemInt(hwnd, IDC_EDIT4, NULL, TRUE);
//1.当前对话框窗口句柄
//2.处理的ID号
//3.进行信息的处理。
//4.找到对应的int,进行返回
SetDlgItemInt(hwnd, IDC_EDIT5, nleft + nright, TRUE);
//第一个参数为当前正在运行的对话框的句柄
//第二个参数为你点击了什么来进行事件的运行,一般为你要关闭的ID号
EndDialog(hwnd, IDOK);
//参数一为句柄,用来标识某些东西,在这标识这个程序
//参数二为句柄,一般为NULL
//参数三为字符指针,用来运行程序的命令行
//参数四为程序如何显示
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hpre, PSTR pstr, int icmdshow) {}
//返回类型为 HWND,且必须是在任务栏上的已经打开的窗口。
/*lpszClassName (第一个参数)
指向指定窗口的类名的一个Null终止的字符串(WNDCLASS 结构,窗口的类型名)。 如果 lpClassName 是 NULL,所有类名匹配。
lpszWindowName(第二个参数)
指向指定窗口名称为Null终止的字符串(窗口的标题)。 如果 lpWindowName 是 NULL,所有windows命名匹配。*/
//通过窗口标题进行查找
HWND hwnd1 = FindWindow(NULL, TEXT("翻译.txt - 记事本"));
//通过窗口的类名进行查找
HWND hwnd = FindWindow(TEXT("Notepad"), NULL);
//第一个参数为当前窗口的句柄,如果没有,可以为0或者NULL.
//第二个参数为当前窗口的ID号,为一个整数
//第三个参数为父窗口,若无则为空
//第四个参数为指向一个消息回调函数
DialogBox(hinstance, (LPCSTR)IDD_DIALOG1, NULL, DialogPro);
3.实现代码
//一个简单的计算器
//需要知道一个MFC的基础知识,掌握必要的常见的几个API,才能进行程序的书写。
#include<Windows.h>
#include"resource.h"
INT_PTR CALLBACK subPro(HWND hwnd, UINT nID, WPARAM wpa, LPARAM lpa) {
switch (nID) {
case WM_COMMAND:
if (LOWORD(wpa) == IDOK) {
int nleft = GetDlgItemInt(hwnd, IDC_EDIT1, NULL, TRUE);
int nright = GetDlgItemInt(hwnd, IDC_EDIT2, NULL, TRUE);
SetDlgItemInt(hwnd, IDC_EDIT5, nleft - nright, TRUE);
}
if (LOWORD(wpa) == IDCANCEL) {
EndDialog(hwnd, IDCANCEL);
}
}
return 0;
}
INT_PTR CALLBACK mulPro(HWND hwnd, UINT nID, WPARAM wpa, LPARAM lpa) {
switch (nID) {
case WM_COMMAND:
if (LOWORD(wpa) == IDOK) {
int nleft = GetDlgItemInt(hwnd, IDC_EDIT1, NULL, TRUE);
int nright = GetDlgItemInt(hwnd, IDC_EDIT6, NULL, TRUE);
SetDlgItemInt(hwnd, IDC_EDIT7, nleft * nright, TRUE);
}
if (LOWORD(wpa) == IDCANCEL) {
EndDialog(hwnd, IDCANCEL);
}
}
return 0;
}
INT_PTR CALLBACK didPro(HWND hwnd, UINT nID, WPARAM wpa, LPARAM lpa) {
switch (nID) {
case WM_COMMAND:
if (LOWORD(wpa) == IDOK) {
int nleft = GetDlgItemInt(hwnd, IDC_EDIT1, NULL, TRUE);
int nright = GetDlgItemInt(hwnd, IDC_EDIT6, NULL, TRUE);
SetDlgItemInt(hwnd, IDC_EDIT7, nleft / nright, TRUE);
}
if (LOWORD(wpa) == IDCANCEL) {
EndDialog(hwnd, IDCANCEL);
}
}
return 0;
}
INT_PTR CALLBACK addPro(HWND hwnd, UINT nID, WPARAM wpa, LPARAM lpa) {
switch (nID) {
case WM_COMMAND:
if (LOWORD(wpa) == IDOK) {
int nleft = GetDlgItemInt(hwnd, IDC_EDIT1, NULL, TRUE);
int nright = GetDlgItemInt(hwnd, IDC_EDIT4, NULL, TRUE);
SetDlgItemInt(hwnd, IDC_EDIT3, nleft + nright, TRUE);
}
if (LOWORD(wpa) == IDCANCEL) {
EndDialog(hwnd, IDCANCEL);
}
}
return 0;
}
INT_PTR CALLBACK intPro(HWND hwnd, UINT nID, WPARAM wParam, LPARAM lParam) {
switch (nID) {
case WM_COMMAND:
if (LOWORD(wParam) == IDC_ADD1) {
DialogBox(NULL, (LPCSTR)IDD_ADD_DLG, NULL, addPro);
}
if (LOWORD(wParam) == IDC_SUBTRA1) {
DialogBox(NULL, (LPCSTR)IDD_SUBSTR_DLG, NULL, subPro);
}
if (LOWORD(wParam) == IDC_MULTI1) {
DialogBox(NULL, (LPCSTR)IDD_MULTI_DLG, NULL, mulPro);
}
if (LOWORD(wParam) == IDC_DIVIDE1) {
DialogBox(NULL, (LPCSTR)IDD_DIDIVE_DLG, NULL, didPro);
}
if (LOWORD(wParam) == IDCANCEL) {
EndDialog(hwnd, IDCANCEL);
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hin, PSTR patr, int icmdshow) {
DialogBox(hinstance, (LPCSTR)IDD_MAN_DLG1, NULL, intPro);
return 0;
}
界面和图标都需要自己在资源视图里进行设置,设置之后的配置会保存在resource.h中,其中resource.h头文件的内容为:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 math_operater.rc 使用
//
#define IDI_ICON1 101
#define IDD_MAN_DLG1 102
#define IDD_ADD_DLG 104
#define IDD_SUBSTR_DLG 106
#define IDD_MULTI_DLG 108
#define IDD_DIALOG1 110
#define IDD_DIDIVE_DLG 110
#define IDC_ADD1 1001
#define IDC_SUBTRA1 1002
#define IDC_EDIT1 1002
#define IDC_MULTI1 1003
#define IDC_EDIT6 1003
#define IDC_DIVIDE1 1004
#define IDC_EDIT3 1004
#define IDC_EDIT7 1004
#define IDC_EDIT4 1005
#define IDC_EDIT2 1005
#define IDC_EDIT5 1006
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 112
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1003
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
4.运行结果为:
减法、乘法和除法都是产不多的界面,个人感觉界面做的比较差劲,要再次改进。