所有的程序都在这,请大家编译一下。这是我的源程序,第一次calculate的时候正常运行,第二次就完了,请大家指教!
这个程序是用来计算工资的,netPay = grossPay - tax,就完了程序里有两个EDIT框,在一起,一抹一样,但奇怪就奇怪在第二次运行时一个能拿到值一个拿不到,伤透了脑筋,所有到这里请大家帮帮忙,帮帮我这个菜鸟,谢谢了。
#include <windows.h>
#include <string>using namespace std;double hourlyWage;
char szHourlyWage[100];
double hours;
char szHours[100];double grossPay;
char szGrossPay[100];
double taxRate = 0.15;
double tax;
char szTax[100];
double netPay;
char szNetPay[100];LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
void runCalculate();HWND hWnd; //position is the same as below
HWND hwndStatic1; HWND hwndEdit1;
HWND hwndStatic2; HWND hwndEdit2;
HWND hwndStatic3; HWND hwndStatic7;
HWND hwndStatic4; HWND hwndStatic8;
HWND hwndStatic5; HWND hwndStatic6;
HWND hwndButton;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//create WNDCLASS and Register
WNDCLASS wc;
wc.lpszClassName = "WageCalculatorClass";
wc.lpfnWndProc = MainWndProc;
wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
wc.lpszMenuName = "";
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
RegisterClass(&wc);//Create Windows
hWnd = CreateWindow(
"WageCalculatorClass",
"WageCalculator",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
385,
265,
NULL,
NULL,
hInstance,
NULL);hwndButton = CreateWindow(
"BUTTON",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
120,
100,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndButton, "Calculate");hwndStatic1 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
10,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic1, "Hourly wage:");hwndStatic2 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
30,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic2, "Hours per week:");hwndStatic3 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
50,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic3, "Weekly pay:");hwndStatic4 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
70,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic4, "Tax ( 15% ):");hwndStatic5 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
90,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic5, "Net pay:");hwndEdit1 = CreateWindow(
"EDIT",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
10,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndEdit2 = CreateWindow(
"EDIT",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
30,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndStatic7 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
50,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndStatic8 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
70,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndStatic6 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
90,
100,
20,
hWnd,
NULL,
hInstance,
NULL);
//Show Windows
ShowWindow(hWnd, nCmdShow);//Msg handling
MSG msg;
while(GetMessage(&msg, NULL, 0, 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
HWND hwndCtl = (HWND) lParam;switch (msg) {
case WM_COMMAND:
switch (wParam) {
case BN_CLICKED:
if (hwndCtl == hwndButton)
{
GetWindowText(hwndEdit1, szHourlyWage, 100);
hourlyWage = atof(szHourlyWage);GetWindowText(hwndEdit2, szHours, 100);
hours = atof(szHours);runCalculate();
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}void runCalculate()
{
//calculate grossPay
if(hours>40)
grossPay =(40+(hours-40) * 1.5)*hourlyWage;
else
grossPay = hours*hourlyWage;
tax = grossPay * taxRate;
netPay = grossPay - tax;//set netPay to window
_gcvt(netPay, 100, szNetPay);
SetWindowText(hwndStatic6, szNetPay);_gcvt(grossPay, 100, szGrossPay);
SetWindowText(hwndStatic7, szGrossPay);_gcvt(tax, 100, szTax);
SetWindowText(hwndStatic8, szTax);}
这个程序是用来计算工资的,netPay = grossPay - tax,就完了程序里有两个EDIT框,在一起,一抹一样,但奇怪就奇怪在第二次运行时一个能拿到值一个拿不到,伤透了脑筋,所有到这里请大家帮帮忙,帮帮我这个菜鸟,谢谢了。
#include <windows.h>
#include <string>using namespace std;double hourlyWage;
char szHourlyWage[100];
double hours;
char szHours[100];double grossPay;
char szGrossPay[100];
double taxRate = 0.15;
double tax;
char szTax[100];
double netPay;
char szNetPay[100];LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
void runCalculate();HWND hWnd; //position is the same as below
HWND hwndStatic1; HWND hwndEdit1;
HWND hwndStatic2; HWND hwndEdit2;
HWND hwndStatic3; HWND hwndStatic7;
HWND hwndStatic4; HWND hwndStatic8;
HWND hwndStatic5; HWND hwndStatic6;
HWND hwndButton;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//create WNDCLASS and Register
WNDCLASS wc;
wc.lpszClassName = "WageCalculatorClass";
wc.lpfnWndProc = MainWndProc;
wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
wc.lpszMenuName = "";
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
RegisterClass(&wc);//Create Windows
hWnd = CreateWindow(
"WageCalculatorClass",
"WageCalculator",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
385,
265,
NULL,
NULL,
hInstance,
NULL);hwndButton = CreateWindow(
"BUTTON",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
120,
100,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndButton, "Calculate");hwndStatic1 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
10,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic1, "Hourly wage:");hwndStatic2 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
30,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic2, "Hours per week:");hwndStatic3 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
50,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic3, "Weekly pay:");hwndStatic4 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
70,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic4, "Tax ( 15% ):");hwndStatic5 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
10,
90,
155,
20,
hWnd,
NULL,
hInstance,
NULL);
SetWindowText(hwndStatic5, "Net pay:");hwndEdit1 = CreateWindow(
"EDIT",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
10,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndEdit2 = CreateWindow(
"EDIT",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
30,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndStatic7 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
50,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndStatic8 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
70,
100,
20,
hWnd,
NULL,
hInstance,
NULL);hwndStatic6 = CreateWindow(
"STATIC",
NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
165,
90,
100,
20,
hWnd,
NULL,
hInstance,
NULL);
//Show Windows
ShowWindow(hWnd, nCmdShow);//Msg handling
MSG msg;
while(GetMessage(&msg, NULL, 0, 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
HWND hwndCtl = (HWND) lParam;switch (msg) {
case WM_COMMAND:
switch (wParam) {
case BN_CLICKED:
if (hwndCtl == hwndButton)
{
GetWindowText(hwndEdit1, szHourlyWage, 100);
hourlyWage = atof(szHourlyWage);GetWindowText(hwndEdit2, szHours, 100);
hours = atof(szHours);runCalculate();
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}void runCalculate()
{
//calculate grossPay
if(hours>40)
grossPay =(40+(hours-40) * 1.5)*hourlyWage;
else
grossPay = hours*hourlyWage;
tax = grossPay * taxRate;
netPay = grossPay - tax;//set netPay to window
_gcvt(netPay, 100, szNetPay);
SetWindowText(hwndStatic6, szNetPay);_gcvt(grossPay, 100, szGrossPay);
SetWindowText(hwndStatic7, szGrossPay);_gcvt(tax, 100, szTax);
SetWindowText(hwndStatic8, szTax);}
不可能吧?用这个试试
GetDlgItem(ID_XXXX)->GetWindowsText();
ID_XXXX 我用 hwndEdit2 替换的,不行,我不知道该换成什么
ZeroMemory(szHourlyWage, 100);
ZeroMemory(szHourlyWage, 100);
ZeroMemory(szHours, 100);
_gcvt(grossPay, 100, szGrossPay);
会把
hwndButton
的值改变……不是GetWindowText有问题,而是hwndButton改变了之后
case BN_CLICKED:
if (hwndCtl == hwndButton)
这个进不去了
就没问题了
用了itoa(grossPay, szGrossPay, 10);就好了,但这个是Int 呀,这里是double的
_gcvt中就算指定buffer长度,但是似乎运算的时候还是有可能超过这个长度的