【MFC】列表视图控件——List Control

2023-10-26

01、文章目录

02、List Control介绍

列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁、直观,在实际应用中能为用户带来方便。

列表视图控件是对列表框控件List Box的改进和延伸。列表视图控件的列表项一般有图标(Icon)和标签(Label)两部分。图标是对列表项的图形描述,标签是文字描述。当然列表项可以只包含图标也可以只包含标签,这个是可以自己规定的。

List Box后面再说了,我没时间写,先应付工作先,边学边写。

列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:

  • Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。
  • Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。
  • List列表风格:与小图标风格类似,图标和文字的对齐方式不同。
  • Report报表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种报表。(也是我目前需要的)

03、List Control的通知消息

MFC消息映射机制中的“各种Windows消息的消息处理函数”部分,就曾以列表视图控件为例简单讲了WM_NOTIFY通知消息及其消息映射入口和消息处理函数的形式。如果你忘记了可以跳转到那篇文章看一看,了解一下。

这里给出下面将要演示的列表视图控件实例中,通知码为NM_CLICK的通知消息的消息映射入口:
ON_NOTIFY(NM_CLICK, IDC_PROGRAM_LANG_LIST, &CExample29Dlg::OnNMClickProgramLangList)
还有消息处理函数自动生成时的形式:

void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)   
{   
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);   
    // TODO: Add your control notification handler code here   
    *pResult = 0;   
}  

我们看到,上面的代码中将NMHDR指针类型的pNMHDR强制转换为LPNMITEMACTIVATE类型的pNMItemActivate,那么我们就可以在函数中通过pNMHDR来访问NMHDR结构,也可以通过pNMItemActive指针变量来访问第一个元素为NMHDR结构体变量的扩充结构。

当然列表视图控件还有一些自己特有的通知消息,下面就介绍几个其中比较常用的。

LVN_ITEMCHANGING 和LVN_ITEMCHANGED:当列表视图的状态发生变化时,会发送这两个通知消息。例如,当用户选择了新的列表项时,程序就会收到这两个消息。
消息会附带一个指向NMLISTVIEW 结构的指针,消息处理函数可从该结构中获得状态信息。两个消息的不同之处在于,前者的消息处理函数如果返回TRUE,那么就阻止选择的改变,如果返回FALSE,则允许改变。

LVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMLVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。

LVN_BEGINLABELEDIT 和LVN_ENDLABELEDIT:分别在用户开始编辑和结束编辑标题时发送。消息会附带一个指向NMLVDISPINFO结构的指针。在前者的消息处理函数中,可以调用GetEditControl成员函数返回一个指向用于编辑标题的编辑框的指针,如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑。在后者的消息处理函数中,NMLVDISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText 为NULL,那么说明用户放弃了编辑,否则,程序应负责更新表项的标题,这可以由SetItem或SetItemText函数来完成。

在这里插入图片描述

04、List Control的相关结构体

下面我们来介绍一下与列表视图控件有关的一些结构体。

  • NMHDR结构体

C++代码:

typedef struct tagNMHDR {   
    HWND hwndFrom;     // 控件窗口的句柄   
     UINT_PTR idFrom;   // 控件ID   
    UINT code;         // 控件的通知消息码   
} NMHDR;  

此结构体在很多情况下都是其他扩充结构体的第一个元素,比如上面的NMITEMACTIVATE结构体:

C++代码:

ypedef struct tagNMITEMACTIVATE {   
    NMHDR hdr;   
    int iItem;   
    int iSubItem;   
    UINT uNewState;   
    UINT uOldState;   
    UINT uChanged;   
    POINT ptAction;   
    LPARAM lParam;   
    UINT uKeyFlags;   
} NMITEMACTIVATE, *LPNMITEMACTIVATE;  
  • LVITEM

该结构体包含了列表视图控件中列表项或列表子项的各种属性。

C++代码:

typedef struct _LVITEM {    
    UINT mask;           // 掩码位的组合(下面有对应掩码的元素都已在括号中标出掩码),表明哪些元素是有效的   
    int iItem;           // 列表项的索引   
    int iSubItem;        // 列表子项的索引   
    UINT state;          // 状态,下面会列出。(LVIF_STATE)   
    UINT stateMask;      // 状态掩码,用来说明要获取或设置哪些状态。下面会列出   
    LPTSTR pszText;      // 指向列表项或列表子项的标签字符串。(LVIF_TEXT)   
    int cchTextMax;      // pszText指向缓冲区的字符的个数,包括字符串结束符。(LVIF_TEXT)   
    int iImage;          // 图标的索引。(LVIF_IMAGE)   
    LPARAM lParam;       // 32位的附加数据。(LVIF_PARAM)   
#if (_WIN32_IE >= 0x0300)   
    int iIndent;   
#endif   
#if (_WIN32_WINNT >= 0x501)   
    int iGroupId;   
    UINT cColumns; // tile view columns   
    PUINT puColumns;   
#endif   
#if (_WIN32_WINNT >= 0x0600)   
    int* piColFmt;   
    int iGroup;   
#endif   
} LVITEM, *LPLVITEM;  

下面是state和stateMask的取值及含义:

状态 对应的状态掩码 含义
LVIS_CUT 同左 列表项或列表子项被选择用来进行剪切和粘贴操作
LVIS_DROPHILITED 同左 列表项或列表子项成为拖动操作的目标
LVIS_FOCUSED 同左 列表项或列表子项具有输入焦点
LVIS_SELECTED 同左 列表项或列表子项被选中
  • LVCOLUMN结构体

该结构体仅适用于Report报表式列表视图控件。在向列表控件中插入一列时需要用到此结构体。它包含了列表控件某列的各种属性。

C++代码:

typedef struct _LVCOLUMN {    
    UINT mask;              // 掩码位的组合(下面有对应掩码的元素都已在括号中标出掩码),表明哪些元素是有效的   
    int fmt;                    // 该列的表头和列表子项的标签正文显示格式,可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT。(LVCF_FMT)   
    int cx;                     // 以像素为单位的列的宽度。(LVCF_FMT)   
    LPTSTR pszText;    // 指向列表头标题正文的字符串。(LVCF_TEXT)   
    int cchTextMax;     // pszText指向缓冲区的字符的个数,包括字符串结束符。(LVCF_TEXT)   
    int iSubItem;          // 该列的索引。(LVCF_SUBITEM)   
#if (_WIN32_IE >= 0x0300)   
    int iImage;   
    int iOrder;   
#endif   
#if (_WIN32_WINNT >= 0x0600)   
    int cxMin;   
    int cxDefault;   
    int cxIdeal;   
#endif   
} LVCOLUMN, *LPLVCOLUMN;  

显然这正是我要用到的结构体。

  • NMLISTVIEW结构体

该结构体存放了列表视图控件通知消息的相关信息。列表视图控件的大部分通知消息都会附带指向该结构体的指针。

C++代码:

typedef struct tagNMLISTVIEW {   
    NMHDR hdr;       // 标准的NMHDR 结构   
     int iItem;       // 列表项的索引   
     int iSubItem;    // 列表子项的索引   
     UINT uNewState;  // 列表项或列表子项的新状态   
     UINT uOldState;  // 列表项或列表子项原来的状态   
     UINT uChanged;   // 取值与LVITEM的mask成员相同,用来表明哪些状态发生了变化   
     POINT ptAction;  // 事件发生时鼠标的客户区坐标   
     LPARAM lParam;   //32位的附加数据   
} NMLISTVIEW, *LPNMLISTVIEW;  

05、List Control的创建

MFC同样为列表视图控件的操作提供了CListCtrl类。

如果我们不想在对话框模板中直接拖入List Control来使用列表视图控件,而是希望动态创建它,则要用到CListCtrl类的成员函数Create函数,原型如下:(这里只做简单介绍,一般不用这种方式,除非原生控件)

virtual BOOL Create(
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID 
);

