Syslink-Steuerung in MFC 9.0

 C Programming >> C-Programmierung >  >> Tags >> MFC
Syslink-Steuerung in MFC 9.0

Visual Studio 2008 (ehemals Codename „Orcas“) enthält mehrere wichtige Updates für VC++ und MFC. Darunter die Möglichkeit, Syslink-Steuerelemente, Befehls- oder Split-Schaltflächen und Netzwerkadressen-Steuerelemente zu erstellen. In diesem Beitrag zeige ich, wie Sie mit der Syslink-Steuerung arbeiten können. Das Steuerelement bietet eine Möglichkeit, Hypertext-Links in ein Fenster einzubetten. Es ist eigentlich ein Fenster, das markierten Text genauso wie Hyperlinks in einem Webbrowser darstellt. Mehrere Links können in ein einzelnes Steuerelement eingefügt werden, und der Zugriff erfolgt über einen nullbasierten Index.

Derzeit unterstützt es das Anchor-Tag () mit den Attributen HREF und ID. HREF wird verwendet, um eine URL eines beliebigen Protokolls (http, ftp, mailto usw.) anzugeben. Andererseits gibt ID einen eindeutigen Namen innerhalb des Steuerelements an, der einem einzelnen Link zugeordnet ist.

Der Inhalt ist in der Symbolleiste verfügbar, sodass Sie Syslink-Steuerelemente einfach per Drag-and-Drop auf Ihre Dialogvorlage ziehen können.

Sie können den Text, einschließlich des Anker-Tags, auf der Eigenschaftsseite angeben oder die SetWindowText-Funktion verwenden, um ihn zur Laufzeit festzulegen.

GetDlgItem(IDC_SYSLINK1)->SetWindowText(
   L"Visit my <a href=\"http://www.mariusbancila.ro\">web site</a>"
   L" and check my <a href=\"https://www.mariusbancila.ro/blog\">blog</a>.");

Sie müssen die NM_CLICK-Benachrichtigung verarbeiten, prüfen, auf welchen Link geklickt wurde, und die entsprechenden Maßnahmen ergreifen:

BEGIN_MESSAGE_MAP(CMFCDemoDlg, CDialog) 
	ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &CMFCDemoDlg::OnNMClickSyslink1) 
END_MESSAGE_MAP()   

void CMFCDemoDlg::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
	PNMLINK pNMLink = (PNMLINK) pNMHDR;   

	if (wcscmp(pNMLink->item.szUrl, WEB_SITE) == 0) 
	{ 
		ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL); 
	} 
	else if(wcscmp(pNMLink->item.szUrl, BLOG_LINK) == 0) 
	{ 
		ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL); 
	}   

	*pResult = 0; 
}

In MFC 9.0 (Version, die mit Visual Studio 2008 geliefert wird) Klasse CLinkCtrl ist ein Wrapper über der Windows-API für die Arbeit mit der Syslink-Steuerung.

Sie können eine Instanz von CLinkCtrl zuordnen mit einer Syslink-Steuerung durch den DDX-Mechanismus:

void CMFCDemoDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	DDX_Control(pDX, IDC_SYSLINK2, Link2); 
}

In meiner Demoanwendung, die Sie hier herunterladen können, habe ich einen zweiten Syslink mit einem ID-Attribut verwendet. Jedes Mal, wenn auf den Link geklickt wird, wird ein Zähler erhöht, der angezeigt wird. Dafür habe ich zuerst zwei Hilfsfunktionen erstellt, eine um einen Teil des Textes zu generieren und die zweite um den Text auf das Link Control zu setzen:

CString CMFCDemoDlg::GetClickText() const 
{ 
	CString str; 
	str.Format(L"clicked %d times", Clicks); 
	return str; 
}   

void CMFCDemoDlg::SetLink2Text() 
{ 
	Link2.SetWindowText(L"Link was <a id="\">" + GetClickText() + L"</a>"); 
}

Bei der Bearbeitung der NM_CLICK-Benachrichtigung habe ich das szID-Mitglied der Struktur LITEM überprüft und die entsprechende Maßnahme ergriffen:

void CMFCDemoDlg::OnNMClickSyslink2(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
	PNMLINK pNMLink = (PNMLINK) pNMHDR;   

	if (wcscmp(pNMLink->item.szID, L"clicked") == 0) 
	{ 
		Clicks++; 
		SetLink2Text(); 
	}   

	*pResult = 0; 
}

Das Ergebnis wird hier angezeigt:

Hoffentlich hilft Ihnen der von mir zusammengestellte Beispielcode bei der Arbeit mit CLinkCtrl und die Syslink-Steuerung in VS 2008.