日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )

發(fā)布時(shí)間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、導(dǎo)入頭文件
  • 二、桌面程序入口函數(shù)
  • 三、注冊窗口
  • 四、創(chuàng)建窗口
  • 五、顯示窗口
  • 六、完整代碼示例
  • 七、相關(guān)資源


基于 【OpenGL】一、Visual Studio 2019 創(chuàng)建 Windows 桌面程序 ( Visual Studio Installer 安裝 C++ 桌面開發(fā)庫 | 創(chuàng)建桌面程序 ) 博客中創(chuàng)建的 Windows 桌面程序繼續(xù)向下講解 , Visual Studio 自動生成了空白的桌面程序 , OpenGL 系列開發(fā)基于該桌面程序進(jìn)行 ;

本篇博客簡單介紹下該桌面初始化的操作 , 注冊桌面窗口 , 創(chuàng)建桌面窗口 , 顯示桌面窗口 ;





一、導(dǎo)入頭文件



Windows 窗口程序需要導(dǎo)入 windows.h 頭文件 ;

// Windows 頭文件 #include <windows.h>

下面的代碼時(shí) Visual Studio 創(chuàng)建桌面程序時(shí) , 自動生成的頭文件 , 其中包含了 windows.h 頭文件 ;

// header.h: 標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件, // 或特定于項(xiàng)目的包含文件 //#pragma once#include "targetver.h" #define WIN32_LEAN_AND_MEAN // 從 Windows 頭文件中排除極少使用的內(nèi)容 // Windows 頭文件 #include <windows.h> // C 運(yùn)行時(shí)頭文件 #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h>



二、桌面程序入口函數(shù)



Windows 桌面程序的入口wWinMain 函數(shù) ,

該函數(shù)相當(dāng)于命令行程序中的 void main() 函數(shù) ;

完整的 wWinMain 函數(shù)格式 :

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow)



三、注冊窗口



使用 WNDCLASSEXW 結(jié)構(gòu)體注冊窗口 ;

WNDCLASSEXW 結(jié)構(gòu)體代碼如下 :

typedef struct tagWNDCLASSEXW {UINT cbSize;/* Win 3.x */UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;/* Win 4.0 */HICON hIconSm; } WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;

下面是該結(jié)構(gòu)體各個(gè)字段的含義 :

  • style : 窗口風(fēng)格 ;
  • lpfnWndProc : 設(shè)置消息響應(yīng)函數(shù) , 如響應(yīng)鼠標(biāo) , 鍵盤事件 ;
  • cbWndExtra : 窗口是否需要額外空間 ;
  • hInstance : 窗口實(shí)體 , 通過桌面程序入口函數(shù)傳入 ;
  • hIcon : 生成的程序在文件夾中的樣式 , 可執(zhí)行程序的圖標(biāo)
  • hCursor : 設(shè)置鼠標(biāo)光標(biāo)樣式 ;
  • hbrBackground : 設(shè)置背景 ;
  • lpszMenuName : 設(shè)置菜單 ;
  • lpszClassName : 設(shè)置窗口標(biāo)識 ;

窗口注冊代碼示例 : 下面的代碼時(shí) Visual Studio 自動身

// // 函數(shù): MyRegisterClass() // // 目標(biāo): 注冊窗口類。 // ATOM MyRegisterClass(HINSTANCE hInstance) {// 注冊窗口的結(jié)構(gòu)體WNDCLASSEXW wcex;// 設(shè)置結(jié)構(gòu)體的大小wcex.cbSize = sizeof(WNDCLASSEX);// 窗口風(fēng)格 , CS 是 Class Style 縮寫 , VREDRAW 垂直重繪 , HREDRAW 水平重繪wcex.style = CS_HREDRAW | CS_VREDRAW;// 消息響應(yīng)函數(shù) , 鼠標(biāo)點(diǎn)擊窗口 , 或打字字后的回調(diào)函數(shù)wcex.lpfnWndProc = WndProc;// 不需要額外的空間wcex.cbClsExtra = 0;// 不需要額外的空間wcex.cbWndExtra = 0;// 設(shè)置程序的實(shí)例, 通過桌面程序入口函數(shù)傳入wcex.hInstance = hInstance;// 生成的程序在文件夾中的樣式 , 可執(zhí)行程序的圖標(biāo)wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_OPENGL));// 設(shè)置鼠標(biāo)光標(biāo)樣式wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);// 設(shè)置背景wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);// 菜單wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_OPENGL);// 窗口的唯一標(biāo)識符wcex.lpszClassName = szWindowClass;// 設(shè)置窗口運(yùn)行后顯示在右上角的圖標(biāo)wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));// 設(shè)置完上述參數(shù)后 , 最后調(diào)用該方法注冊窗口return RegisterClassExW(&wcex); }



