程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用Win32 SDK寫一個簡單的計算器

用Win32 SDK寫一個簡單的計算器

編輯:關於VC++

用MFC做計算器非常容易,大家都認為用SDK做非常難, 但是我認為只要你的思路正確,做起來也是一樣得心應手。 由於SDK做工程也是有規律可尋,就是建立框架然後再對框架進行消息處理。 所以我學VC++一個多月來編出來了我的第一個小程序,在這裡和各位VC愛好者交流交流。

做計算器之前,首先要了解下面二個函數:字符串轉換為雙精度和雙精度轉換為字符串。 字符串轉換為雙精度函數為double strtod( const char *nptr, char **endptr ),其中nptr表示要轉換的字符串, endptr表示到不是數字的字符時停止掃描;雙精度轉換為字符串函數為char *_gcvt( double value, int digits, char *buffer ),其中value表示要轉換為字符串的數值,digts表示有意義的位數,buffer表示用來存儲字符串的緩沖區。了解了這兩函數後對計算器的組織就開始有了一定的了解。

下面介紹說明一下計算器的步驟:

1.寫上一個可以說是千篇一律的主函數。

2.消息處理這部分是最難的也是最主要的部分,在這部分中包含建立按鈕、文本框和對每個按鈕按下去的功能實現。 建立按鈕和文本框等一些外觀的步驟略,如果想要詳細的代碼請看源程序。

3.對數字鍵用一個函數表示:

//------按下數字鍵(0~9和小數點)的操作處理函數------
void NumResult(char *NumData)
{
  if (nOptF==0)
   SetWindowText(hEditResult,""); //hEditResult表示文本框
  nMax=GetWindowTextLength(hEditResult)+1;
  GetWindowText(hEditResult,lpszAddItem,nMax); //用lpszAddItembr存儲字符串
  strcat(lpszAddItem,NumData); ///字符串加該數字鍵的字符
  //lpszOpt表示是否按下操作符鍵,
  //如是沒有按過就賦值為“N”;
  //如是按了就賦值為該操作符
  if (strcmp(lpszOpt,"N")==0)
  {
   strcpy(lpszResult1,lpszAddItem);
   SetWindowText(hEditResult,lpszResult1);
  }
  else
  {
    strcpy(lpszResult2,lpszAddItem);
    SetWindowText(hEditResult,lpszResult2);
  }
  nOptF=1; //按下了數字鍵
}

4.對操作符鍵用也一個函數表示:

//------按下操作符(+,-,*,/,sqrt,%,=)處理函數-----------
void EquResult()
{

//算出結果
  if (strcmp(lpszOpt,"N")==0)
  {
    nResult1=strtod(lpszResult1,&stop);
  }
  else
  {
    switch(*lpszOpt)  //比較上一次按的操作符後所得的結果
    {
     case ''+'':
      nResult1=strtod(lpszResult1,&stop);
      nResult2=strtod(lpszResult2,&stop);
      nResult1=nResult1+nResult2;
      break;
     case ''-'':
      nResult1=strtod(lpszResult1,&stop);
      nResult2=strtod(lpszResult2,&stop);
      nResult1=nResult1-nResult2;
      break;
     case ''*'':
      nResult1=strtod(lpszResult1,&stop);
      nResult2=strtod(lpszResult2,&stop);
      nResult1=nResult1*nResult2;
        break;
     case ''/'':
      nResult1=strtod(lpszResult1,&stop);
        nResult2=strtod(lpszResult2,&stop);
      if (nResult2==0)
      {
        MessageBox(hWndhWnd,"除數不能為零!","功能",MB_OK);
        break;
      }
      nResult1=nResult1/nResult2;
      break;
     case ''%'':
      nResult1=strtod(lpszResult1,&stop);
      nResult1=nResult1/100;
      break;
     case ''S'':
            nResult1=strtod(lpszResult1,&stop);
        if (nResult1<0)
      {
         MessageBox(hWndhWnd,"負數沒有平方根!","沒意義",MB_OK); //hWndhWnd 表示全局變量的窗體句柄
        break;
      }
      nResult=sqrt( nResult1 );
      nResult1=nResult;
      break;
      }

  }
  nResult1=nResult1*1.0;
  _gcvt(nResult1,15,lpszResult1); //雙精度轉化為字符串
  SetWindowText(hEditResult,lpszResult1);
  nOptF=0;
  bDec=false;
}

5.對WM_COMMAND處理:

switch(LOWORD(wParam))
{
 // 零至玖與點按鈕
 case IDB_NUM0: //IDB_NUM0為數字按鈕的ID號
    if (nOptF==0) //剛開始時按0按鈕不起作用
     break;
  NumResult("0");
  break;
  case IDB_NUM1: //1~9的代碼類似
    NumResult("1");
  break;
     .
     .
     .  
case IDB_NUMDEC: //IDB_NUMDEC為點按鈕的ID號
  if (bDec==true)
      break; //如果已按了點號就返回
    NumResult(".");
    nOptF=1; //按了操作符鍵
  bDec=true; //按了點操作符;
  break;
    //MessageBox(hwnd,"沒有此功能!","功能",MB_OK);
  break;
  // 加,減,乘,除,平方根和百分數按鈕
 //加,減,乘,除,平方根和百分數按鈕的代碼都是一樣
case IDB_OPTADD:
    EquResult();
    strcpy(lpszOpt,"+"); //設置按了操作符號+
    break;
case IDB_CANCLE: //清零
    SetWindowText(hEditResult,"0");
    //反變量全部初始化
    nResult=0;
    nAddItem=0;
    nResult1=0;
    nResult2=0;
    strcpy(lpszResult1,"0");
    strcpy(lpszResult2,"0");
    nOptF=0;
    bDec=false;
   strcpy(lpszOpt,"N"); //貯存操作符號
   break;
}

6.添加頭文件也是一件很重要的問題

#include "stdafx.h" //這是系統自動生成的
#include <windows.h>
#include <math.h> //運用到開平方函數
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "resource.h //存儲各個按鈕的ID號

講解本計算器就到這。詳細情況請看源程序來。由於本人是一個初學者在編程中還有許多BUG,請各位VC高手或VC愛好者指點指點。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved