zoukankan      html  css  js  c++  java
  • WIN32窗口框架代码,完善了菜单和子窗口,纯API,可自由扩展,C语言也可以写桌面程序

    编译环境: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);
        }
    }
    生命的意义在于学习,学习让生活变得精彩
  • 相关阅读:
    SharePoint部署webpart时候,报错:部署步骤“回收 IIS 应用程序池”中出现错误: 无效命名空间 解决方案
    免费的分布式的自动化测试工具
    https://github.com/dotnetcore
    SharePoint2013与SharePoint2016语言切换原理以及如何使用代码进行语言切换
    微软开源最强Python自动化神器Playwright!不用写一行代码!
    B站播单按时间统计进度
    AF_INET与PF_INET的区别
    git显示:fatal: index file smaller than expected
    Unix系统中信号SIGKILL和SIGSTOP
    GTM、UTC和C/C++中的时间处理
  • 原文地址:https://www.cnblogs.com/gougouwang/p/11578101.html
Copyright © 2011-2022 走看看