参数介绍:

  • rect:列表视图控件的位置和尺寸
  • pParentWnd:指向父窗口的指针
  • nID:指定列表视图控件的ID
  • dwStyle:用于设定列表视图控件的风格

每次说到原生创建方法,总是有dwStyle,很复杂,这里介绍一下,基本都是用标准的,很少有人用其他类型。
在这里插入图片描述
与前面的控件一样,除了以上风格一般我们还要为列表视图控件设置WS_CHILD和WS_VISIBLE风格。对于直接在对话框模板中创建的列表视图控件,其属性页中的属性与上述风格是对应的,例如,属性Alignment默认为Left,也就等价于指定了LVS_ALIGNLEFT风格。

06、CListCtrl类的主要成员函数

CListCtrl类有很多成员函数,这里就为大家介绍几个常用的主要成员函数。

  1. UINT GetSelectedCount( ) const;
    该函数返回列表视图控件中被选择列表项的数量。

  2. POSITION GetFirstSelectedItemPosition( ) const;
    获取列表视图控件中第一个被选择项的位置。返回的POSITION值可以用来迭代来获取其他选择项,可以当作参数传入下面的GetNextSelectedItem函数来获得选择项的索引。如果没有被选择项则返回NULL。

  3. int GetNextSelectedItem(POSITION& pos) const;
    该函数获取由pos指定的列表项的索引,然后将pos设置为下一个位置的POSITION值。参数pos为之前调用GetNextSelectedItem或GetFirstSelectedItemPosition得到的POSITION值的引用。返回值就是pos指定列表项的索引。

  4. int GetItemCount( ) const;
    获取列表视图控件中列表项的数量。

  5. int InsertColumn(int nCol,const LVCOLUMN* pColumn ); int InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT,int nWidth = -1,int nSubItem = -1 );
    这两个函数用于在报表式列表视图控件中插入列。第一个函数中,nCol参数为插入列的索引,pColumn参数指向LVCOLUMN结构,其中包含了插入列的属性。第二个函数中,nCol参数也是插入列的索引,lpszColumnHeading参数为列标题字符串,nFormat参数为列中文本的对齐方式,可以是LVCFMT_LEFT、LVCFMT_RIGHT或LVCFMT_CENTER,nWidth参数为列宽,nSubItem为插入列对应列表子项的索引。两个函数在成功时都返回新列的索引,失败都返回-1。

  6. BOOL DeleteColumn(int nCol);
    该函数用于删除列表视图控件中的某列。参数nCol为删除列的索引。删除成功则返回TRUE,失败返回FALSE。

  7. `int InsertItem(int nItem,LPCTSTR lpszItem);
    向列表视图控件中插入新的列表项。参数nItem为要插入项的索引,参数lpszItem为要插入项的标签字符串。如果插入成功则返回新列表项的索引,否则返回-1。

  8. BOOL DeleteItem(int nItem);
    从列表视图控件中删除某个列表项。参数nItem指定了要删除的列表项的索引。删除成功则返回TRUE,否则返回FALSE。

  9. CString GetItemText(int nItem,int nSubItem) const;
    获取指定列表项或列表子项的显示文本。参数nItem指定了列表项的索引,参数nSubItem指定了列表子项的索引。
    `

  10. BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText);
    设置指定列表项或列表子项的显示文本。参数nItem和nSubItem同GetItemText。参数lpszText为要设置的显示文本字符串。如果设置成功则返回TRUE,否则返回FALSE。

  11. DWORD_PTR GetItemData(int nItem) const;
    该函数用于获取指定列表项的附加32位数据。参数nItem为列表项的索引。返回值就是由nItem指定列表项的附加32位数据。

  12. BOOL SetItemData(int nItem,DWORD_PTR dwData);
    该函数用于为指定列表项设置附加32位是数据。参数nItem为列表项的索引,参数dwData为列表项的附加32位数据。

07、代码实例

这里实例直接用的网上的,看了下,明白怎么用了就开始干活了。

给大家写一个简单的实例,说明CListCtrl类的几个成员函数及通知消息等的使用方法。因为在开发中最常用的要属报表风格的List Control了,所以给大家写的是一个报表List Control的例子。

