• Visual C++ Windows 桌面应用程序样例(摘抄)


    //==================================
    //Windows应用程序框架结构(例子)
    //参考:《Visual C++宝典》陈国建等编著
    //==================================
    #include<Windows.h>
    
    LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); //声明回调函数
    char szWinName[] = "MyWindow";                           //程序的类名称
    
    //入口函数
    int WINAPI WinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nShowCmd)
    {
        HWND hWnd;                                          //窗口句柄
        MSG msg;                                            //消息
        WNDCLASS WndClass;                                  //窗口类
        WndClass.style = CS_HREDRAW | CS_VREDRAW;           //定义窗口类型
        WndClass.lpfnWndProc = WindowFunc;                  //消息处理函数
        WndClass.cbClsExtra = 0;                            //预留空间,0为不预留
        WndClass.cbWndExtra = 0;                            //预留空间,0为不预留
        WndClass.hInstance = hInstance;                     //程序的实例句柄
        WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);   //设置窗口的图标
        WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);     //设置鼠标光标形状
        WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
                                                            //窗口背景为白色
        WndClass.lpszMenuName = NULL;                       //设置窗口菜单
        WndClass.lpszClassName = szWinName;                 //定义窗口类的名称
        if(!RegisterClass(&WndClass))                       //注册窗口
            return 1;
        hWnd = CreateWindow(szWinName,                     //窗口类的名称
                            "MyWindow",                     //窗口的标题
                            WS_OVERLAPPEDWINDOW,            //窗口的风格
                            CW_USEDEFAULT,                  //窗口的坐标 x
                            CW_USEDEFAULT,                  //窗口的坐标 y
                            CW_USEDEFAULT,                  //窗口的宽度
                            CW_USEDEFAULT,                  //窗口的高度
                            NULL,                           //父窗口的句柄
                            NULL,                           //窗口的目录
                            hInstance,                      //窗口的句柄
                            NULL);                          //参数指针
        ShowWindow(hWnd, nShowCmd);                         //显示窗口
        UpdateWindow(hWnd);                                 //更新窗口
        //处理窗口消息
        while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    //定义回调处理函数
    LRESULT CALLBACK WindowFunc(HWND hWnd,
                                UINT message,
                                WPARAM wParam,
                                LPARAM lParam)
    {
        HDC hDC;                                            //设备句柄
        PAINTSTRUCT PaintStruct;                             //声明绘制窗口的客户区
        RECT Rect;                                          //矩形区域
        switch(message)
        {
        case WM_PAINT:                                      //重画消息
            hDC = BeginPaint(hWnd, &PaintStruct);            //准备窗口绘图
            GetClientRect(hWnd, &Rect);                     //得到客户区矩形区域
            //在窗口显示字符串"Hello"
            DrawText(hDC, "Hello, Windows", -1, &Rect,
                     DT_SINGLELINE | DT_CENTER | DT_VCENTER); //绘制字符串
            EndPaint(hWnd, &PaintStruct);                     //结束窗口绘图
            return 0;
        case WM_DESTROY:                                      //销毁窗口消息
            PostQuitMessage(0);                               //发送退出消息
            return 0;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    //附加说明:主要API介绍
    /*
    //1.入口函数
    int WINAPI WinMain(HINSTANCE hInstance,      //应用程序的实例句柄,这个实例句柄是程序的唯一标识
                        HINSTANCE hPrevInstance, //检查是否有多个程序实例运行
                        LPSTR lpCmdLine,         //一个指向字符串的指针,用来保存运行程序时的命令行参数
                        int nShowCmd);           //指定程序开始的时候如何显示
    
    //2.定义并注册窗口类
    typedef struct _WNDCLASS{
        UINT style;            //指定窗口风格:CS_VREDRAW 垂直重画,CS_HREDRAW 水平重画等
        WNDPROC lpfnWndProc;   //指向窗口过程的指针,必须使用CallWindowProc函数调用窗口过程
        int cbClsExtra;        //窗口类结构体之后分配的额外的字节数,系统将该值初始化为0
        int cbWndExtra;        //窗口实例之后分配的额外的字节数,系统将该值初始化为0
        HANDLE hInstance;      //包含该窗口类实例的句柄
        HICON hIcon;           //标识窗口类图标的句柄,必须为一个图标资源的句柄,如果为NULL,系统将提供默认图标
        HCURSOR hCursor;       //标识窗口类光标的句柄,必须为一个图标资源的句柄,如果为NULL,系统将提供默认图标
        HBRUSH hbrBackground;  //窗口背景画刷的句柄
        LPCTSTR lpszMenuName;  //指向以NULL结尾的字符串,该字符串描述菜单的资源名
        LPCTSTR lpszClassName; //指向一个以NULL结尾的字符串,该字符串定义了窗口类的名字
    }WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
     ATON RegisterClass(CONST WNDCLASS *lpWndClass); //注册窗口
    
    //3.创建并显示窗口
    HWND CreateWindow(LPCTSTR lpClassName,   //指向NULL结尾的字符串或整型数atom
                      LPCTSTR lpWindowName,  //指向一个指定窗口名的以NULL结尾的字符串指针
                      DWORD dwStyle,         //指定创建窗口的风格:WS_BORDER 带边框的窗口,WS_CAPTION 带标题栏的窗口等
                      int x,                 //指定窗口的初始水平位置
                      int y,                 //指定窗口的初始垂直位置
                      int nWidth,            //指定窗口宽度
                      int nHeight,           //指定窗口高度
                      HWND hWndParent,       //指向被创建窗口的父窗口或所有者窗口的句柄
                      HMENU hMenu,           //菜单句柄,或依据窗口风格的一个子窗口标识
                      HANDLE hInstance,      //包含窗口类实例的句柄
                      LPVOID lpParam);       //指向一个值的指针,该值传递给窗口WM_CREATE消息
    //返回值:成功返回新窗口的句柄,否则返回NULL
    //显示窗口
    BOOL ShowWindow(HWND hWnd,               //指定窗口句柄
                    int nCmdShow);           //指定窗口如何显示,SW_SHOW 在窗口原来位置显示,SW_HIDE 隐藏窗口并激活其他窗口
    //返回值:如果窗口以前可见则返回一个非零值,如果以前被隐藏则返回0
    
    //4.窗口消息循环
    //Windows会为当前每一个运行的程序建立一个消息队列,用来完成用户与程序的交互。
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatcherMessage(&msg);
    }
    //消息循环从GetMessage函数开始,首先从消息队列中取出一个消息,然后通过TranslateMessage(&msg)函数将msg传递给
    //Windows进行转换,最后使用DispatchMessage(&msg)将msg结构体回传给Windows,再由Windows将此消息发送到相应的
    //窗口过程中进行处理
    
    //5.窗口过程函数
    LRESULT CALLBACK WndProc(HWND hwnd,      //接收消息的窗口句柄,它由CreateWindow函数创建
                             UINT message,   //标识消息类型
                             WPARAM wParam,  //32位的消息参数,用来提供消息的更多信息
                             LPARAM lParam); //32位的消息参数,用来提供消息的更多信息
    
    //6.窗口处理消息
    switch(message)
    {
    case WM_CREATE:
        //...
        break;
    case WM_PAINT:
        //...
        break;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    */

     Visual Studio 2017 创建 Visual C++  Windows 桌面应用程序时(注意:不是添加 MFC 程序),默认生成的代码如下:

    // WindowsProject.cpp: 定义应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "WindowsProject.h"
    
    #define MAX_LOADSTRING 100
    
    // 全局变量: 
    HINSTANCE hInst;                                // 当前实例
    WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
    WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
    
    // 此代码模块中包含的函数的前向声明: 
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
        // TODO: 在此放置代码。
    
        // 初始化全局字符串
        LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadStringW(hInstance, IDC_WINDOWSPROJECT, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // 执行应用程序初始化: 
        if (!InitInstance (hInstance, nCmdShow))
        {
            return FALSE;
        }
    
        //加载窗体热键
        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT));
    
        MSG msg;
    
        // 主消息循环: 
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int) msg.wParam;
    }
    
    
    
    //
    //  函数: MyRegisterClass()
    //
    //  目的: 注册窗口类。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEXW wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT));
        wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT);
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
        return RegisterClassExW(&wcex);
    }
    
    //
    //   函数: InitInstance(HINSTANCE, int)
    //
    //   目的: 保存实例句柄并创建主窗口
    //
    //   注释: 
    //
    //        在此函数中,我们在全局变量中保存实例句柄并
    //        创建和显示主程序窗口。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       hInst = hInstance; // 将实例句柄存储在全局变量中
    
       HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       return TRUE;
    }
    
    //
    //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  目的:    处理主窗口的消息。
    //
    //  WM_COMMAND  - 处理应用程序菜单
    //  WM_PAINT    - 绘制主窗口
    //  WM_DESTROY  - 发送退出消息并返回
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_COMMAND:
            {
                int wmId = LOWORD(wParam);
                // 分析菜单选择: 
                switch (wmId)
                {
                case IDM_ABOUT:
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                    break;
                case IDM_EXIT:
                    DestroyWindow(hWnd);
                    break;
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
                }
            }
            break;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hWnd, &ps);
                // TODO: 在此处添加使用 hdc 的任何绘图代码...
                EndPaint(hWnd, &ps);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // “关于”框的消息处理程序。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }

     网上资料:

    http://www.jellythink.com/archives/111 添加DLL引用

    http://www.jizhuomi.com/school/c/193.html 定时器

    http://www.cnblogs.com/wxfasdic/archive/2010/09/23/1833522.html 多线程

  • 相关阅读:
    五种实用DOM方法总结
    九月工作总结
    八月下半月工作总结
    【工作总结】七月底-八月中
    权限管理功能的实现
    JavaWeb项目出现红色感叹号
    项目中遇到的AngularJs问题
    五月工作总结
    生成流水号的优化
    AngularJS scope 作用域的问题
  • 原文地址:https://www.cnblogs.com/hellowzl/p/7443860.html
Copyright © 2020-2023  润新知