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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM