1. 程式人生 > 程式設計 >VS2019使用Windows桌面應用程式模組建立Win32視窗

VS2019使用Windows桌面應用程式模組建立Win32視窗

本文介紹了VS2019使用Windows桌面應用程式模組建立Win32視窗,分享給大家,具體如下:

VS2019使用Windows桌面應用程式模組建立Win32視窗

標頭檔案Project1.h:

#pragma once
#include "resource.h"

實現檔案Project1.cpp:

// Project1.cpp : 定義應用程式的入口點。
//

#include "framework.h"
#include "Project1.h"

#define MAX_LOADSTRING 100

// 全域性變數:
HINSTANCE hInst;                // 當前例項
WCHAR szTitle[MAX_LOADSTRING];         // 標題欄文字 16位雙位元組字元
WCHAR szWindowClass[MAX_LOADSTRING];      // 主視窗類名

// 此程式碼模組中包含的函式的前向宣告:
ATOM        MyRegisterClass(HINSTANCE hInstance); //返回unsigned short 2位元組整數
BOOL        InitInstance(HINSTANCE,int);
LRESULT CALLBACK  WndProc(HWND,UINT,WPARAM,LPARAM); //返回long 4位元組整數 作地址
INT_PTR CALLBACK  About(HWND,LPARAM); //返回int 4位元組整數 作地址
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,/*typedef void *HINSTANCE;控制代碼是一個二級指標*/
           _In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR  lpCmdLine,/*wchar_t *LPWSTR 指向16位UNICODE寬字元的指標*/
           _In_ int    nCmdShow)
{
  UNREFERENCED_PARAMETER(hPrevInstance);
  UNREFERENCED_PARAMETER(lpCmdLine);

  // TODO: 在此處放置程式碼。

  // 初始化全域性字串
  LoadStringW(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING); //獲取傳入應用程式例項的應用程式標題欄文字到定義的全域性寬字串szTitle
  LoadStringW(hInstance,IDC_PROJECT1,szWindowClass,MAX_LOADSTRING);//獲取傳入應用程式例項的視窗類名到定義的全域性寬字串szWindowClass
  MyRegisterClass(hInstance);

  // 執行應用程式初始化:
  if (!InitInstance (hInstance,nCmdShow))
  {
    return FALSE;
  }

  HACCEL hAccelTable = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_PROJECT1));

  MSG msg;

  // 主訊息迴圈:
  while (GetMessage(&msg,nullptr,0))
  {
    if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }

  return (int) msg.wParam;
}
//
// 函式: MyRegisterClass()
//
// 目標: 註冊視窗類。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
  WNDCLASSEXW wcex; //定義視窗類 wcex 這時候視窗類相當於模板視窗類WNDCLASSEXW的一個物件 (物件化模板視窗類)

  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_PROJECT1));
  wcex.hCursor    = LoadCursor(nullptr,IDC_ARROW);
  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  wcex.lpszMenuName  = MAKEINTRESOURCEW(IDC_PROJECT1);
  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,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,hInstance,nullptr);

  if (!hWnd)
  {
   return FALSE;
  }

  ShowWindow(hWnd,nCmdShow);
  UpdateWindow(hWnd);

  return TRUE;
}
//
// 函式: WndProc(HWND,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: //DialogBoxParamA(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)
        DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);
        break; //#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
      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,lParam);
  }
  return 0;
}
// “關於”框的訊息處理程式。
INT_PTR CALLBACK About(HWND hDlg,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;
}

到此這篇關於VS2019使用Windows桌面應用程式模組建立Win32視窗的文章就介紹到這了,更多相關VS2019建立Win32視窗內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!