免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
本次游戲沒法給
內容參考于:微塵網絡安全
上一個內容: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);}}
?