DLL
<1>event.h
#include<windows.h>#include<math.h>#ifndef LIB_H#define LIB_Hextern "C" void _declspec(dllexport)setCalculate(HWND hwnd,HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4);extern "C" void _declspec(dllexport)setClearAll(HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4);#endif
<2>event.cpp
#include"event.h"char Money[] = "";char Rate[] = "";char Year[] = "";char Total[] = "";/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:Check + + *功能: 輸入判斷函數 ++ *參數: a[] 輸入的字串 ++ *傳回值:全是數字返回TRUE 否則返回FALSE ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/BOOL Check(char a[]) {int i;int len = strlen(a);for(i=0;i<len;i++){if(a[i]>'9'||a[i]<'0'){return FALSE;}}return TRUE;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:setCalculate + + *功能: 為CalculateButton添加響應 ++ 輸入本金,利率,年 輸出總錢數 ++ *參數: hwnd 父視窗控制代碼 ++ hwnd1 本金輸入框控制代碼 ++hwnd2 利率輸入框控制代碼 ++hwnd3 年數輸入框控制代碼 + +hwnd4 輸出框控制代碼 ++ *傳回值: ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void setCalculate(HWND hwnd,HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4){GetWindowText(hwnd1,Money,20); GetWindowText(hwnd2,Rate,20);GetWindowText(hwnd3,Year,20); double totalMoney;if(Check(Money)&&Check(Rate)&&Check(Year)){totalMoney = atof(Money)*pow(1/atof(Rate)+1,atoi(Year));gcvt(totalMoney,10,Total);SetWindowText(hwnd4,Total);}else{MessageBox(hwnd,TEXT("對不起,你輸入的格式不對"),TEXT("提示"),MB_OK);SetWindowText(hwnd1,"");SetWindowText(hwnd2,"");SetWindowText(hwnd3,"");SetWindowText(hwnd4,"");}}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:setClearAll + + *功能: 為ClearButton添加響應 ++ 清空所有輸入框輸出框 ++ *參數: hwnd1 本金輸入框控制代碼 ++hwnd2 利率輸入框控制代碼 ++hwnd3 年數輸入框控制代碼 + +hwnd4 輸出框控制代碼 ++ *傳回值: ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void setClearAll(HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4){SetWindowText(hwnd1,"");SetWindowText(hwnd2,"");SetWindowText(hwnd3,"");SetWindowText(hwnd4,"");}
window
<1>window.h
//windows程式的標頭檔#include<windows.h>extern char szTitle[]; //標題條字串extern char szWindowClass[]; //視窗類別名extern char szMenuName[] ; extern int ID,ID_1;//函數原型聲明ATOM InitApplication(HINSTANCE); //用來註冊視窗類別BOOL InitInstance(HINSTANCE , int); //用來建立主視窗LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM); //訊息處理函數int APIENTRY WinMain( HINSTANCE , HINSTANCE , LPSTR , int); //主函數BOOL CreateControl(HINSTANCE,HWND, LPSTR); //建立文字框
<2>window.cpp
#include "window.h"#include<math.h>//全域變數char szTitle[] = "Windows通訊機制和DLL機制"; //標題條字串char szWindowClass[] = "w32"; //視窗類別名char szMenuName[] = "NULL"; //菜單名typedef void (*lpsetCalculateFun)(HWND ,HWND ,HWND ,HWND ,HWND);typedef void (*lpsetClearAllFun)(HWND ,HWND ,HWND ,HWND);HWND hwnd1,hwnd2,hwnd3,hwnd4,calculateButton,clearButton;HWND hwnd; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:WinMain + + *功能: 初始化及註冊視窗類別,建立視窗,進入訊息迴圈及終止應用程式 ++ *參數: hInstance 當前執行個體 ++ hPrevInstance 前一個執行個體 + + lpCmdLine 命令列 + + nCmdShow 選擇顯示視窗或表徵圖 + + *傳回值:msg.wParam ++ +++++++++++++++++++++++++++++++++++++++++++++++++*+++++++++++++++++++++++++++++++*/int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ){MSG msg; //聲明訊息結構對象InitApplication( hInstance); //註冊視窗if( !InitInstance( hInstance, nCmdShow ) ) //初始化{return FALSE;}while ( GetMessage(&msg, (HWND) NULL, 0, 0) ) //訊息迴圈{TranslateMessage(&msg); //檢索訊息 DispatchMessage(&msg); //將訊息間接傳給函數指標}return msg.wParam; //結束訊息迴圈傳回PostQuitMesage }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:InitApplication + + *功能: 用來註冊視窗類別 ++ *參數: hInstance 當前執行個體 ++ *傳回值:如果成功,返回一個唯一的整數,如果失敗,返回0 ++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ATOM InitApplication(HINSTANCE hInstance){WNDCLASS wc; //聲明視窗結構對象//初始化對象的域值wc.style = CS_HREDRAW | CS_VREDRAW; // 如果大小改變了重繪視窗 wc.lpfnWndProc = WndProc; //視窗訊息處理函數wc.cbClsExtra = 0; // 無附加視窗類別記憶體 wc.cbWndExtra = 0; // 無附加視窗記憶體wc.hInstance = hInstance; //當前執行個體wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 表徵圖wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 滑鼠指標wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景畫刷wc.lpszClassName = szWindowClass; // 視窗類別名wc.lpszMenuName = szMenuName; //菜單名return RegisterClass(&wc); //註冊}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:InitInstance + + *功能: 用來建立主視窗 ++ *參數: hInstance 當前執行個體 ++ nCmdShow 選擇顯示視窗或表徵圖 ++ *傳回值:如果成功,返回一個非零值,如果失敗,返回0 ++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ //聲明視窗控制代碼hwnd = CreateWindow( szWindowClass, // 視窗類別名,使用之前註冊的主視窗類 szTitle, // 視窗名,顯示在視窗標題列上的字串 WS_OVERLAPPEDWINDOW |WS_VSCROLL|WS_HSCROLL, //顯示方式 具有水平和垂直滾動 CW_USEDEFAULT, // x起點座標 CW_USEDEFAULT, // y起點座標 400, // 寬 300, // 高 NULL, // 無父視窗 NULL, // 菜單控制代碼 hInstance, //執行個體控制代碼 NULL // 無視窗建立資料);if(!hwnd) // 判斷是否建立成功{return FALSE;} CreateControl( hInstance, hwnd, NULL);ShowWindow(hwnd, nCmdShow); //建立成功便顯示視窗UpdateWindow(hwnd); //送出WM_PAINT訊息return TRUE;}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:CreateControl + + *功能: 建立文字框 ++ *參數: hwndp 父視窗控制代碼 ++ szTitle 視窗標題 ++ *傳回值: ++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/BOOL CreateControl(HINSTANCE hInstance, HWND hwndp, LPSTR szTitle){hwnd1 = CreateWindow( "edit",NULL, WS_CHILD |WS_VISIBLE|WS_BORDER, 50, 40,100, 20, hwndp, NULL,hInstance, NULL);calculateButton = CreateWindow( "BUTTON","計算", WS_CHILD |WS_VISIBLE|WS_BORDER, 180, 40,60, 20, hwndp, NULL,hInstance, NULL);clearButton = CreateWindow( "BUTTON","清除", WS_CHILD |WS_VISIBLE|WS_BORDER, 180, 70,60, 20, hwndp, NULL,hInstance, NULL); hwnd2 = CreateWindow( "edit",NULL, WS_CHILD |WS_VISIBLE|WS_BORDER, 50, 70,100, 20, hwndp, NULL,hInstance, NULL); hwnd3 = CreateWindow( "edit",NULL, WS_CHILD |WS_VISIBLE|WS_BORDER, 50, 100,100, 20, hwndp, NULL,hInstance, NULL); hwnd4 = CreateWindow( "EDIT",NULL, WS_CHILD |WS_VISIBLE|WS_VSCROLL|WS_BORDER|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL, 50, 130,300, 100, hwndp, NULL,hInstance, NULL);ShowWindow(hwnd1, SW_SHOW); ShowWindow(calculateButton, SW_SHOW); ShowWindow(clearButton, SW_SHOW); ShowWindow(hwnd2, SW_SHOW); ShowWindow(hwnd3, SW_SHOW); ShowWindow(hwnd4, SW_SHOW); return TRUE;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ *主函數:WndProc + + *功能: 訊息處理函數 ++ *參數: hwnd 執行個體控制代碼 ++ message 訊息 ++ wParam MSG訊息結構中的域 ++ lParam MSG訊息結構中的域 ++ *傳回值:0 ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/LRESULT CALLBACK WndProc(HWND hwnd , UINT message, WPARAM wParam, LPARAM lParam){PAINTSTRUCT ps;HDC hdc;switch(message){case WM_PAINT:hdc = BeginPaint(hwnd, &ps);TextOut(hdc, 150 , 10, "利息計算機", strlen("利息計算機"));TextOut(hdc, 10 , 40, "本金:", strlen("本金:"));TextOut(hdc, 10 , 70, "利率:", strlen("利率:"));TextOut(hdc, 10 , 100, "年:", strlen("年:"));EndPaint(hwnd,&ps);break;case WM_COMMAND:HINSTANCE hDll; lpsetCalculateFun setCalculateFun;lpsetClearAllFun setClearAllFun; hDll = LoadLibrary("..\\DLL\\Debug\\DLL.dll"); //獲得DLL模組控制代碼 if(hDll!=NULL){setCalculateFun = (lpsetCalculateFun)GetProcAddress(hDll,"setCalculate");//擷取函數的匯出地址setClearAllFun = (lpsetClearAllFun)GetProcAddress(hDll,"setClearAll"); //擷取函數的匯出地址if(setCalculateFun!=NULL){if(LOWORD(lParam)==LOWORD(calculateButton)){setCalculateFun(hwnd,hwnd1,hwnd2,hwnd3,hwnd4);}}if(setClearAllFun!=NULL){if(LOWORD(lParam)==LOWORD(clearButton)){setClearAllFun(hwnd1,hwnd2,hwnd3,hwnd4);}}FreeLibrary(hDll);}else{MessageBox(hwnd,TEXT("hDll建立不成功"),TEXT("提示"),MB_OK);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;}