18.第二階段x64游戲實戰-MFC列表框

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

本次游戲沒法給

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

上一個內容:17.第二階段x64游戲實戰-人工遍歷二叉樹結構

現在找到了附近npc列表,接下來就要把它們顯示出來,用什么顯示?這里用MFC的列表控件,本次就來寫MFC的列表控件該怎樣使用

首先打開Visual Studio 2022,點擊創建新項目

選擇MFC應用

然后如下圖進行選擇

然后選擇

然后選擇Dlg,選擇完點完成,注:沒有紅框圈出來說改的都是默認值不用管

點擊完成之后如下圖的樣子

挨個單機下圖紅框位置,然后按鍵盤上的刪除鍵或鼠標右擊選擇刪除,把它們全刪了

然后視圖然后選擇工具箱

然后在工具箱里選擇List Control(列表)

然后添加一個按鈕

然后鼠標右擊List Control選擇添加變量

然后寫一個變量名

然后來到下圖OnInitDialog函數里(文件名是項目名+Dlg.cpp)

設置控件樣式(設置List Control的樣式)如下圖紅框的代碼

BOOL CMFC列表框Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// TODO: 在此添加額外的初始化代碼/*** ModifyStyle修改樣式* 0 表示移除當前所有樣式* LVS_REPORT 設置List Control視圖報告模式,也就是顯示多列* LVS_SINGLESEL 設置List Control 只允許單選* LVS_SHOWSELALWAYS 設置List Control 失去焦點也顯示選中* LVS_ALIGNLEFT 設置List Control 項(數據)的文本左對齊* WS_VSCROLL 給List Control 添加垂直滾動條* WS_BORDER 給List Control 添加邊框*/m_list.ModifyStyle(0, LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_VSCROLL | WS_BORDER);/**SetExtendedStyle給List Control添加擴展樣式LVS_EX_FULLROWSELECT 設置全行選擇模式,也就是選中時整行高亮LVS_EX_GRIDLINES 顯示網格線LVS_EX_DOUBLEBUFFER 啟用雙緩存,減少閃爍*/m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER);return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}

樣式效果圖如下圖紅框:

接下來給列表添加數據,這時候就要用到按鈕了,首先如下圖選擇視圖,然后選擇其他窗口,然后選擇資源視圖

然后找下圖紅框位置,IDD_ABOUTBOX和IDD_MFC_DIALOG都是窗口,如果不確定哪一個是我們的窗口都鼠標左鍵雙擊打開看一看,然后 IDD_ABOUTBOX和IDD_MFC_DIALOG 這倆名字都是MFC給我們創建的,我們是可以修改或添加的,修改和添加后面用到了再寫

然后鼠標左鍵雙擊下圖紅框的按鈕

如下圖紅框,鼠標左鍵雙擊完,它就會給我們創建按鈕點擊時執行的函數代碼

添加如下圖紅框里的代碼,給列表添加列和數據

