编译环境:DEVCPP5.0
代码:
#include <windows.h> //#include <stdlib.h> #define IDC_EDIT1 201 #define IDC_EDIT2 202 #define IDC_STATIC 301 #define IDC_BTN1 101 #define IDC_BTN2 102 #define ID_FILE_EXIT 401 #define ID_FILE_EXIT2 404 #define ID_STUFF_GO 402 #define ID_HELP_H 403 LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM ); //声明主窗口处理函数 LRESULT CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); //声明一个弹出窗口回调处理函数 ,先申明即可先调用再定义 void DisplayModelDialog(HWND hwnd); //声明义一个子窗口函数 HINSTANCE hInstance; //将实例句柄作全局申明,方便子窗口调用 /******************************************************主函数**********************************************************************************/ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ WNDCLASSEX wzgwind = {0}; //窗口类结构, 为注册窗口类作准备 wzgwind.cbSize = sizeof(wzgwind); //WNDCLASSEX结构的大小 wzgwind.style = CS_HREDRAW | CS_VREDRAW; //类的风格, 垂直重绘, 水平重绘 wzgwind.cbClsExtra = 0; wzgwind.cbWndExtra = 0; //窗口额外内存, 没有, 设为0 wzgwind.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //使用系统默认背景 //wzgwind.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景, 这里使用灰色背景(另一种表示法) wzgwind.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //应用程序使用的鼠标类型 wzgwind.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); //光标类型 wzgwind.hIconSm = NULL; //应用程序程序的小光标, 不管, 设为 NULL wzgwind.lpszMenuName = NULL; //菜单选项, 没有, 就使用 NULL wzgwind.hInstance = hInstance; //应用程序程序实例句柄, 由 WinMain 函数传递过来 wzgwind.lpfnWndProc = WndProc; //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址 wzgwind.lpszClassName = "wzgwind"; //创建类时使用的类名, 可以自定义 ATOM nAtom = RegisterClassEx(&wzgwind); if (!nAtom ) { MessageBox(NULL, "注册失败", "Infor", MB_OK); return 0; } /*****************************************创建和注册子窗体类,为方便区分,此处单独创建并注册了一个窗体类****************/ WNDCLASSEX windson = {0}; //窗口类结构, 为注册窗口类作准备 windson.cbSize = sizeof(wzgwind); //WNDCLASSEX结构的大小 windson.style = CS_HREDRAW | CS_VREDRAW; //类的风格, 垂直重绘, 水平重绘 windson.cbClsExtra = 0; windson.cbWndExtra = 0; //窗口额外内存, 没有, 设为0 windson.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //使用系统默认背景 //wzgwind.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景, 这里使用灰色背景(另一种表示法) windson.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //应用程序使用的鼠标类型 windson.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); //光标类型 windson.hIconSm = NULL; //应用程序程序的小光标, 不管, 设为 NULL windson.lpszMenuName = NULL; //菜单选项, 没有, 就使用 NULL windson.hInstance = hInstance; //应用程序程序实例句柄, 由 WinMain 函数传递过来 windson.lpfnWndProc = DialogProc; //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址 windson.lpszClassName = "windson"; //创建类时使用的类名, 可以自定义 ATOM nAtomson = RegisterClassEx(&windson); if (!nAtomson ) { MessageBox(NULL, "注册失败", "Infor", MB_OK); return 0; } /**************************************************************************************************************************/ HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"wzgwind","win-gou",WS_VISIBLE|WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* x */ CW_USEDEFAULT, /* y */ 840, /* width */ 620, /* height */ NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); MSG msg = { 0 }; //定义并初始化msg while( msg.message != WM_QUIT ) //使用while循环,如果消息不是WM_QUIT消息,就继续循环 { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看应用程序消息队列,有消息时将队列中的消息派发出去。 { TranslateMessage( &msg ); //将虚拟键消息转换为字符消息 DispatchMessage( &msg ); //分发一个消息给窗口程序。 } } UnregisterClass("wzgwind", wzgwind.hInstance); return 0; } /************************************回调函数*************************************************************************/ LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //声明主窗口的消息处理函数 { static TCHAR sss[256]; //不同的case分支之间传值一定要定义全局变量,否则会出错 static TCHAR sss1[256]; static int len,size,msgb; static double sun; TCHAR szText[256]; HWND edit1,edit2; HWND an1; HWND an2; HWND sta1; switch(uMsg) //消息分支选择,注意SWITCH-CASE结构中,BREAK代表跳出当前SWITCH,RETURN代表结束整个函数。 { case WM_COMMAND: { switch(LOWORD(wParam)) //点击不同的控件显示,走不同的处理路径 { case IDC_BTN1: //点击按钮1触发消息 { //MessageBox(hwnd,"提交成功","提示",MB_OK|MB_ICONINFORMATION); len=GetDlgItemText(hwnd,IDC_EDIT1,sss,255); //获取控件内容函数 ,返回值为控件文本字节长度 //MessageBox(hwnd,sss,"输入内容",MB_OK); GetDlgItemText(hwnd,IDC_EDIT2,sss1,255); sun=atof(sss)+atof(sss1); /*处理数据输入和涉及到数字运算用这个函数转换数据类型:【atof()】是把字符串转换成整型数的一个函数,扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换, 而再遇到非数字或字符串结束时(' ')才结束转换,并将结果返回.默认返回类型为double类型,包含在头文件stdlib.h中。反方向函数为itoa()将整数转换成字符串*/ InvalidateRect(hwnd,NULL,TRUE); //发送刷新指令 ,这个很关键。要不然窗口不显示结果。。 } break; case IDC_BTN2: //点击按钮2触发消息 { DisplayModelDialog(hwnd); } break; case IDC_EDIT1: //MessageBox(hwnd, "请您在这里输入参数", "提示", MB_OK | MB_ICONINFORMATION); break; case ID_FILE_EXIT: //菜单消息处理 MessageBox(hwnd, "弹出测试窗口。","提示", MB_OK | MB_ICONINFORMATION); break; case ID_FILE_EXIT2: //菜单消息处理 msgb = MessageBox(hwnd, "你确定要退出程序吗?","提示", MB_YESNO | MB_ICONINFORMATION); if(msgb==6) DestroyWindow(hwnd); else break; case ID_STUFF_GO: //菜单消息处理 MessageBox(hwnd, "工程菜单测试成功。","提示", MB_OK | MB_ICONINFORMATION); break; //菜单消息处理 case ID_HELP_H: MessageBox(hwnd, "版权信息 王小狗作品,欢迎使用 COPYRIGHT 2010-2019","帮助", MB_OK | MB_ICONINFORMATION); break; default: break; } break; } break; case WM_DESTROY: //当前窗口被销毁时 PostQuitMessage(0); //发出退出程序的消息 break; case WM_CLOSE: //右上角关闭按钮消息 DestroyWindow(hwnd); //销毁窗口 break; case WM_CREATE: //控件创建消息 { edit1 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 220, 30, 100,25,hwnd,(HMENU)IDC_EDIT1, NULL, NULL); //创建编辑框控件 edit2 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 220, 60, 100,25,hwnd,(HMENU)IDC_EDIT2, NULL, NULL); an1 = CreateWindow("button","计算",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,340,60,50,25,hwnd,(HMENU)IDC_BTN1,NULL,NULL); //创建按钮控件 an2 = CreateWindow("button","九九乘法表",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,20,180,100,25,hwnd,(HMENU)IDC_BTN2,NULL,NULL); //sta1= CreateWindow("STATIC","+",WS_CHILD|WS_VISIBLE|SS_CENTER,70,10,300,200,hwnd,(HMENU)IDC_STATIC,NULL,NULL); //创建静态文本框控件,画布,美化作用 /*创建动态菜单*********************************************************************************************************************/ HMENU hMenu,hSubMenu; //定义菜单和子菜单变理 HICON hIcon,hIconSm; //定义大图标和图标变量 hMenu=CreateMenu(); //新建菜单 hSubMenu=CreatePopupMenu(); //新键子菜单 AppendMenu(hSubMenu,MF_STRING,ID_FILE_EXIT,"&测试窗口"); //将子菜单追加到窗体 AppendMenu(hSubMenu,MF_STRING,ID_FILE_EXIT2,"&退出程序"); AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT)hSubMenu,"&文件"); //将主菜单追加到窗体 hSubMenu=CreatePopupMenu(); AppendMenu(hSubMenu,MF_STRING,ID_STUFF_GO,"&子菜单2"); AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT)hSubMenu,"&工程"); hSubMenu=CreatePopupMenu(); AppendMenu(hSubMenu,MF_STRING,ID_HELP_H,"&子菜单3"); AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT)hSubMenu,"&帮助"); SetMenu(hwnd,hMenu); //将菜单设置到那个窗口上 hIcon=(HICON)LoadImage(NULL,TEXT("金色光驱桌面图标.ico"),IMAGE_ICON,32,32,LR_LOADFROMFILE); //装入文件型大图标 /**********************************************************************************************************************************/ } break; case WM_PAINT: //【重绘窗口函消息 】 { HDC hdc; //定义输出设备句柄 //RECT rect; //定义一块显示区域,DrawText 函数需要的参数 PAINTSTRUCT ps = {0}; //定义一个 数组存放字符串 hdc = BeginPaint(hwnd,&ps); //开始重绘 /******************************************核心程序代码区******************************************************************/ SetTextColor(hdc, RGB(255,0,0)); //设置字体颜色 Rectangle(hdc,2,2,818,555); Rectangle(hdc,10,190,810,550); //画矩形,必须在正文之前显示框,否则正文会被覆盖 Rectangle(hdc,10,10,810,180); //矩形(美化类函数,形成边框效果) TextOut(hdc,450,30,TEXT("简单的WIN32窗口框架,能够实现输入和显示"),39); TextOut(hdc,100,30,TEXT("请输入参数A的值:"),16); TextOut(hdc,100,60,TEXT("请输入参数B的值:"),16); TextOut(hdc,100,90,TEXT("A+B= :"),16); /*显示数字用以下代码*/ size = sprintf(szText,TEXT("%.4lf"),sun); TextOut(hdc,220,90,szText,size); /*显示文字或字母用以下代码 TextOut(hdc,550,30,sss,len);*/ /******************************************核心程序代码区******************************************************************/ EndPaint(hwnd,&ps); //结束重绘 } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } /**************************************自定义子窗口函数**********************************************************************/ /*创建子窗口要需要:新设回调函数,新建窗口类 ,新建窗口 */ void DisplayModelDialog(HWND hwnd) { //自定义弹出窗口函数体 EnableWindow(hwnd, FALSE); HWND hson = CreateWindowEx(WS_EX_CLIENTEDGE,"windson","乘法表",WS_VISIBLE|WS_OVERLAPPEDWINDOW, 300, /* x */ 300, /* y */ 820, /* width */ 350, /* height */ hwnd,NULL,hInstance,NULL); ShowWindow(hson,SW_SHOW); //nCmdShow SW_SHOW UpdateWindow(hson); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } EnableWindow(hwnd,TRUE); SetForegroundWindow(hwnd); } /**************************************************自定子义窗口处理函数**********************************/ LRESULT CALLBACK DialogProc(HWND hson, UINT message, WPARAM wParam, LPARAM lParam) { int size,i,j,x=10,y=20; TCHAR szText[256]; switch (message) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: { //【重绘窗口函消息 】 HDC hdc; //定义输出设备句柄 PAINTSTRUCT ps = {0}; //定义一个 数组存放字符串 hdc = BeginPaint(hson,&ps); //开始重绘 /******************************************核心程序代码区******************************************************************/ SetTextColor(hdc, RGB(255,0,0)); //设置字体颜色 Rectangle(hdc,2,2,818,555); Rectangle(hdc,10,10,790,300); //画矩形,必须在正文之前显示框,否则正文会被覆盖 TextOut(hdc,350,15,TEXT("九九乘法表"),10); //直接文本显示 for(i=1;i<=9;i++) for(j=1;j<=i;j++) { size = wsprintf(szText,TEXT("%d×%d=%2d"),j,i,i*j); //将变量S,I的值按照格式符号%s%d转换后存入缓冲区szText,返回值为字节长度 /*注意:因为 wsprintf不支持浮点数,所以处理高精度数据计算式要用 swprintf代替*/ TextOut(hdc,x+j*80,y+i*25, szText,size); } /******************************************核心程序代码区******************************************************************/ EndPaint(hson,&ps); //结束重绘 } break; default: return DefWindowProc(hson, message, wParam, lParam); } }