Windows XP Tablet Ed.嵌入式Visual C++ 7.1Visual C++ 8.0Windows VistaVisual C++ 7.0C++/CLIWindows 2003Windows 2000设计 / 图形Visual C++ 6.0Windows XPMFCC中级开发WindowsC++
带超链接功能的简单 CListCtrl
在 CListCtrl 中添加超链接的方法
引言
我之前写过一篇关于这个主题的文章。 然而,这篇文章不够详细。 该代码很复杂,因为它是在别人的代码基础上修改的,并且包含了很多无用的代码来实现这个功能。 所以我重写了这篇文章来描述实现的细节,并且我在这里提供简单的代码。
背景
当我在 Code Project 上搜索一种方法来做到这一点时,我注意到大多数代码都可以提供该功能,但并不完美。 当光标移动到网格的单元格上,而不是文字上时,超链接才会起作用。 所以我决定编写代码来提供光标的确切位置的功能,即当光标移动到单元格中的文字上时,超链接才会起作用,然后你点击鼠标,网站就会打开。
当光标位于超链接子项的单元格中,但不在文字上时,什么都不会发生。

当光标移动到超链接上时,工具提示才会起作用。 点击它,网站就会打开。

Using the Code
具有超链接的单元格数据的基本 struct
是 stURLTAG
typedef struct {
BOOL IsHoverOn;
CString strURL;
CString strTooltip;
} stURLTAG;
这里的基类名为 CLinkListCtrl
,它继承自 CListCtrl
。
CLinkListCtrl
有一个 stl::map
成员 (map<int
, stURLTAG*> m_mapURL
) 用于记录其中的 URL 单元格。 map 的键是整数类型,其中包含单元格的项目和子项目的信息,计算如下: item*100 + subitem
。 然后 stl::map
可以通过键提供良好的检索功能。
下面是 LinkListCtrl.h
#pragma once
#include <map>
using namespace std;
// CLinkListCtrl
typedef struct {
BOOL IsHoverOn;
CString strURL;
CString strTooltip;
} stURLTAG;
class CLinkListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CLinkListCtrl)
public:
CLinkListCtrl();
virtual ~CLinkListCtrl();
protected:
DECLARE_MESSAGE_MAP()
public:
BOOL SetItemURL(int nItem, int nSubItem, CString strURL, CString strTooltip);
void ClearItemURL(int nItem, int nSubItem);
protected:
CRect GetTextRect(int nItem, int nSubItem);
BOOL PtInText(CPoint pt, int nItem, int nSubItem);
BOOL IsURL(int nItem, int nSubItem);
void RedrawSubItem(int nItem, int nSubItem, BOOL IsHoverOn);
private:
map<int, stURLTAG*> m_mapURL;
CFont m_ftUnderline;
CFont m_ftURL;
CToolTipCtrl m_toolTip;
protected:
virtual void PreSubclassWindow();
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
CLinkListCtrl
的用法如下所示
m_list.InsertColumn(0, "NO", LVCFMT_LEFT, 50);
m_list.InsertColumn(1, "Name", LVCFMT_LEFT, 100);
m_list.InsertColumn(2, "Enter IN", LVCFMT_LEFT, 80);
m_list.SetExtendedStyle
(m_list.GetExtendedStyle()|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
m_list.InsertItem( 0 , _T(""));
m_list.SetItemText(0, 0, "1");
m_list.SetItemText(0, 1, "bd");
m_list.SetItemText(0, 2, "baidu");
m_list.SetItemURL(0, 2, "www.baidu.com", "search website - baidu");
m_list.InsertItem(1, _T(""));
m_list.SetItemText(1, 0, "2");
m_list.SetItemText(1, 1, "gg");
m_list.SetItemText(1, 2, "google");
m_list.SetItemURL(1, 2, "www.google.com", "search website - google");
享受代码吧!
如果代码有问题,您可以通过 iamliuxiao@qq.com 与我联系
历史
- 2008 年 3 月 2 日:文章发布