此实例实现的功能:在单选列表视图控件中显示一个简单的编程语言排行榜,然后在用鼠标左键选择某列表项时,将选中列表项的文本显示到编辑框中。下面是具体实现步骤:

  1. 创建一个基于对话框的MFC工程,名称设置为“Example29”。
  2. 在自动生成的对话框模板IDD_EXAMPLE29_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个List Control控件,ID设置为IDC_PROGRAM_LANG_LIST,View属性设为Report,即为报表风格,Single Selection属性设为True。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“选择的语言:”,编辑框的ID设为IDC_LANG_SEL_EDIT,Read Only属性设为True。此时的对话框模板如下图:在这里插入图片描述
  3. 为列表视图控件IDC_PROGRAM_LANG_LIST添加CListCtrl类型的控件变量m_programLangList。
  4. 在对话框初始化时,我们将编程语言排行榜加入到列表视图控件中,那么需要修改CExample29Dlg::OnInitDialog()函数为:

C++代码:

BOOL CExample29Dlg::OnInitDialog()   
{   
    CDialogEx::OnInitDialog();   
  
    // Add "About..." menu item to system menu.   
  
    // IDM_ABOUTBOX must be in the system command range.   
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
    ASSERT(IDM_ABOUTBOX < 0xF000);   
  
    CMenu* pSysMenu = GetSystemMenu(FALSE);   
    if (pSysMenu != NULL)   
    {   
        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);   
        }   
    }   
  
    // Set the icon for this dialog.  The framework does this automatically   
    //  when the application's main window is not a dialog   
    SetIcon(m_hIcon, TRUE);         // Set big icon   
    SetIcon(m_hIcon, FALSE);        // Set small icon   
  
    // TODO: Add extra initialization here   
    CRect rect;   
  
    // 获取编程语言列表视图控件的位置和大小   
    m_programLangList.GetClientRect(&rect);   
  
    // 为列表视图控件添加全行选中和栅格风格   
    m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);   
  
    // 为列表视图控件添加三列   
    m_programLangList.InsertColumn(0, _T("语言"), LVCFMT_CENTER, rect.Width()/3, 0);   
    m_programLangList.InsertColumn(1, _T("2012.02排名"), LVCFMT_CENTER, rect.Width()/3, 1);   
    m_programLangList.InsertColumn(2, _T("2011.02排名"), LVCFMT_CENTER, rect.Width()/3, 2);   
  
    // 在列表视图控件中插入列表项,并设置列表子项文本   
    m_programLangList.InsertItem(0, _T("Java"));   
    m_programLangList.SetItemText(0, 1, _T("1"));   
    m_programLangList.SetItemText(0, 2, _T("1"));   
    m_programLangList.InsertItem(1, _T("C"));   
    m_programLangList.SetItemText(1, 1, _T("2"));   
    m_programLangList.SetItemText(1, 2, _T("2"));   
    m_programLangList.InsertItem(2, _T("C#"));   
    m_programLangList.SetItemText(2, 1, _T("3"));   
    m_programLangList.SetItemText(2, 2, _T("6"));   
    m_programLangList.InsertItem(3, _T("C++"));   
    m_programLangList.SetItemText(3, 1, _T("4"));   
    m_programLangList.SetItemText(3, 2, _T("3"));   
  
    return TRUE;  // return TRUE  unless you set the focus to a control   
}  
  1. 我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么可以使用NM_CLICK通知消息。为列表框IDC_PROGRAM_LANG_LIST的通知消息NM_CLICK添加消息处理函数CExample29Dlg::OnNMClickProgramLangList,并修改如下:
void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)   
{   
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);   
    // TODO: Add your control notification handler code here   
    *pResult = 0;   
  
    CString strLangName;    // 选择语言的名称字符串   
    NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;   
  
    if (-1 != pNMListView->iItem)        // 如果iItem不是-1,就说明有列表项被选择   
    {   
        // 获取被选择列表项第一个子项的文本   
        strLangName = m_programLangList.GetItemText(pNMListView->iItem, 0);   
        // 将选择的语言显示与编辑框中   
        SetDlgItemText(IDC_LANG_SEL_EDIT, strLangName);   
    }   
}  
  1. 运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。效果图如下:
    在这里插入图片描述

