所有的程序都在这,请大家编译一下。这是我的源程序,第一次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);}

解决方案 »

  1.   

    回复人: tyzyx(我想要买房子) ( ) 信誉:94  2005-3-14 8:48:18  得分: 15  
     
     
       
    不可能吧?用这个试试
    GetDlgItem(ID_XXXX)->GetWindowsText();  
     
      

  2.   

    这是所有代码。用空的Win32 application来装他。GetDlgItem(ID_XXXX)->GetWindowsText();这个我试了,不会用 :)
    ID_XXXX 我用 hwndEdit2 替换的,不行,我不知道该换成什么
      

  3.   

    取值前把缓冲区清零:
    ZeroMemory(szHourlyWage, 100);
      

  4.   

    To Mackz(在相互) 这两个我都清了,还是不行。请继续指教!
    ZeroMemory(szHourlyWage, 100);
    ZeroMemory(szHours, 100);
      

  5.   

    好奇怪
    _gcvt(grossPay, 100, szGrossPay);
    会把
    hwndButton
    的值改变……不是GetWindowText有问题,而是hwndButton改变了之后
    case BN_CLICKED:
    if (hwndCtl == hwndButton)
    这个进不去了
      

  6.   

    数据没更新,hwndEdit2读了一次,对了,以后再读,就永远是零了。hwndEdit1就没这问题,一直都对。
      

  7.   

    换成 itoa(grossPay, szGrossPay, 10);
    就没问题了
      

  8.   

    Debug看看几个句柄的值,可能_gcvt会改变他们
      

  9.   

    谢谢 pomelowu(羽战士) 是把hwndEdit2的值改了,不知道为什么。
    用了itoa(grossPay, szGrossPay, 10);就好了,但这个是Int 呀,这里是double的
      

  10.   

    非常高兴,知道了一种bug.呵,别笑我,我菜。
      

  11.   

    嗯。的确是bug,至于哪个句柄被改了可能跟编译器优化有关。
    _gcvt中就算指定buffer长度,但是似乎运算的时候还是有可能超过这个长度的