四、創(chuàng)建窗口



調(diào)用 CreateWindowW 方法 , 創(chuàng)建 Windows 窗口 ,

創(chuàng)建完成之后 , 驗(yàn)證下創(chuàng)建方法返回值 hWnd , 如果創(chuàng)建失敗 , 直接退出 ;

// 創(chuàng)建窗口的核心邏輯HWND hWnd = CreateWindowW(szWindowClass, // 窗口主類szTitle, // 窗口標(biāo)題名稱WS_OVERLAPPEDWINDOW, // 窗口風(fēng)格100 , // x 坐標(biāo)100 , // y 坐標(biāo)800, // 寬度600, // 高度nullptr, // 父窗口 nullptr, // 菜單hInstance, // 程序?qū)嶓wnullptr);// 如果創(chuàng)建失敗 , 直接退出if (!hWnd){return FALSE;}



五、顯示窗口



創(chuàng)建完成后 , 顯示窗口 ;

// 顯示窗口ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);





六、完整代碼示例



Windows 窗口完整代碼 , 這是 Visual Studio 自動生成的代碼 ;

// OpenGL.cpp : 定義應(yīng)用程序的入口點(diǎn)。 // 窗口程序入口 // 代碼提交測試#include "framework.h" #include "OpenGL.h"#define MAX_LOADSTRING 100// 全局變量: HINSTANCE hInst; // 當(dāng)前實(shí)例 WCHAR szTitle[MAX_LOADSTRING]; // 標(biāo)題欄文本 WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口類名 // 此代碼模塊中包含的函數(shù)的前向聲明: 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_OPENGL, szWindowClass, MAX_LOADSTRING);// 注冊窗口MyRegisterClass(hInstance);// 執(zhí)行應(yīng)用程序初始化:// 創(chuàng)建窗口if (!InitInstance (hInstance, nCmdShow)){return FALSE;}// 下面的邏輯是一個(gè)死循環(huán) , 避免讓窗口退出 HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_OPENGL));MSG msg;// 主消息循環(huán):while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam; }// // 函數(shù): MyRegisterClass() // // 目標(biāo): 注冊窗口類。 // ATOM MyRegisterClass(HINSTANCE hInstance) {// 注冊窗口的結(jié)構(gòu)體WNDCLASSEXW wcex;// 設(shè)置結(jié)構(gòu)體的大小wcex.cbSize = sizeof(WNDCLASSEX);// 窗口風(fēng)格 , CS 是 Class Style 縮寫 , VREDRAW 垂直重繪 , HREDRAW 水平重繪wcex.style = CS_HREDRAW | CS_VREDRAW;// 消息響應(yīng)函數(shù) , 鼠標(biāo)點(diǎn)擊窗口 , 或打字字后的回調(diào)函數(shù)wcex.lpfnWndProc = WndProc;// 不需要額外的空間wcex.cbClsExtra = 0;// 不需要額外的空間wcex.cbWndExtra = 0;// 設(shè)置程序的實(shí)例, 通過桌面程序入口函數(shù)傳入wcex.hInstance = hInstance;// 生成的程序在文件夾中的樣式 , 可執(zhí)行程序的圖標(biāo)wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_OPENGL));// 設(shè)置鼠標(biāo)光標(biāo)樣式wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);// 設(shè)置背景wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);// 菜單wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_OPENGL);// 窗口的唯一標(biāo)識符wcex.lpszClassName = szWindowClass;// 設(shè)置窗口運(yùn)行后顯示在右上角的圖標(biāo)wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));// 設(shè)置完上述參數(shù)后 , 最后調(diào)用該方法注冊窗口return RegisterClassExW(&wcex); }// // 函數(shù): InitInstance(HINSTANCE, int) // // 目標(biāo): 保存實(shí)例句柄并創(chuàng)建主窗口 // // 注釋: // // 在此函數(shù)中,我們在全局變量中保存實(shí)例句柄并 // 創(chuàng)建和顯示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {hInst = hInstance; // 將實(shí)例句柄存儲在全局變量中// 創(chuàng)建窗口的核心邏輯HWND hWnd = CreateWindowW(szWindowClass, // 窗口主類szTitle, // 窗口標(biāo)題名稱WS_OVERLAPPEDWINDOW, // 窗口風(fēng)格100 , // x 坐標(biāo)100 , // y 坐標(biāo)800, // 寬度600, // 高度nullptr, // 父窗口 nullptr, // 菜單hInstance, // 程序?qū)嶓wnullptr);// 如果創(chuàng)建失敗 , 直接退出if (!hWnd){return FALSE;}// 顯示窗口ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE; }// // 函數(shù): WndProc(HWND, UINT, WPARAM, LPARAM) // // 目標(biāo): 處理主窗口的消息。 // // WM_COMMAND - 處理應(yīng)用程序菜單 // WM_PAINT - 繪制主窗口 // WM_DESTROY - 發(fā)送退出消息并返回 // // 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; }// “關(guān)于”框的消息處理程序。 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; }