关于列表视图控件List Control的内容总算讲完了,内容不少,但实际上这些还只是一部分,在实际开发中会遇到各种问题,需要大家去查阅MSDN或上网找资料等来解决。

08、总结

由于工作需要,临时就写了一篇,在网上找各种资源,总结了一下。如果不全面,请网上查漏补缺。
版权声明:转载请注明出处,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MFC】列表视图控件——List Control 的相关文章

  • 如何在Release模式下启用TRACE宏?

    The 跟踪宏 http msdn microsoft com en us library 4wyz8787 VS 80 aspx可用于在代码编译时向调试器输出诊断消息Debug模式 我在的时候需要同样的信息Release模式 有办法实现这
  • 我可以向现有 ATL COM 项目添加 MFC 支持吗

    我使用 ATL COM Object 创建了一个 Shell 扩展 但在创建过程中我没有添加MFC支持 我现在可以更改设置以添加 MFC 支持吗 是的 但我相信这样做不会自动添加所有必需的标头和 defines 当然 您可以先尝试此操作 然
  • 在不使用资源 DLL 的情况下向 MFC 项目添加第二种语言

    我有一个用 MFC 制作的带有德语菜单的非常小的应用程序 现在我也被要求制作一个英文版本 但目标是不使用其他语言 DLL 最后应该只有两个 exe 文件 德语和英语 您是否知道如何为英语对话添加第二个资源文件 如果需要 以及如何在我的 C
  • 如何将 INT64 写入 CString

    我正在 c windows 中编码 INT64 dirID 1 CString querySQLStr T querySQLStr Format L select from ImageInfo where FolderPath 64d di
  • 如何在单独的线程中创建带有进度条的MFC对话框?

    我的应用程序可能需要一段时间才能连接到数据库 此连接是通过单个库函数调用建立的 即我无法将进度更新放在那里并进行回调或类似的操作 我的想法是在连接到数据库之前在单独的线程中创建一个带有进度条的对话框 该对话框将不断更改进度状态CProgre
  • CCcomboBoxEx 图像和文本之间的间距

    有没有什么方法 一些系统指标值或其他任何东西可以给出 CComboBoxEx 控件上图标和图像之间的边距有多少像素 下图中红色标记表示的空间 None
  • 如何禁用 MFC 中的最大化按钮?

    如何禁用 SDI 应用程序中的最大化按钮 功能 为了完整性 int CMainFrame OnCreate LPCREATESTRUCT lpCreateStruct ModifyStyle WS MAXIMIZEBOX 0
  • MFC和ATL之间的根本区别是什么?

    假设我是only将它们用于 普通 GUI 程序 没有 COM 没有 ActiveX 没什么花哨的 我将看到 ATL 和 MFC 之间的根本区别是什么 以帮助我弄清楚使用哪一个 我在网上做了一些搜索 但最终没有一个答案真正回答了我的问题 ht
  • 在Windows服务中使用MFC?

    我开始开发 Windows 服务 我想使用我自己的一些类 它们对某些 MFC 类 如 CString CSocket CArchive CMemFile 和 CObject 几乎没有依赖性 MSDN http msdn microsoft
  • 如何正确捕获 Aero/DWM 上的特定窗口

    背景资料 我编写了这个 MFC 应用程序并使用了很长时间 当用户按下 Print Screen Alt Print Screen 键时 它几乎会自动将屏幕截图保存到硬盘 我一直推迟使用任何与 Aero 相关的东西 直到现在我已经使用 Win
  • 同时显示同一文档的多个视图

    如何说服 MFC 文档 视图体系结构让我同时显示同一文档的两个不同视图 例如 说我的CDocument子类代表某种描述的档案 我想要一个用户界面 其中该存档中的所有条目的名称都显示在CListView子类显示在左侧窗格中 而当前所选条目的详
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • 具有透明背景的CWnd

    我想创建一个基于 CWnd 的类 它将引入具有透明背景的控件 只要内容是静态的 创建一个控件并用透明背景绘制其内容对我来说没什么大不了的 问题是当我想创建一个内容不断变化的控件时 这是因为我不知道如何用父背景删除控件的内容 一般情况下可能不
  • 从不同操作系统检索到的故障转储指向消息循环。如何从那里到达故障位置? (TeamViewer 使我的进程崩溃。)

    我们软件的一位客户抱怨说 该软件在他的 Windows XP 计算机上崩溃了 我让他下载ProcDump https technet microsoft com en us sysinternals dd996900 aspx并按如下方式运
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • MFC:如何在一个函数中捕获对话框每个控件的设置焦点

    我有 n 个对话框 它们具有相同的基本对话框 每个对话框都有自己的控件 编辑框 组合框 列表控件 etc 在基本对话框中 如何设置每个控件的焦点消息 例如 给出一个消息框 text Hello I got focus my ID is d
  • 禁用/启用 MFC 功能包的功能区按钮

    我正在使用 MFC 功能包 并且功能区栏上有一些按钮 即 CMFCRibbonButton 的实例 问题是我想在某些条件下启用和禁用其中一些 但在运行时 我怎样才能做到这一点 因为没有具体的方法 我听说解决方案是在运行时附加 分离事件处理程
  • 如何通过单击 MainFrame 内的按钮来更改 MFC 视图

    我想通过单击窗口内的按钮来更改呈现的视图像这样 https i stack imgur com 3IA2o png 我的项目设置 我制作了一个没有文档 视图支持的 MFC 项目 SDI 我在设计器中又创建了两个视图并向它们添加了类 新的视图
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • MinGW支持MFC吗?

    我已经使用 MinGW 开发了 WinAPI 应用程序 没有出现任何问题 现在 我可以用 MFC 做同样的事情吗 我只是在这里猜测 但我认为您需要购买 Visual Studio 的副本才能获得使用 MFC 的许可证 MFC 也不因其对 C