void CMFC列表框Dlg::OnBnClickedButton1()
{/**InsertColumn用來給列表插入列0 新列的索引,也就是插入在第幾列L"id" 列名為idLVCFMT_CENTER 文本居中對齊120 是列的寬度0 后面用到的時候在說,不用它很難理解*/m_list.InsertColumn(0, L"id", LVCFMT_CENTER, 120, 0);m_list.InsertColumn(1, L"名字", LVCFMT_CENTER, 200, 0);m_list.InsertColumn(2, L"對象", LVCFMT_CENTER, 120, 0);m_list.InsertColumn(3, L"血量", LVCFMT_CENTER, 120, 0);m_list.InsertColumn(4, L"坐標", LVCFMT_CENTER, 160, 0);for (int i = 0; i < 1000; i++) {// InsertItem添加一行數據,它僅僅是添加一行數據m_list.InsertItem(i, L"");}for (int i = 0; i < 1000; i++) {CString tmp;tmp.Format(L"%d", i);// 它是先通過InsertItem添加一行數據,然后再使用SetItemText對某行數據進行設置,添加數據時沒法指定列/**SetItemText設置列表中某行數據i表示第幾行,這里就表示第i行0表示第幾列0就是第一列tmp是第i行第0列顯示的內容*/m_list.SetItemText(i, 0, tmp);m_list.SetItemText(i, 1, tmp);m_list.SetItemText(i, 2, tmp);m_list.SetItemText(i, 3, tmp);m_list.SetItemText(i, 4, tmp);}}

效果圖:

完整代碼:

// MFC列表框Dlg.cpp: 實現文件
//#include "pch.h"
#include "framework.h"
#include "MFC列表框.h"
#include "MFC列表框Dlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于應用程序“關于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 實現
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CMFC列表框Dlg 對話框CMFC列表框Dlg::CMFC列表框Dlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFC_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMFC列表框Dlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, m_list);
}BEGIN_MESSAGE_MAP(CMFC列表框Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &CMFC列表框Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()// CMFC列表框Dlg 消息處理程序BOOL CMFC列表框Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// TODO: 在此添加額外的初始化代碼/*** ModifyStyle修改樣式* 0 表示移除當前所有樣式* LVS_REPORT 設置List Control視圖報告模式,也就是顯示多列* LVS_SINGLESEL 設置List Control 只允許單選* LVS_SHOWSELALWAYS 設置List Control 失去焦點也顯示選中* LVS_ALIGNLEFT 設置List Control 項(數據)的文本左對齊* WS_VSCROLL 給List Control 添加垂直滾動條* WS_BORDER 給List Control 添加邊框*/m_list.ModifyStyle(0, LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_VSCROLL | WS_BORDER);/**SetExtendedStyle給List Control添加擴展樣式LVS_EX_FULLROWSELECT 設置全行選擇模式,也就是選中時整行高亮LVS_EX_GRIDLINES 顯示網格線LVS_EX_DOUBLEBUFFER 啟用雙緩存,減少閃爍*/m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER);return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}void CMFC列表框Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向對話框添加最小化按鈕,則需要下面的代碼
//  來繪制該圖標。  對于使用文檔/視圖模型的 MFC 應用程序,
//  這將由框架自動完成。void CMFC列表框Dlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CMFC列表框Dlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMFC列表框Dlg::OnBnClickedButton1()
{/**InsertColumn用來給列表插入列0 新列的索引,也就是插入在第幾列L"id" 列名為idLVCFMT_CENTER 文本居中對齊120 是列的寬度0 后面用到的時候在說,不用它很難理解*/m_list.InsertColumn(0, L"id", LVCFMT_CENTER, 120, 0);m_list.InsertColumn(1, L"名字", LVCFMT_CENTER, 200, 0);m_list.InsertColumn(2, L"對象", LVCFMT_CENTER, 120, 0);m_list.InsertColumn(3, L"血量", LVCFMT_CENTER, 120, 0);m_list.InsertColumn(4, L"坐標", LVCFMT_CENTER, 160, 0);for (int i = 0; i < 1000; i++) {// InsertItem添加一行數據,它僅僅是添加一行數據m_list.InsertItem(i, L"");}for (int i = 0; i < 1000; i++) {CString tmp;tmp.Format(L"%d", i);// 它是先通過InsertItem添加一行數據,然后再使用SetItemText對某行數據進行設置,添加數據時沒法指定列/**SetItemText設置列表中某行數據i表示第幾行,這里就表示第i行0表示第幾列0就是第一列tmp是第i行第0列顯示的內容*/m_list.SetItemText(i, 0, tmp);m_list.SetItemText(i, 1, tmp);m_list.SetItemText(i, 2, tmp);m_list.SetItemText(i, 3, tmp);m_list.SetItemText(i, 4, tmp);}}

?

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

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

相關文章

如何解決 Xcode 簽名證書和 Provisioning Profile 過期問題

在 iOS 應用開發過程中&#xff0c;簽名證書和 Provisioning Profile 是確保應用安全性和合法性的關鍵組件。然而&#xff0c;當這些證書或配置文件過期時&#xff0c;開發者可能會遇到編譯或歸檔失敗的問題。本文將詳細介紹如何解決 Xcode 中“iOS Distribution”證書未找到和…

SpringBoot Actuator未授權訪問漏洞的全面解析與解決方案

引言 SpringBoot Actuator 作為應用監控與管理的核心組件,為開發者提供了豐富的系統自省和運維能力。然而,其默認配置中可能存在的未授權訪問漏洞,已成為企業安全防護的潛在風險。本文將從漏洞原理、影響范圍、檢測方法到解決方案,系統性地剖析該問題,并提供覆蓋開發、運維…

gin框架學習筆記

Gin 是一個基于 Go 語言的高性能 Web 框架 gin下載 在已有的go項目直接終端輸入 go get -u github.com/gin-gonic/gin hello world快速上手 package mainimport ("github.com/gin-gonic/gin" )func main() {router : gin.Default()router.GET("/", func…

linux中由于編譯選項-D_OS64BIT導致的核心已轉儲問題

linux中由于編譯選項-D_OS64BIT導致的核心已轉儲問題排查解決&#xff1a; 原因&#xff1a; a.so b.so a.so使用b.so 程序1 程序2 使用a.so 程序1運行正常&#xff0c;程序2啟動后提示核心已轉儲。 程序1和程序2運行的代碼都一致&#xff0c;只執行創建xApplication app&…

什么是ICSP編程

ICSP編程介紹 ICSP 編程&#xff08;In-Circuit Serial Programming&#xff09;&#xff0c;即“在線串行編程”&#xff0c;是一種通過 SPI 協議 直接對微控制器&#xff08;如 Arduino 的 ATmega328P&#xff09;進行編程的技術&#xff0c;無需移除芯片。它常用于以下場景…

基于Vue3和OpenLayers的WebGIS示例程序

筆記參考教程來源于B站UP主znlgis的視頻合集&#xff1a;https://space.bilibili.com/161342702&#xff0c;直播使用的源碼地址&#xff1a;https://github.com/OpenGisToolbox。 Demo合集分為5大部分&#xff0c;分別是&#xff1a;基礎環境搭建、項目搭建、GeoServer Rest A…

UBUS 通信接口的使用——添加一個object對象(ubus call)

1&#xff0c;引入 ubus提供了一種多進程通信的機制。存在一個守護進程ubusd&#xff0c;所以進程都注冊到ubusd&#xff0c;ubusd進行消息的接收、分發管理。 ubus對多線程支持的不好&#xff0c;例如在多個線程中去請求同一個服務&#xff0c;就有可能出現不可預知的結果。 …

【Python魔法方法(特殊方法)】

在 Python 中&#xff0c;許多運算符都可以進行重載&#xff0c;以下是一些常見運算符及其對應的魔法方法&#xff08;特殊方法&#xff09;&#xff1a; 算術運算符 加法 &#xff1a;__add__ 用于定義對象相加的行為。例如&#xff0c;當你對兩個自定義類的實例使用 運算符…

(三十二)Android開發中AppCompatActivity和Activity之間的詳細區別

在 Android 開發中&#xff0c;AppCompatActivity 和 Activity 是兩個核心類&#xff0c;用于創建和管理應用程序的用戶界面。盡管它們功能上有重疊&#xff0c;但它們之間存在顯著的區別。本文將詳細講解 AppCompatActivity 和 Activity 的區別&#xff0c;并結合代碼示例和具…

【 C++核心知識點面試準備:從內存管理到STL與模板 】

一、動態內存管理&#xff1a;new/delete與底層原理 核心問題1&#xff1a;new/delete vs malloc/free 區別對比&#xff1a; 特性new/deletemalloc/free類型安全自動推導類型&#xff0c;無需轉型返回void*&#xff0c;需強制轉型生命周期自動調用構造/析構函數需手動初始化…

軟考高項(信息系統項目管理師)第 4 版全章節核心考點解析(第4版課程精華版)

一、核心輸入輸出速記體系&#xff08;力揚老師獨家口訣&#xff09; &#xff08;一&#xff09;規劃階段萬能輸入&#xff08;4 要素&#xff09; 口訣&#xff1a;章程計劃&#xff0c;組織事業 ? 精準對應&#xff08;ITTO 核心輸入&#xff09;&#xff1a; 章程&#…

ASP.NET CORE部署IIS的三種方式

ASP.NET Core 部署方式對比 本文檔對比了三種常見的 ASP.NET Core 應用&#xff08;如你的 DingTalkApproval 項目&#xff09;部署到 Windows 10 上 IIS 服務器的方式&#xff1a;dotnet publish&#xff08;手動部署&#xff09;、Web Deploy&#xff08;直接發布到 IIS&…

基于共享上下文和自主協作的 RD Agent 生態系統

在llmangentmcp這個框架中&#xff1a; LLM&#xff1a; 依然是智能體的“大腦”&#xff0c;賦予它們理解、推理、生成和規劃的能力&#xff0c;并且也用于處理和利用共享上下文。Agent&#xff1a; 具備特定 R&D 職能的自主單元&#xff0c;它們感知共享上下文&#xff0…

zephyr架構下Bluetooth advertising接口

目錄 概述 1 函數接口 2 主要函數介紹 2.1 bt_le_adv_start函數 2.1.1 函數功能介紹 2.1.2 典型使用示例 2.1.3 廣播間隔 2.1.4 注意事項 2.2 bt_le_adv_stop 函數 2.2.1 函數功能 2.2.2 使用方法介紹 2.2.3 實際應用示例 2.2.4 關鍵注意事項 2.2.5 常見問題解決 …

8、HTTPD服務--ab壓力測試

一、ab壓力測試 # ab ‐c 100 ‐n 1000 http://vedio.linux.com/index.html 2 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> 3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 4 Licensed to The Apache Software Foundation,…

E2E 測試

以下是關于端到端(E2E)測試的基本知識總結: 一、E2E 測試核心認知 1. 定義與價值定位 "模擬真實用戶在完整應用環境中的操作流程"核心價值: 驗證跨系統/模塊的集成功能檢測用戶流程中的關鍵路徑保障核心業務場景的可用性測試金字塔定位:單元測試(70%) → 集…

python之數字類型的操作

Python數據類型與操作符完全指南&#xff1a;詳解各類數據操作技巧 目錄 數字類型 字符串 列表 元組 字典 集合 布爾 通用操作符 注意事項 1. 數字類型&#xff08;int, float, complex&#xff09; 數字類型是Python中最基礎的數據類型&#xff0c;支持多種數學運算…

基于Spring Boot+Vue 網上書城管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

從拒絕采樣到強化學習,大語言模型推理極簡新路徑!

大語言模型&#xff08;LLMs&#xff09;的推理能力是當下研究熱點&#xff0c;強化學習在其復雜推理任務微調中廣泛應用。這篇論文深入剖析了相關算法&#xff0c;發現簡單的拒絕采樣基線方法表現驚人&#xff0c;還提出了新算法。快來一探究竟&#xff0c;看看這些發現如何顛…

測試——BUG篇

1. 軟件測試的生命周期 軟件測試貫穿于軟件的整個生命周期&#xff0c;針對這句話我們?起來看?下軟件測試是如何貫穿軟件的整個生命周期。 軟件測試的?命周期是指測試流程&#xff0c;這個流程是按照?定順序執?的?系列特定的步驟&#xff0c;去保證產品質量符合需求。在…