DLL
<1>event.h
#include<windows.h> #include<math.h> #ifndef LIB_H #define LIB_H extern "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; }