Controllo Syslink in MFC 9.0

 C Programming >> Programmazione C >  >> Tags >> MFC
Controllo Syslink in MFC 9.0

Visual Studio 2008 (precedentemente con nome in codice "Orcas") ha diversi aggiornamenti importanti per VC++ e MFC. Tra questi la possibilità di creare controlli syslink, pulsanti di comando o split e controlli dell'indirizzo di rete. In questo post mostrerò come puoi lavorare con il controllo syslink. Il controllo fornisce un modo per incorporare collegamenti ipertestuali in una finestra. In realtà è una finestra che esegue il rendering del testo contrassegnato proprio come i collegamenti ipertestuali in un browser web. È possibile inserire più collegamenti in un unico controllo e vi si accede tramite un indice in base zero.

Attualmente supporta il tag di ancoraggio () con gli attributi HREF e ID. HREF viene utilizzato per specificare un URL di qualsiasi protocollo (http, ftp, mailto, ecc.). D'altra parte ID specifica un nome univoco all'interno del controllo, associato a un singolo collegamento.

Il contenuto è disponibile nella barra degli strumenti, quindi puoi semplicemente trascinare e rilasciare i controlli del collegamento di sistema sul tuo modello di finestra di dialogo.

Puoi specificare il testo, incluso il tag di ancoraggio dalla pagina delle proprietà, oppure puoi utilizzare la funzione SetWindowText per impostarlo in fase di esecuzione.

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>.");

Devi gestire la notifica NM_CLICK, controllare quale link è stato cliccato e intraprendere l'azione appropriata:

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 (versione fornita con Visual Studio 2008) classe CLinkCtrl è un wrapper dell'API di Windows per lavorare con il controllo syslink.

Puoi associare un'istanza di CLinkCtrl con un controllo syslink tramite il meccanismo DDX:

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

Nella mia applicazione demo che puoi scaricare da qui ho usato un secondo syslink con un attributo ID. Ogni volta che si fa clic sul collegamento, viene incrementato un contatore, che viene visualizzato. Per questo ho creato prima due funzioni di supporto, una per generare parte del testo e la seconda per impostare il testo sul controllo del collegamento:

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>"); 
}

Durante la gestione della notifica NM_CLICK, ho controllato il membro szID della struttura LITEM e ho intrapreso l'azione appropriata:

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

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

	*pResult = 0; 
}

Il risultato è mostrato qui:

Si spera che il codice di esempio che ho messo insieme ti aiuti a lavorare con CLinkCtrl e il controllo del collegamento di sistema in VS 2008.