mfc想要列表框的内容居中显示的代码应该怎么写,写在哪里
时间: 2024-02-21 08:02:01 浏览: 98
要让 MFC 列表框的内容居中显示,您可以在列表框的 OnDrawItem 函数中绘制每个项时,使用 CDC::DT_CENTER 标记来实现居中显示。
具体来说,您需要在您的列表框类中添加一个 OnDrawItem 函数,然后在该函数中使用 CDC::DrawText 函数来绘制每个项。在 DrawText 函数的格式参数中,您需要包含 DT_CENTER 标记,以将文本内容居中显示。
以下是一个示例代码,演示了如何在 MFC 列表框中居中显示文本内容:
```
void CMyListBox::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString strText;
GetLBText(lpDrawItemStruct->itemID, strText); // 获取列表框项的文本内容
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); // 获取设备上下文
CRect rect(lpDrawItemStruct->rcItem); // 获取列表框项的绘制区域
rect.DeflateRect(2, 2); // 缩小绘制区域
pDC->DrawText(strText, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER); // 绘制文本内容并居中显示
}
```
您需要将上述代码添加到您的列表框类中,并确保正确地处理列表框项的绘制消息。
相关问题
如何在MFC的CMFCToolBar中集成COMBOBOX组合框并设置其属性和事件?请提供详细的代码示例和步骤。
在MFC应用程序的用户界面设计中,集成COMBOBOX到CMFCToolBar以提供下拉列表功能是一个常见需求。为了实现这一功能,推荐参阅《MFC工具栏添加COMBOBOX组合框教程》,该资料将指导你完成从声明到事件处理的整个过程。
参考资源链接:[MFC工具栏添加COMBOBOX组合框教程](https://wenku.csdn.net/doc/6v7xgi59sc?spm=1055.2569.3001.10343)
首先,你需在主框架类的头文件中声明一个`CMFCToolBarComboBoxButton`类型的成员变量。接着,在主框架类的`OnCreate`函数中,创建工具栏并通过资源ID加载它。然后,使用`InsertButton`方法将COMBOBOX控件插入到工具栏的指定位置。
插入COMBOBOX后,你可以通过调用`EnableWindow`启用窗口,使用`SetCenterVert`方法进行垂直居中,以及`SetDropDownHeight`设置下拉列表的高度。至此,COMBOBOX的基本属性设置完成。
为了给COMBOBOX添加内容,你需要获取控件指针,并使用`AddItem`方法添加具体的选项。此外,为了响应用户的选择改变,你需要在类中重载相应的消息处理函数,如`ON_COMMAND`或`ON_UPDATE_COMMAND_UI`。
整个过程涉及的代码和具体步骤包括:声明变量、创建工具栏、插入组合框按钮、设置组合框属性、添加内容以及绑定资源ID。通过这些步骤,你可以在MFC的CMFCToolBar中集成具有功能完备的COMBOBOX控件。了解了这些基础知识后,你可能需要更深入地了解COMBOBOX的高级应用和更复杂的UI设计,此时可以继续参考《MFC工具栏添加COMBOBOX组合框教程》来扩展你的技能。
参考资源链接:[MFC工具栏添加COMBOBOX组合框教程](https://wenku.csdn.net/doc/6v7xgi59sc?spm=1055.2569.3001.10343)
MFC,有一个主对话框Commodity_testDlg,和两个子对话框,分别为InputInfoDialog,ShowGoods 主对话框中有一个tree控件,存在如下节点: 录入商品库存信息 显示已录入商品库存信息 通过点击tree中的某一个节点,显示子对话框 要求使用clist以及迭代器相关知识 在子对话框InputIndoDialog中对四个编辑框IDC_ID、IDC_NAME、IDC_COUNT、IDCPRICE, 输入以下数据 商品ID 商品名称 商品数量 商品价格 同时需要对插入的数据,进行判断,不可以输入非法数据 同时存在一个插入的按钮,插入成功,提示“插入成功”,否则提示“插入失败” 然后可以在ShowGoods中用list control显示出来,ShowGoods当中只存在list control这一个控件 请给出一个完整的实例代码,以及代码注释,不可删减
以下是一个完整的实例代码,包括注释:
```
// Commodity_testDlg.h : 头文件
//
#pragma once
#include "InputInfoDialog.h"
#include "ShowGoods.h"
// CCommoditytestDlg 对话框
class CCommoditytestDlg : public CDialogEx
{
// 构造
public:
CCommoditytestDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_COMMODITY_TEST_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
CTreeCtrl m_TreeCtrl; // 树形控件变量
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
// 新增的函数
void InitTreeCtrl(); // 初始化树形控件
void OnNodeSelected(HTREEITEM hItem); // 树形控件节点被选中的处理函数
void InsertDataToList(CString strID, CString strName, CString strCount, CString strPrice); // 将数据插入到列表控件中
void ClearListData(); // 清空列表控件数据
// 声明子对话框变量
CInputInfoDialog m_InputInfoDlg;
CShowGoods m_ShowGoodsDlg;
public:
afx_msg void OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult);
};
```
```
// Commodity_testDlg.cpp : 实现文件
//
#include "pch.h"
#include "framework.h"
#include "Commodity_test.h"
#include "Commodity_testDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCommoditytestDlg 对话框
CCommoditytestDlg::CCommoditytestDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_COMMODITY_TEST_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCommoditytestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE, m_TreeCtrl);
}
BEGIN_MESSAGE_MAP(CCommoditytestDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, &CCommoditytestDlg::OnTvnSelchangedTree)
END_MESSAGE_MAP()
// CCommoditytestDlg 消息处理程序
BOOL CCommoditytestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将大括号拆分成两行,以便阅读
{
// 将图标设置为对话框的图标
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// 初始化树形控件
InitTreeCtrl();
}
// 将大括号拆分成两行,以便阅读
{
// 将子对话框居中
CRect rc;
GetClientRect(rc);
rc.DeflateRect(10, 60, 10, 10);
m_InputInfoDlg.MoveWindow(rc);
// 显示主对话框
ShowWindow(SW_SHOW);
// 显示子对话框
m_InputInfoDlg.ShowWindow(SW_SHOW);
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CCommoditytestDlg::InitTreeCtrl()
{
// 获取根节点
HTREEITEM hRoot = m_TreeCtrl.InsertItem(_T("商品管理"));
// 添加子节点
HTREEITEM hItem = m_TreeCtrl.InsertItem(_T("录入商品库存信息"), hRoot);
m_TreeCtrl.InsertItem(_T("子节点1"), hItem);
m_TreeCtrl.InsertItem(_T("子节点2"), hItem);
hItem = m_TreeCtrl.InsertItem(_T("显示已录入商品库存信息"), hRoot);
m_TreeCtrl.InsertItem(_T("子节点3"), hItem);
m_TreeCtrl.InsertItem(_T("子节点4"), hItem);
// 展开根节点
m_TreeCtrl.Expand(hRoot, TVE_EXPAND);
}
void CCommoditytestDlg::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 CCommoditytestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CCommoditytestDlg::OnNodeSelected(HTREEITEM hItem)
{
// 获取节点的文本
CString strText = m_TreeCtrl.GetItemText(hItem);
// 根据节点的文本选择对应的子对话框
if (strText == _T("录入商品库存信息"))
{
m_InputInfoDlg.ShowWindow(SW_SHOW);
m_ShowGoodsDlg.ShowWindow(SW_HIDE);
}
else if (strText == _T("显示已录入商品库存信息"))
{
m_InputInfoDlg.ShowWindow(SW_HIDE);
m_ShowGoodsDlg.ShowWindow(SW_SHOW);
// 清空列表控件数据
ClearListData();
}
}
void CCommoditytestDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// 获取选中的节点
HTREEITEM hItem = m_TreeCtrl.GetSelectedItem();
// 处理选中的节点
OnNodeSelected(hItem);
*pResult = 0;
}
void CCommoditytestDlg::InsertDataToList(CString strID, CString strName, CString strCount, CString strPrice)
{
// 获取列表控件
CListCtrl* pListCtrl = m_ShowGoodsDlg.GetListCtrl();
// 添加行
int nItem = pListCtrl->GetItemCount();
pListCtrl->InsertItem(nItem, strID);
// 添加列
pListCtrl->SetItemText(nItem, 1, strName);
pListCtrl->SetItemText(nItem, 2, strCount);
pListCtrl->SetItemText(nItem, 3, strPrice);
}
void CCommoditytestDlg::ClearListData()
{
// 获取列表控件
CListCtrl* pListCtrl = m_ShowGoodsDlg.GetListCtrl();
// 清空所有行
pListCtrl->DeleteAllItems();
}
```
```
// InputInfoDialog.h : 头文件
//
#pragma once
// CInputInfoDialog 对话框
class CInputInfoDialog : public CDialogEx
{
DECLARE_DYNAMIC(CInputInfoDialog)
public:
CInputInfoDialog(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CInputInfoDialog();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_INPUT_INFO_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
private:
CString m_strID;
CString m_strName;
CString m_strCount;
CString m_strPrice;
};
```
```
// InputInfoDialog.cpp : 实现文件
//
#include "pch.h"
#include "Commodity_test.h"
#include "InputInfoDialog.h"
#include "afxdialogex.h"
// CInputInfoDialog 对话框
IMPLEMENT_DYNAMIC(CInputInfoDialog, CDialogEx)
CInputInfoDialog::CInputInfoDialog(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_INPUT_INFO_DIALOG, pParent)
{
}
CInputInfoDialog::~CInputInfoDialog()
{
}
void CInputInfoDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_ID, m_strID);
DDX_Text(pDX, IDC_NAME, m_strName);
DDX_Text(pDX, IDC_COUNT, m_strCount);
DDX_Text(pDX, IDC_PRICE, m_strPrice);
}
BEGIN_MESSAGE_MAP(CInputInfoDialog, CDialogEx)
ON_BN_CLICKED(IDOK, &CInputInfoDialog::OnBnClickedOk)
END_MESSAGE_MAP()
// CInputInfoDialog 消息处理程序
void CInputInfoDialog::OnBnClickedOk()
{
// 获取编辑框的值
UpdateData(TRUE);
// 进行数据校验
// ...
// 将数据插入到列表控件中
((CCommoditytestDlg*)GetParent())->InsertDataToList(m_strID, m_strName, m_strCount, m_strPrice);
// 插入成功,提示“插入成功”,否则提示“插入失败”
// ...
CDialogEx::OnOK();
}
```
```
// ShowGoods.h : 头文件
//
#pragma once
// CShowGoods 对话框
class CShowGoods : public CDialogEx
{
DECLARE_DYNAMIC(CShowGoods)
public:
CShowGoods(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CShowGoods();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SHOW_GOODS };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_ListCtrl;
virtual BOOL OnInitDialog();
};
```
```
// ShowGoods.cpp : 实现文件
//
#include "pch.h"
#include "Commodity_test.h"
#include "ShowGoods.h"
#include "afxdialogex.h"
// CShowGoods 对话框
IMPLEMENT_DYNAMIC(CShowGoods, CDialogEx)
CShowGoods::CShowGoods(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_SHOW_GOODS, pParent)
{
}
CShowGoods::~CShowGoods()
{
}
void CShowGoods::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_ListCtrl);
}
BEGIN_MESSAGE_MAP(CShowGoods, CDialogEx)
END_MESSAGE_MAP()
// CShowGoods 消息处理程序
BOOL CShowGoods::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置列表控件的样式和列标题
m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_ListCtrl.InsertColumn(0, _T("商品ID"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(1, _T("商品名称"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(2, _T("商品数量"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(3, _T("商品价格"), LVCFMT_LEFT, 100);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
```
阅读全文