七、相關(guān)資源



GitHub 地址 : https://github.com/han1202012/OpenGL

博客源碼快照 : https://download.csdn.net/download/han1202012/14503846

總結(jié)

以上是生活随笔為你收集整理的【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品亚洲第一 | 欧美日韩一级二级 | 天天天天天天天天干 | 久久禁 | 四虎影院成人 | 中文字幕视频免费 | 欧美视频xxx | 亚洲小说春色综合另类 | 欧美一区二区三区影视 | 免费成人黄色网 | jlzzjlzz欧美大全 | 成人h动漫精品一区二 | 国产经典三级 | 黄色茄子视频 | 国产亚洲综合在线 | 人人干在线 | 自拍偷拍20p | 天堂网av手机版 | 97国产高清| 色小说在线观看 | 不卡av网| 国产欧美视频在线 | 美国成人免费视频 | 欧美成人黑人猛交 | 国产毛片99 | 亚洲无吗在线 | 欧美成人黄色小视频 | 91高清网站 | 午夜一区二区三区免费 | av久草| 国产精品电影网站 | 国产精品高潮呻吟AV无码 | 欧美激情综合五月色丁香 | 丰满的女人性猛交 | 国产精品视频一区二区三区在3 | 爱乃なみ加勒比在线播放 | 国产在线视频自拍 | 国产一级片网站 | av白浆| 成人影视在线播放 | 少妇被躁爽到高潮无码人狍大战 | 亚洲欧美色视频 | 色女人天堂| 一级欧美日韩 | 日本女优中文字幕 | 女人下边被添全过视频 | 色欧美88888久久久久久影院 | 在线观看免费人成视频 | 午夜影院男女 | 久久一级黄色片 | 国产午夜三级 | 日本精品一二区 | 黑丝袜av | 成人污污www网站免费丝瓜 | 国产精品无码av在线有声小说 | 九九久久网 | 人人草在线视频 | 国产精品久久久久久人妻精品动漫 | 国产日韩大片 | 激情综合文学 | 色狠狠一区二区三区香蕉 | 精品国产精品网麻豆系列 | 狠狠操综合| 色噜噜狠狠狠综合曰曰曰88av | 884aa四虎影成人精品一区 | 青青草原综合网 | 天天av网 | 色一情一乱一乱一区91av | 黄色网免费观看 | 国产精品精品久久久 | 色图社区 | 色偷偷综合网 | 噜噜噜噜私人影院 | 国产大学生视频 | 毛片99| 欧美黄色大片网站 | 一级影片在线观看 | 欧美激情综合色综合啪啪五月 | 国产熟女高潮视频 | 视屏一区 | 久久久久久久久久福利 | 日韩精品一卡二卡 | 日韩手机看片 | 人人草人人搞 | 精品国产中文字幕 | 国产精品久久久久久久久免费桃花 | 99伊人网 | 欧美日韩电影一区 | 侵犯女教师一区二区三区 | 在线观看中文 | 精品国产乱码久久久久久88av | 少妇乱淫| 99热在线观看精品 | 精品国产乱码久久久久久88av | 成人18视频在线观看 | 亚洲精品国产精品乱码 | 被两个男人吃奶三p爽文 | 婷婷视频在线 | 新x8x8拨牐拨牐永久免费影库 |