大约两年前自己写了一个界面,(那个时候刚学WINDOWS编程)后面没有完成,现在接下把它完成,零散地用了两三个小时只写一个简单的计算器,自己记一下:
下面是文件设置
main.cpp 代码如下:
#include <Windows.h>
#include <tchar.h>
#include<stdlib.h>
#include <locale>
#include <cmath>
#include "resource.h"
#include <string>
using namespace std;
INT_PTR CALLBACK DialogProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
enum tagOperator {
ADD,MINUS,MULTIPLY,DIVIDE,EQUALS,SQRT
} iOperator;
int WINAPI wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance, MAKEINTATOM(IDD_DLGCALCULATOR), NULL, DialogProc);
return 0;
}
INT_PTR CALLBACK GetNumFromScreen(HWND hwndDlg, TCHAR * szBuffer)
{
//如果函数调用成功,返回值为拷贝到缓冲区中的 TCHAR 字符个数(不包括结束空字符)。
//如果函数调用失败,返回值为 0
if (GetDlgItemText(hwndDlg, IDC_ETRES, szBuffer, 1024))
{
_locale_t fr = _create_locale(LC_NUMERIC, "zh-CN");
return _wtof_l(szBuffer, fr);
}
else {
return 0;
}
}
BOOL ShowNum(BOOL isFistNum, TCHAR * szBuffer)
{
if (isFistNum)
{
memset(szBuffer, 0, sizeof(TCHAR));
}
isFistNum = FALSE;
return isFistNum;
}
INT_PTR CALLBACK DialogProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
) {
static LPWSTR szBuffer = new TCHAR[1024];//用来存放显示结果
//static TCHAR szBuffer[1024] = { 0 };//用来存放显示结果
static double ResultNum;
static BOOL isFistNum = TRUE;
static int cxChar, cyChar;
static RECT rect;
/*PAINTSTRUCT ps;
HDC hdc;*/
static HWND hwndEdit = GetDlgItem(hwndDlg, IDC_ETRES);
switch (uMsg)
{
case WM_CREATE:
cxChar = LOWORD(GetDialogBaseUnits());
cyChar = HIWORD(GetDialogBaseUnits());
break;
case WM_INITDIALOG:
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BTN0:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("0"));
SetDlgItemText(hwndDlg, IDC_ETRES,szBuffer);
break;
case IDC_BTN1:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("1"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN2:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("2"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN3:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("3"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN4:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("4"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN5:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("5"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN6:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("6"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN7:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("7"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN8:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("8"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTN9:
isFistNum = ShowNum(isFistNum, szBuffer);
lstrcat(szBuffer, _T("9"));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTNZERO:
isFistNum = ShowNum(isFistNum, szBuffer);
memset(szBuffer, '\0', sizeof(szBuffer));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTNDOT:
lstrcat(szBuffer, _T("."));
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
break;
case IDC_BTNADD:
iOperator = ADD;
ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
isFistNum = TRUE;
break;
case IDC_BTNMUN:
iOperator = MINUS;
ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
isFistNum = TRUE;
break;
case IDC_BTNMUL:
iOperator = MULTIPLY;
ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
isFistNum = TRUE;
break;
case IDC_BTNDIV:
iOperator = DIVIDE;
ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
isFistNum = TRUE;
break;
case IDC_BTNSQRT:
iOperator = SQRT;
ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
break;
case IDC_BTNEQU:
double tempNum = GetNumFromScreen(hwndDlg, szBuffer);
switch (iOperator)
{
case ADD:
ResultNum += tempNum;
break;
case MINUS:
ResultNum -= tempNum;
break;
case MULTIPLY:
ResultNum *= tempNum;
break;
case DIVIDE:
ResultNum /= tempNum;
break;
case SQRT:
ResultNum = sqrt(ResultNum);
break;
default:
ResultNum = tempNum;
break;
}
/*string tempstr = to_string(ResultNum);*/
memset(szBuffer, 0, sizeof(TCHAR));
//szBuffer = to_string(ResultNum).c_str();
wsprintf(szBuffer, _T("%S"), to_string(ResultNum).c_str());
SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
//SetDlgItemInt(hwndDlg, IDC_ETRES, ResultNum,TRUE);
isFistNum = TRUE;
break;
}
break;
case WM_PAINT:
//InvalidateRect(hwndDlg, &rect, TRUE);
//hdc = BeginPaint(hwndDlg, &ps);
//SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
;
//HPEN hpen1=(HPEN)SelectObject(hdc, hpen);*/
//SetBkMode(hdc, TRANSPARENT);
SetDlgItemText(hwndEdit, IDC_ETRES, szBuffer);
//EndPaint(hwndDlg, &ps);
break;
case WM_CLOSE:
EndDialog(hwndDlg, 0);
break;
default:
break;
}
return 0;
}
calcu.rc 代码如下:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/
#undef APSTUDIO_READONLY_SYMBOLS
/
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/
//
// Dialog
//
IDD_DLGCALCULATOR DIALOGEX 0, 0, 297, 372
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "计算器"
FONT 9, "Microsoft YaHei UI", 400, 0, 0x0
BEGIN
EDITTEXT IDC_ETRES,15,14,266,52,ES_AUTOHSCROLL | ES_READONLY
PUSHBUTTON "CE",IDC_BTNZERO,18,86,45,37
PUSHBUTTON "←",IDC_BTNDEL,88,86,45,37
PUSHBUTTON "SQRT",IDC_BTNSQRT,158,86,45,37
PUSHBUTTON "÷",IDC_BTNDIV,228,86,45,37
PUSHBUTTON "7",IDC_BTN7,18,142,45,37
PUSHBUTTON "8",IDC_BTN8,88,142,45,37
PUSHBUTTON "9",IDC_BTN9,158,142,45,37
PUSHBUTTON "×",IDC_BTNMUL,228,142,45,37
PUSHBUTTON "4",IDC_BTN4,19,199,45,37
PUSHBUTTON "5",IDC_BTN5,89,199,45,37
PUSHBUTTON "6",IDC_BTN6,159,199,45,37
PUSHBUTTON "-",IDC_BTNMUN,229,199,45,37
PUSHBUTTON "1",IDC_BTN1,19,257,45,37
PUSHBUTTON "2",IDC_BTN2,89,257,45,37
PUSHBUTTON "3",IDC_BTN3,159,257,45,37
PUSHBUTTON "+",IDC_BTNADD,229,257,45,37
PUSHBUTTON "0",IDC_BTN0,20,310,113,37
PUSHBUTTON ".",IDC_BTNDOT,157,311,45,37
PUSHBUTTON "=",IDC_BTNEQU,230,310,45,37
END
/
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DLGCALCULATOR, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 290
TOPMARGIN, 7
BOTTOMMARGIN, 365
END
END
#endif // APSTUDIO_INVOKED
/
//
// AFX_DIALOG_LAYOUT
//
IDD_DLGCALCULATOR AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // 中文(简体,中国) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
/
#endif // not APSTUDIO_INVOKED
界面如下所示:
因为时间关系,显示字体和小数点现在还没有写好怎么处理,只弄了一个加减乘除,还有求算术平方根,因为最后的结果还是double,精度还是没有很好控制,另外显示字体也没有好好美化一下,算是半成品吧。
——最后吐槽一下,用C写界面真的很慢,mfc还好一点点,C#就很快了,开发效率不是相差一点点,可能是我比较菜的原因吧!