65.9K
CodeProject 正在变化。 阅读更多。
Home

带超链接功能的简单 CListCtrl

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (8投票s)

2008 年 3 月 2 日

CPOL

2分钟阅读

viewsIcon

53905

downloadIcon

1545

在 CListCtrl 中添加超链接的方法

引言

我之前写过一篇关于这个主题的文章。 然而,这篇文章不够详细。 该代码很复杂,因为它是在别人的代码基础上修改的,并且包含了很多无用的代码来实现这个功能。 所以我重写了这篇文章来描述实现的细节,并且我在这里提供简单的代码。

背景

当我在 Code Project 上搜索一种方法来做到这一点时,我注意到大多数代码都可以提供该功能,但并不完美。 当光标移动到网格的单元格上,而不是文字上时,超链接才会起作用。 所以我决定编写代码来提供光标的确切位置的功能,即当光标移动到单元格中的文字上时,超链接才会起作用,然后你点击鼠标,网站就会打开。

当光标位于超链接子项的单元格中,但不在文字上时,什么都不会发生。

1.jpg

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

2.jpg

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 日:文章发布
© . All rights reserved.