8.ImGui-輸入框

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!

本次游戲沒法給

內容參考于:微塵網絡安全

上一個內容:7.ImGui-單選框和復選框

單行輸入框使用

ImGui::InputText(),下圖中使用的name和pass兩個變量

char name[1024] = "";

char pass[1024] = ""; 是這樣的聲明放在了循環外

name和pass聲明

上方的圖中InputText第一個參數里前面有兩個#,這個原因是如下圖紅框,加兩個#可以隱藏InputText第一個參數的文字

帶默認提示的單行輸入框

使用ImGui::InputTextWithHint函數,通過第二個參數設置默認提示

輸入文字后的效果

多行輸入框

使用 ImGui::InputTextMultiline 函數

它使用的BUF_SIZE和input_text變量的聲明

完整代碼:

#include "main.h"  // 包含程序所需的頭文件,其中聲明了ImGui、DirectX等庫的必要函數和類// 全局變量:存儲DirectX 11核心資源和窗口狀態(整個程序共享)
static UINT                     g_ResizeWidth = 0, g_ResizeHeight = 0;
// 窗口調整大小時的新寬度和高度
// 當窗口大小改變時,WM_SIZE消息會將新尺寸存儲到這兩個變量中
// 主循環會檢測這兩個變量,當它們不為0時進行渲染目標的調整static ID3D11Device* g_pd3dDevice = nullptr;
// Direct3D 11設備對象,是DirectX渲染的核心
// 負責創建所有的渲染資源,如紋理、緩沖區、渲染目標等
// 所有與硬件交互的渲染資源創建都需要通過該設備對象static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr;
// Direct3D 11設備上下文,相當于渲染命令的執行者
// 用于設置渲染狀態、綁定資源、執行繪制命令等操作
// 可以理解為向GPU發送渲染指令的接口static IDXGISwapChain* g_pSwapChain = nullptr;
// 交換鏈對象,管理前后兩個緩沖區實現雙緩沖機制
// 前端緩沖區是正在顯示的畫面,后端緩沖區是正在渲染的畫面
// 渲染完成后通過交換操作將后端緩沖區變為前端,避免畫面閃爍static ID3D11RenderTargetView* g_mainRenderTargetView = nullptr;
// 主渲染目標視圖,是交換鏈后端緩沖區的視圖
// 告訴GPU渲染結果應該輸出到哪個緩沖區
// ImGui繪制的所有UI最終都會渲染到這個目標上static bool                     g_SwapChainOccluded = false;
// 標記交換鏈是否被遮擋(如窗口被其他窗口完全覆蓋)
// 當為true時可以暫停渲染以節省CPU和GPU資源
// 由Present函數的返回值判斷并設置// 聲明ImGui的Win32消息處理函數(定義在imgui_impl_win32.cpp中)
// 該函數用于讓ImGui處理鼠標、鍵盤等輸入消息
// 參數說明:
// - hWnd: 窗口句柄,標識接收消息的窗口
// - msg: 消息類型,如WM_MOUSEMOVE(鼠標移動)、WM_KEYDOWN(按鍵按下)等
// - wParam: 消息參數1,存儲與消息相關的附加信息
// - lParam: 消息參數2,存儲與消息相關的附加信息
// 返回值:如果消息被ImGui處理則返回true,否則返回false
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);// 自定義輔助函數:創建帶提示的幫助標記
// 當鼠標懸停在"(?)"上時,會顯示提示文本
// 參數:
// - desc: 要顯示的提示文本內容
static void HelpMarker(const char* desc)
{ImGui::TextDisabled("(?)");  // 顯示灰色的"(?)"作為幫助標記// 檢查鼠標是否懸停在當前項目上,并開始繪制提示框if (ImGui::BeginItemTooltip()){// 設置文本自動換行的寬度(為字體大小的35倍)// 避免提示文本過長導致超出窗口范圍ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);ImGui::TextUnformatted(desc);  // 顯示提示文本(無格式)ImGui::PopTextWrapPos();       // 恢復文本換行設置ImGui::EndTooltip();           // 結束提示框繪制}
}// 窗口消息處理函數:處理所有與窗口相關的事件
// 包括窗口大小改變、關閉、鼠標鍵盤輸入等
// 參數說明:
// - hWnd: 窗口句柄,標識當前接收消息的窗口
// - msg: 消息類型,Windows系統定義的消息編號
// - wParam: 消息參數1,具體含義取決于消息類型
// - lParam: 消息參數2,具體含義取決于消息類型
// 返回值:LRESULT類型,消息處理的結果
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{// 讓ImGui先處理消息,優先處理UI相關的輸入事件// 如果ImGui處理了該消息(如點擊UI控件),則直接返回if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))return true;// 根據消息類型進行不同處理switch (msg){case WM_SIZE:  // 窗口大小改變事件// 如果是窗口最小化,則不需要調整渲染資源if (wParam == SIZE_MINIMIZED)return 0;// 從lParam中提取新的窗口寬度和高度// LOWORD宏獲取lParam的低16位,存儲寬度// HIWORD宏獲取lParam的高16位,存儲高度g_ResizeWidth = (UINT)LOWORD(lParam);g_ResizeHeight = (UINT)HIWORD(lParam);return 0;case WM_SYSCOMMAND:  // 系統命令事件(如ALT+空格調出窗口菜單)// 禁用ALT菜單,避免菜單彈出時遮擋ImGui控件// SC_KEYMENU是系統菜單命令,0xfff0用于屏蔽低位的擴展信息if ((wParam & 0xfff0) == SC_KEYMENU)return 0;break;  // 其他系統命令交給默認處理case WM_DESTROY:  // 窗口銷毀事件(如點擊關閉按鈕)::PostQuitMessage(0);  // 發送退出消息,主循環會捕獲并結束程序return 0;}// 其他未處理的消息,交給Windows系統默認處理return ::DefWindowProcW(hWnd, msg, wParam, lParam);
}// 創建渲染目標視圖:將交換鏈的后臺緩沖區綁定為渲染目標
// 渲染目標視圖是GPU可以寫入的資源視圖
// 所有的渲染命令最終都會繪制到該渲染目標上
void CreateRenderTarget()
{ID3D11Texture2D* pBackBuffer = nullptr;  // 臨時指針,用于獲取后臺緩沖區// 從交換鏈中獲取后臺緩沖區// 參數1:0表示獲取第一個緩沖區(交換鏈通常有2個緩沖區)// 參數2:IID_ID3D11Texture2D是要獲取的接口ID// 參數3:輸出參數,接收后臺緩沖區的指針g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));// 使用D3D設備創建渲染目標視圖// 參數1:要綁定為渲染目標的紋理(這里是后臺緩沖區)// 參數2:渲染目標視圖的描述(nullptr表示使用默認設置)// 參數3:輸出參數,接收創建的渲染目標視圖g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView);// 釋放臨時的后臺緩沖區指針// 渲染目標視圖已經引用了該緩沖區,不需要再保留此指針pBackBuffer->Release();
}// 清理渲染目標視圖:釋放資源,避免內存泄漏
// COM對象需要通過Release()方法釋放,減少引用計數
// 當引用計數為0時,對象會被自動銷毀
void CleanupRenderTarget()
{if (g_mainRenderTargetView){g_mainRenderTargetView->Release();  // 釋放渲染目標視圖g_mainRenderTargetView = nullptr;   // 置空指針,避免野指針}
}// 創建D3D11設備和交換鏈:初始化DirectX渲染環境
// 參數:
// - hWnd: 窗口句柄,渲染結果將顯示在該窗口中
// 返回值:bool類型,true表示創建成功,false表示失敗
bool CreateDeviceD3D(HWND hWnd)
{// 初始化交換鏈描述結構體,定義交換鏈的屬性DXGI_SWAP_CHAIN_DESC sd;ZeroMemory(&sd, sizeof(sd));  // 清空結構體,避免未初始化的內存導致錯誤// 配置交換鏈參數sd.BufferCount = 2;                   // 緩沖區數量,2表示雙緩沖sd.BufferDesc.Width = 0;              // 緩沖區寬度,0表示自動匹配窗口寬度sd.BufferDesc.Height = 0;             // 緩沖區高度,0表示自動匹配窗口高度sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;  // 像素格式,32位RGBA(8位/通道)sd.BufferDesc.RefreshRate.Numerator = 60;  // 刷新率分子,60表示60Hzsd.BufferDesc.RefreshRate.Denominator = 1; // 刷新率分母,60/1=60Hzsd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;  // 允許切換顯示模式(窗口/全屏)sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;   // 緩沖區用途,作為渲染目標sd.OutputWindow = hWnd;               // 綁定的窗口,渲染結果顯示到該窗口sd.SampleDesc.Count = 1;              // 多重采樣數量,1表示無抗鋸齒sd.SampleDesc.Quality = 0;            // 采樣質量,0表示默認sd.Windowed = TRUE;                   // 窗口模式,TRUE表示窗口化,FALSE表示全屏sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;  // 交換效果,交換后丟棄后臺緩沖區數據UINT createDeviceFlags = 0;  // 創建設備的標志// 調試模式開關,需要安裝DirectX SDK才能使用// createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;D3D_FEATURE_LEVEL featureLevel;  // 存儲實際支持的Direct3D特性級別(版本)// 支持的Direct3D版本列表,優先使用11.0,不支持則使用10.0const D3D_FEATURE_LEVEL featureLevelArray[2] = {D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_10_0};// 創建設備、設備上下文和交換鏈HRESULT res = D3D11CreateDeviceAndSwapChain(nullptr,                       // 顯卡適配器,nullptr表示使用默認顯卡D3D_DRIVER_TYPE_HARDWARE,      // 驅動類型,硬件加速(使用GPU)nullptr,                       // 軟件渲染模塊,不需要則為nullptrcreateDeviceFlags,             // 創建設備的標志featureLevelArray,             // 支持的Direct3D版本列表2,                             // 版本列表的數量D3D11_SDK_VERSION,             // SDK版本,使用當前版本&sd,                           // 交換鏈描述結構體&g_pSwapChain,                 // 輸出參數,接收創建的交換鏈&g_pd3dDevice,                 // 輸出參數,接收創建的D3D設備&featureLevel,                 // 輸出參數,接收實際支持的Direct3D版本&g_pd3dDeviceContext           // 輸出參數,接收創建的設備上下文);// 如果硬件加速失敗(如顯卡不支持D3D11),嘗試使用軟件渲染(WARP驅動)if (res == DXGI_ERROR_UNSUPPORTED)res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP,  // 軟件渲染驅動nullptr, createDeviceFlags,featureLevelArray, 2,D3D11_SDK_VERSION, &sd,&g_pSwapChain, &g_pd3dDevice,&featureLevel, &g_pd3dDeviceContext);if (res != S_OK)  // 如果創建失敗(S_OK表示成功)return false;CreateRenderTarget();  // 創建渲染目標視圖return true;
}// 清理D3D資源:釋放所有DirectX相關對象
// 按照依賴順序釋放,避免資源引用沖突
void CleanupDeviceD3D()
{CleanupRenderTarget();  // 先清理渲染目標視圖// 釋放交換鏈if (g_pSwapChain){g_pSwapChain->Release();g_pSwapChain = nullptr;}// 釋放設備上下文if (g_pd3dDeviceContext){g_pd3dDeviceContext->Release();g_pd3dDeviceContext = nullptr;}// 釋放D3D設備if (g_pd3dDevice){g_pd3dDevice->Release();g_pd3dDevice = nullptr;}
}// 主函數:程序入口點,控制整個程序的生命周期
int main() {// DPI適配:解決高分辨率屏幕下UI模糊的問題ImGui_ImplWin32_EnableDpiAwareness();  // 開啟ImGui對系統DPI的感知// 獲取主顯示器的DPI縮放比例// MonitorFromPoint獲取主顯示器的句柄// ImGui_ImplWin32_GetDpiScaleForMonitor計算該顯示器的縮放比例float main_scale = ImGui_ImplWin32_GetDpiScaleForMonitor(::MonitorFromPoint(POINT{ 0, 0 }, MONITOR_DEFAULTTOPRIMARY));// 創建Windows窗口:ImGui需要一個窗口作為載體來顯示UI// 定義窗口類結構,描述窗口的基本屬性WNDCLASSEXW wc = {sizeof(wc),                  // 結構體大小CS_CLASSDC,                  // 窗口類風格,使用專屬設備上下文WndProc,                     // 窗口消息處理函數0L, 0L,                      // 額外的類數據和窗口數據(未使用)GetModuleHandle(nullptr),    // 程序實例句柄nullptr, nullptr, nullptr, nullptr,  // 圖標、光標、背景畫刷等(使用默認)L"ImGui Example",            // 窗口類名,用于標識該窗口類nullptr                      // 小圖標(使用默認)};::RegisterClassExW(&wc);  // 向系統注冊窗口類// 創建窗口HWND hwnd = ::CreateWindowW(wc.lpszClassName,            // 窗口類名,必須與注冊的類名一致L"Dear ImGui DirectX11 Example",  // 窗口標題欄顯示的文本WS_OVERLAPPEDWINDOW,         // 窗口風格,標準可調整大小的窗口100, 100,                    // 窗口初始位置(屏幕左上角坐標)(int)(1280 * main_scale),    // 窗口寬度,根據DPI縮放(int)(800 * main_scale),     // 窗口高度,根據DPI縮放nullptr, nullptr,            // 父窗口句柄和菜單句柄(無)wc.hInstance, nullptr        // 程序實例句柄和額外數據(無));// 初始化DirectX 11渲染環境if (!CreateDeviceD3D(hwnd))  // 如果創建失敗{CleanupDeviceD3D();  // 清理已創建的資源::UnregisterClassW(wc.lpszClassName, wc.hInstance);  // 注銷窗口類return 1;  // 返回1表示程序異常退出}// 顯示窗口(創建后窗口默認是隱藏的)::ShowWindow(hwnd, SW_SHOWDEFAULT);::UpdateWindow(hwnd);  // 刷新窗口,確保窗口立即顯示// 初始化ImGui:創建UI上下文和配置IMGUI_CHECKVERSION();  // 檢查ImGui版本,確保編譯版本與運行時版本一致ImGui::CreateContext(); // 創建ImGui上下文,管理UI狀態和資源ImGuiIO& io = ImGui::GetIO(); (void)io;  // 獲取IO對象,管理輸入輸出// 配置ImGui功能io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // 開啟鍵盤導航(方向鍵、Tab等)io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;   // 開啟游戲手柄導航// 設置UI縮放:適配高DPI屏幕,避免UI元素過小ImGuiStyle& style = ImGui::GetStyle();style.ScaleAllSizes(main_scale);  // 縮放所有UI元素的大小style.FontScaleDpi = main_scale;  // 縮放字體大小// 初始化ImGui后端:連接ImGui與系統和渲染APIImGui_ImplWin32_Init(hwnd);       // 初始化Win32后端,處理窗口消息和輸入ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);  // 初始化DX11后端,負責渲染UI// 程序狀態變量:控制UI顯示和存儲用戶輸入數據bool show_demo_window = true;    // 是否顯示ImGui演示窗口(未使用)bool show_another_window = false; // 是否顯示另一個窗口(未使用)ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); // 窗口背景色(淺藍色)ImVec4 seBan = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);       // 用于按鈕顏色的變量// 輸入框緩沖區:存儲用戶輸入的文本char name[1024] = "";    // 用戶名輸入緩沖區,容量1024字節char pass[1024] = "";    // 密碼輸入緩沖區,容量1024字節char text[1024] = "";    // 備用文本緩沖區(未使用)// 多行輸入框配置const size_t BUF_SIZE = 1024;                // 緩沖區最大容量char input_text[BUF_SIZE] = "1111...\n22222\n333";  // 初始文本內容// 主循環:程序的核心,持續運行直到用戶關閉窗口bool done = false;  // 控制循環是否結束的標志while (!done){// 處理窗口消息:從消息隊列中獲取并處理所有待處理消息MSG msg;// PeekMessage非阻塞地獲取消息,PM_REMOVE表示獲取后從隊列中移除while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)){::TranslateMessage(&msg);  // 翻譯消息(如將鍵盤掃描碼轉換為字符)::DispatchMessage(&msg);   // 將消息分發到窗口的消息處理函數(WndProc)if (msg.message == WM_QUIT)  // 如果收到退出消息done = true;  // 標記循環結束}if (done)break;  // 退出主循環// 處理窗口遮擋:如果窗口被完全遮擋,減少渲染頻率以節省資源if (g_SwapChainOccluded &&g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED){::Sleep(10);  // 休眠10毫秒continue;     // 跳過本次循環,不進行渲染}g_SwapChainOccluded = false;  // 重置遮擋狀態// 處理窗口大小調整:當窗口大小改變時,調整渲染目標if (g_ResizeWidth != 0 && g_ResizeHeight != 0){CleanupRenderTarget();  // 先清理舊的渲染目標// 調整交換鏈緩沖區大小以匹配新的窗口尺寸g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight,DXGI_FORMAT_UNKNOWN, 0);g_ResizeWidth = g_ResizeHeight = 0;  // 重置尺寸變量CreateRenderTarget();  // 創建新的渲染目標}// 開始ImGui新幀:準備繪制UIImGui_ImplDX11_NewFrame();  // DX11后端準備新幀ImGui_ImplWin32_NewFrame(); // Win32后端準備新幀(處理輸入)ImGui::NewFrame();          // ImGui核心準備,開始定義UI// 定義UI界面:創建一個名為"我的IMGui"的窗口bool is_window_open = true;  // 控制窗口是否顯示的標志// ImGui::Begin()參數說明:// - 第一個參數:窗口標題,同時作為窗口的唯一標識// - 第二個參數:控制窗口是否顯示的指針,關閉窗口時會設為false// - 第三個參數:窗口標志(默認為0,使用默認窗口樣式)ImGui::Begin("我的IMGui", &is_window_open);// 顯示自動換行的長文本ImGui::TextWrapped("This 521 ""aiamaiamaiamaiamaiamaiamaiamaiamaiamaiamaiam");// 顯示帶顏色的文本// ImGui::TextColored()參數:// - 第一個參數:ImVec4類型的顏色(RGBA,每個分量0.0f-1.0f)// - 后續參數:格式化字符串和參數(與printf類似)ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink");  // 粉色文本ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow");  // 黃色文本// 顯示帶顏色的文本和幫助標記,并在同一行ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink2");ImGui::SameLine();  // 讓下一個控件與當前控件在同一行ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow2");ImGui::SameLine();HelpMarker("52am");  // 顯示幫助標記,鼠標懸停顯示"52am"// 顏色編輯控件:允許用戶選擇顏色// ImGui::ColorEdit3()參數:// - 第一個參數:控件標簽// - 第二個參數:顏色變量的指針(需要轉換為float*)// 選擇的顏色會存儲到seBan變量中ImGui::ColorEdit3("clear color", (float*)&seBan);// 修改按鈕樣式:臨時改變按鈕在不同狀態下的顏色// ImGui::PushStyleColor()參數:// - 第一個參數:要修改的顏色類型(ImGuiCol_開頭的枚舉)// - 第二個參數:新的顏色值(ImVec4類型)ImGui::PushStyleColor(ImGuiCol_Button, seBan);           // 按鈕正常狀態顏色ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 1.0f,0.0f,0.0f,1.0f }); // 鼠標懸停狀態ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.0f,1.0f,0.0f,1.0f });  // 鼠標點擊狀態// 創建按鈕:ImGui::Button()返回bool值,表示按鈕是否被點擊if (ImGui::Button("anNiu")) {// 按鈕被點擊時,顯示黃色文本"dianjianniu"ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "dianjianniu");}// 恢復樣式:彈出之前壓入的3個顏色設置// 必須與PushStyleColor的數量一致,否則會影響其他UI元素ImGui::PopStyleColor(3);// 復選框:允許用戶切換選項的開關狀態// ImGui::Checkbox()參數:// - 第一個參數:復選框標簽// - 第二個參數:bool變量的指針,存儲復選框的狀態(true=勾選,false=未勾選)static bool check = true;static bool check1 = true;static bool check2 = false;static bool check3 = true;ImGui::Checkbox("checkbox", &check);ImGui::Checkbox("checkbox1", &check1);ImGui::Checkbox("checkbox2", &check2);ImGui::Checkbox("checkbox3", &check3);// 單選框:從多個選項中選擇一個// ImGui::RadioButton()參數:// - 第一個參數:單選框標簽// - 第二個參數:當前選中項的索引指針// - 第三個參數:當前單選框的索引值static int radio_selected = 0;  // 存儲選中項的索引ImGui::RadioButton("radio a", &radio_selected, 0); ImGui::SameLine();ImGui::RadioButton("radio b", &radio_selected, 1); ImGui::SameLine();ImGui::RadioButton("radio c", &radio_selected, 2);// 輸入框:接收用戶文本輸入ImGui::Text("name");  // 顯示"name"作為輸入框的標簽ImGui::SameLine();    // 與輸入框在同一行// ImGui輸入框的標識規則詳解:// 1. 格式為"標簽##標識符":顯示"標簽",但內部用"標識符"區分不同控件// 2. 格式為"##標識符":不顯示標簽,僅用"標識符"作為內部標識// 3. 無"##":整個字符串既作為顯示標簽,也作為內部標識// 這里"##name"表示:不顯示標簽,內部用"name"作為標識ImGui::InputText("##name", name, IM_ARRAYSIZE(name));ImGui::Text("pass");  // 顯示"pass"作為密碼框的標簽ImGui::SameLine();// 密碼輸入框:ImGuiInputTextFlags_Password標志使輸入內容顯示為*ImGui::InputText("##pass", pass, IM_ARRAYSIZE(pass), ImGuiInputTextFlags_Password);ImGui::InputText("p2ass", pass, IM_ARRAYSIZE(pass), ImGuiInputTextFlags_Password);// 帶提示的輸入框:當輸入框為空時顯示提示文本char hint_text[1024] = "mo ren ti shi";  // 提示文本ImGui::InputTextWithHint("##InputTextWithHint", hint_text,name, IM_ARRAYSIZE(name));// 多行輸入框:允許輸入多行文本ImGui::InputTextMultiline("##MultiLineInput",  // 內部標識(不顯示標簽)input_text,          // 存儲文本的緩沖區BUF_SIZE,            // 緩沖區最大容量ImVec2(0, 200)       // 輸入框尺寸(寬度0表示自適應窗口,高度200像素));ImGui::End();  // 結束窗口定義(必須與ImGui::Begin配對使用)// 渲染UI:將定義的UI繪制到屏幕上ImGui::Render();  // 生成繪制命令列表// 計算背景色(考慮透明度)const float clear_color_with_alpha[4] = {clear_color.x * clear_color.w,clear_color.y * clear_color.w,clear_color.z * clear_color.w,clear_color.w};// 設置渲染目標:告訴GPU接下來的渲染輸出到主渲染目標g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr);// 清空渲染目標:用背景色填充屏幕,清除上一幀的內容g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView,clear_color_with_alpha);// 渲染ImGui的UI:執行繪制命令ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());// 顯示畫面:交換前后緩沖區,將渲染好的畫面顯示到屏幕上// Present()參數:// - 第一個參數:1表示開啟垂直同步(VSync),0表示關閉// - 第二個參數:交換標志(0表示默認行為)HRESULT hr = g_pSwapChain->Present(1, 0);  // 開啟垂直同步// 檢查交換鏈是否被遮擋,用于下一次循環的優化g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED);}// 程序退出:清理所有資源// 關閉ImGui后端ImGui_ImplDX11_Shutdown();ImGui_ImplWin32_Shutdown();ImGui::DestroyContext();  // 銷毀ImGui上下文// 清理D3D資源CleanupDeviceD3D();// 銷毀窗口和窗口類::DestroyWindow(hwnd);::UnregisterClassW(wc.lpszClassName, wc.hInstance);return 0;  // 程序正常退出
}


img

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95859.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年- H120-Lc28. 找出字符串中第一個匹配項的下標(數組)--Java版

1.題目2.思路 短的子串相對不變 所以我們用長的字符串去截取in個長度的子串做遍歷 如果兩者相等 返回字符串第一個匹配項的索引的下標 3.代碼實現 class Solution {public int strStr(String haystack, String needle) {int s1haystack.length();int s2needle.length();//遍歷最…

uport1100系列轉接頭,SZ系列光電編碼器RS485通信

安裝uport1100系列轉接頭驅動 :選擇對應自己系統內核版本的驅動。否則爆出系統內核過高過低等問題。 查看系統內核版本指令: uname -r #簡要 uname -a #詳細驅動下載官網: https://www.moxa.com.cn/support/product-support/software-and-…

Java全棧開發面試實戰:從基礎到微服務架構

Java全棧開發面試實戰:從基礎到微服務架構 在一次互聯網大廠的Java全棧開發崗位面試中,一位名叫李明的28歲程序員,擁有計算機科學與技術本科學歷,工作年限為5年。他的主要職責包括設計和實現前后端分離的Web應用、參與微服務架構的…

win10(三)視頻剪裁

上傳一刻相冊,有30M大小限制。這個軟件能免費剪裁視頻而且支持手機的H.265格式,這個格式目前連potplayer都支持不好。但是配合FFmpeg可以檢測并且能按大小(或時間)剪裁,并上傳到一刻相冊上播放。 下載FFmpeg的方法&am…

Linux--線程

Linux線程概念 1 什么是線程 ? 在?個程序?的?個執?路線就叫做線程(thread)。更準確的定義是:線程是“?個進程內部 的控制序列” ? ?切進程?少都有?個執?線程 ? 線程在進程內部運?,本質是在進程地址空間內運? ? 在L…

【C++】C++11的包裝器:function與bind簡介

各位大佬好,我是落羽!一個堅持不斷學習進步的學生。 如果您覺得我的文章還不錯,歡迎多多互三分享交流,一起學習進步! 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄一、function1. 概念2. 用法二、bind1. 概念2. 用法…

MySQL高級特性詳解

MySQL高級特性詳解 一、自關聯查詢 概念 自關聯查詢是指一個表與它自己進行連接的查詢。通常用于處理具有層級關系或遞歸結構的數據。 應用場景 員工與上級關系分類的父子關系地區的層級關系 示例 -- 創建員工表 CREATE TABLE employees (emp_id INT PRIMARY KEY,emp_name VARC…

深度學習——調整學習率

學習率調整方法詳解在深度學習訓練過程中,學習率(Learning Rate, LR) 是影響模型收斂速度和效果的關鍵超參數。學習率過大可能導致訓練不穩定、震蕩甚至無法收斂;學習率過小又會導致收斂過慢甚至陷入局部最優。因此,如…

Java分頁 Element—UI

前端代碼 <div class"block"><span class"demonstration">頁數較少時的效果</span><el-paginationlayout"prev, pager, next":total"50"></el-pagination> </div>參考Element-UI total:0, form: …

html中列表和表格的使用

列表一般來說只有一列一列的進行使用&#xff0c;是一維的列表分為三種列表形式<!-- 列表標簽ul-li:無序列表&#xff0c;必須用 <ul> 當 “容器”&#xff08;代表 “無序列表”&#xff09;&#xff0c;每個條目用 <li> 包起來&#xff08;代表 “列表項”&am…

大學信息查詢平臺:一個現代化的React教育項目

一 項目簡介大學信息查詢平臺是一個基于React Vite Tailwind CSS構建的現代化Web應用&#xff0c;專門用于查詢中國各大高校的詳細信息。該項目不僅功能實用&#xff0c;更在用戶體驗和界面設計上做到了極致。二 核心功能2.1. 智能大學搜索// 搜索功能核心代碼 const searchU…

代碼隨想錄算法訓練營第六天 - 哈希表2 || 454.四數相加II / 383.贖金信 / 15.三數之和 / 18.四數之和

代碼隨想錄算法訓練營第六天 - 哈希表2 || 454.四數相加II / 383.贖金信 / 15.三數之和 / 18.四數之和454.四數相加II解題思路383.贖金信自己解答&#xff1a;代碼隨想錄講解暴力做法哈希表15.三數之和雙指針優化改進18.四數之和自己的解答系統講解454.四數相加II 文檔講解&…

FPGA實現流水式排序算法

該算法采用雙調排序算法&#xff0c;是一種可流水的遞推算法&#xff0c;且算法的消耗時長可算&#xff0c;具體細節參考視頻&#xff1a; https://www.bilibili.com/video/BV1S3thzWEnh/?spm_id_from333.1387.homepage.video_card.click&vd_source69fb997b62efa60ae1add…

平衡車 -- MPU6050

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” 傳感器原理 此外&#xff0c;用陀螺儀獲取x,y,z軸的加速度。 初始化 我們現在對MPU6050進行初始化&#xff0c;MPU6050通過I2C總線與單片機進行通信&#xff0c;通過的是PB8和PB…

在電路浪涌測試中,TVS(瞬態電壓抑制二極管)的防護效果確實會受到陪測設備中去耦網絡(Decoupling Network,DN)的顯著影響

在電路浪涌測試中&#xff0c;TVS&#xff08;瞬態電壓抑制二極管&#xff09;的防護效果確實會受到陪測設備中去耦網絡&#xff08;Decoupling Network&#xff0c;DN&#xff09;的顯著影響&#xff0c;這一現象與浪涌能量的傳遞路徑、阻抗匹配及信號完整性密切相關。結合 AD…

Redis之分布式鎖與緩存設計

1、分布式鎖 1.1、超賣問題/*** 存在庫存超賣的不安全問題*/private void deductStock() {int stockTotal Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));if (stockTotal > 0) { // 這里存在多個線程、進程同時判斷通過&#xff0c;然后超買…

靜態住宅IP的特點

穩定性高&#xff1a;與動態IP地址相比&#xff0c;靜態住宅IP不會不定時變更&#xff0c;能確保業務在網絡環境中的一致性和連貫性&#xff0c;適合需要長期維持同一身份的場景&#xff0c;如跨境電商業務等3。安全性強&#xff1a;由于其住宅屬性&#xff0c;看起來更像是正常…

Linux 編譯 Android 版 QGroundControl 軟件并運行到手機上

Linux 編譯 Android 版 QGroundControl 軟件并運行到手機上環境說明操作步驟一、參考上一篇文章在電腦端把環境搭建好二、配置 Qt Creator 的 Android 環境環境說明 電腦系統 Ubuntu 22.04 qgroundcontrol master 分支 Qt 6.8.3 操作步驟 一、參考上一篇文章在電腦端把環境搭…

Python 2025:量化金融與智能交易的新紀元

當Python遇見金融大數據&#xff0c;算法交易正迎來前所未有的技術變革在2025年的技術浪潮中&#xff0c;Python已經從一個"膠水語言"蛻變為金融科技領域的核心驅動力。根據GitHub 2025年度報告&#xff0c;Python在量化金融項目中的使用率增長了217%&#xff0c;在對…

[論文閱讀] 人工智能 + 軟件工程 | TDD痛點破解:LLM自動生成測試骨架靠譜嗎?靜態分析+專家評審給出答案

TDD痛點破解&#xff1a;LLM自動生成測試骨架靠譜嗎&#xff1f;靜態分析專家評審給出答案 論文信息項目詳情論文原標題Evaluation of Large Language Models for Generating RSpec Test Skeletons in Ruby on Rails論文鏈接https://arxiv.org/pdf/2509.04644一段話總結 該研究…