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 多线程

posted on 2017-08-28 14:54  wangzhiliang  阅读(10732)  评论(0编辑  收藏  举报

导航