随机推荐

  • 2023年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

    C C 编程 1 8级 全部真题 点这里 第1题 字符长方形 给定一个字符 用它构造一个长为4个字符 宽为3个字符的长方形 可以参考样例输出 时间限制 1000 内存限制 65536 输入 输入只有一行 包含一个字符 输出 该字符构成的长方
  • 轻松记住大端小端的含义(附对大端和小端的解释)

    或许你曾经仔细了解过什么是大端小端 也动手编写了测试手头上的机器上是大端还是小端的程序 甚至还编写了大端小端转换程序 但过了一段时间之后 当你再看到大端和小端这两个字眼 你的脑中很快浮起了自己曾经做过的工作 却总是想不起究竟哪种是大端 哪种
  • Navicat连接不上sqlserver问题解决(2008R2)

    Navicat连接不上sqlserver问题解决 一 连接SQL Server时出错 未发现数据源名称并且未指定默认驱动程序 1 安装支持文件 因为没有安装连接支持文件 本身navicat其实是支持SQL server的连接的 只不过是因为
  • 目标分割、目标识别、目标检测和目标跟踪的区别

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 https www cbedai net linuxcore 1 目标分割 任务是把目标对应的部分分割出来 2 目标检测 检测到图片当中的目标的具体位置 3 目标识别 即是在所有的
  • 选择排序(Selection Sort)-- 初级排序算法

    1 选择排序 Selection Sort 选择排序 Selection sort 是一种简单直观的排序算法 它的工作原理 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然
  • i春秋CTF-WEB题解(一)

    简述 这次转到了i春秋平台上面练习 和之前一样也是每3道题目就写一篇题解来作为记录 一 爆破 1 百度杯CTF比赛 2017 二月场 题目给的提示是 flag就在某六位变量中 打开题目的链接 能得到一段PHP代码 大致代码解析如下 引入包含
  • C#中Thread.Time的使用

    Thread Time的使用 线程同步处理之一 这个类主要是开启一个线程 然后实现按照指定的周期 定期的调用指定的某个函数 实现了定期调用一个函数或程序的办法 比如想让一个后台程序 定期检查是否收到邮件 或者让一个后台线程定期输出当前时间等
  • 一文讲解单片机、 ARM、 MCU、 DSP、 FPGA、 嵌入式错综复杂的关系

    概述 一文讲解单片机 ARM MCU DSP FPGA 嵌入式错综复杂的关系 首先 嵌入式 这是个概念 准确的定义没有 各个书上都有各自的定义 但是主要思想是一样的 就是相比较PC机这种通用系统来说 嵌入式系统是个专用系统 结构精简 在硬件
  • ESP8266_12 ESP8266客户端模式下的TCP通信

    ESP8266 01搭建开发环境 ESP8266 02程序的编译与下载 ESP8266 03SDK与Makefile的基本用法 ESP8266 04管脚控制与软件定时器 ESP8266 05 ESP8266有几个串口 ESP8266 06硬
  • java 回调函数解读

    模块间调用 在一个应用系统中 无论使用何种语言开发 必然存在模块之间的调用 调用的方式分为几种 1 同步调用 同步调用是最基本并且最简单的一种调用方式 类A的方法a 调用类B的方法b 一直等待b 方法执行完毕 a 方法继续往下走 这种调用方
  • LaTex学习笔记(文档基本结构、编译与特殊符号)

    1 文章开始 文章第一句通常为 documentclass article book report letter等 documentclass x 作为文章排版的依据 x代表排版方式 基本的排版方式有 article 用于文章排版 book
  • epoll与select区别

    select和epoll的区别 面试常考 首先select是posix支持的 而epoll是linux特定的系统调用 因此 epoll的可移植性就没有select好 但是考虑到epoll和select一般用作服务器的比较多 而服务器中大多又
  • BP神经网络参数总结

    BP神经网络参数总结 BP神经网络是一种常用的人工神经网络模型 广泛应用于分类 回归和模式识别等任务中 在进行BP神经网络训练之前 需要对网络的参数进行设置和调整 以获得更好的性能和准确度 下面将对BP神经网络的参数进行总结 并给出相应的源
  • 【线程】详解线程状态(到底是五种还是六种)

    首先我们要知道 在传统 操作系统 的线程模型中线程被分为五种状态 在java线程中 线程被分为六种状态 传统线程模型 操作系统 中线程状态 线程的五种状态 1 新建 new 创建了一个新的线程对象 2 就绪 runnable 调用线程的st
  • python 置信区间_关于置信区间的完整指南和Python示例

    python 置信区间 Confidence Interval CI is essential in statistics and very important for data scientists In this article I w
  • Python Flask 搭建微信小程序后台详解

    前言 近期需要开发一个打分的微信小程序 涉及到与后台服务器的数据交互 因为业务逻辑相对简单 故选择Python的轻量化web框架Flask来搭建后台程序 因为是初次接触小程序 经过一番摸索和尝试 个人觉得的微信小程序与后台的交互有点像aja
  • 矩阵乘法测试

    对于时间的函数 gettimeofday 函数使用方法 http blog csdn net hurmishine article details 60326345 矩阵乘法测试 代码 1 为了试验简单 两个测试矩阵均为n n 当然结果也为
  • C++中的各种进制转换函数汇总

    1 在C中 按指定进制格式输出如下 include
  • shell脚本——shell函数详解

    shell脚本 shell函数详解 一 shell函数 1 shell函数的概念 2 shell函数的格式 1 函数的定义 2 调用函数的方法 3 函数返回值 4 函数传参 5 函数变量的作用范围 6 递归 函数调用自己本身的函数 1 阶乘
  • 【MFC】列表视图控件——List Control

    01 文章目录 文章目录 01 文章目录 02 List Control介绍 03 List Control的通知消息 04 List Control的相关结构体 05 List Control的创建 06 CListCtrl类的主要成员函