====== Création d'un lien dans une boîte de dialogue ======
Cet extrait de code est originaire de l'ancien site WinAPI www.winapi.net
Pour créer un lien dans une boîte de dialogue, vous devez ajouter un //Texte// à votre boîte de dialogue, qui seras utilisé en tant que lien. Attribuer le style //Notification// à ce contrôle de texte.
{{:url1.png?300}}
Nous utilisons le nom //IDC_URL// pour ce contrôle.
Maintenant, nous ajoutons le code suivant à votre procédure de dialogue. Après avoir cliqué sur le texte,vous allez être redirigé vers le site Web avec votre navigateur standard.
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_URL:
if(HIWORD(wParam) == STN_CLICKED)
{
ShellExecute(hWnd, NULL, TEXT("http://www.pellesc.de/"),
NULL, NULL, SW_SHOW);
}
return(TRUE);
}
Pour obtenir votre lien souligné, ajoutez le code suivant:
case WM_INITDIALOG:
{
LOGFONT lf;
if(NULL == (hFont = (HFONT)SendDlgItemMessage(hWnd, IDC_URL, WM_GETFONT, 0, 0)))
hFont = (HFONT)GetStockObject(SYSTEM_FONT);
GetObject((HGDIOBJ)hFont, sizeof(lf), &lf);
lf.lfUnderline = TRUE;
hFont = CreateFontIndirect(&lf);
SendDlgItemMessage(hWnd, IDC_URL, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
}
return(TRUE);
case WM_NCDESTROY:
if(hFont)
{
DeleteObject((HGDIOBJ)hFont);
}
break;
N'oubliez pas d'ajouter un ''HFONT HFont'' à votre procédure de dialogue!
Pour modifier le curseur, vous devez créer d'abord une variable global:
WNDPROC g_wndpStatic;
Ajoutez le code suivant à votre procédure de dialogue:
g_wndpStatic = (WNDPROC)SetWindowLongPtr(GetDlgItem(hWnd, IDC_URL),
GWLP_WNDPROC, (LONG_PTR)UrlProc);
Maintenant nous n'avons besoin que de la sous classe de procédure pour réagir au message **WM_SETCURSOR ** :
LRESULT CALLBACK UrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_SETCURSOR:
SetCursor(LoadCursor(NULL, IDC_HAND));
return(TRUE);
default:
break;
}
return(CallWindowProc(g_wndpStatic, hWnd, uMsg, wParam, lParam));
}
La plupart du temps, les liens URL dans une boîte de dialogue sont de couleur bleue, pour modifier cette couleur:
case WM_CTLCOLORSTATIC:
if(GetDlgItem(hWnd, IDC_URL) == (HWND)lParam)
{
SetTextColor((HDC)wParam, GetSysColor(COLOR_HIGHLIGHT));
SetBkMode((HDC)wParam, TRANSPARENT);
return((BOOL)GetStockObject(NULL_BRUSH));
}
break;
C'est tout. Maintenant vous avez un lien dans votre boîte de dialogue comme celui-ci:
{{:url2.png}}
====== Compléter le code source ======
LRESULT CALLBACK UrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_SETCURSOR:
SetCursor(LoadCursor(NULL, IDC_HAND));
return(TRUE);
default:
break;
}
return(CallWindowProc(g_wndpStatic, hWnd, uMsg, wParam, lParam));
}
LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HFONT hFont;
switch (uMsg)
{
case WM_INITDIALOG:
{
LOGFONT lf;
if(NULL == (hFont = (HFONT)SendDlgItemMessage(hDlg, IDC_URL, WM_GETFONT, 0, 0)))
hFont = (HFONT)GetStockObject(SYSTEM_FONT);
GetObject((HGDIOBJ)hFont, sizeof(lf), &lf);
lf.lfUnderline = TRUE;
hFont = CreateFontIndirect(&lf);
SendDlgItemMessage(hDlg, IDC_URL, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
if(NULL == (hFont = (HFONT)SendDlgItemMessage(hDlg, IDC_APPNAME, WM_GETFONT, 0, 0)))
hFont = (HFONT)GetStockObject(SYSTEM_FONT);
GetObject((HGDIOBJ)hFont, sizeof(lf), &lf);
lf.lfHeight = 16;
lf.lfWeight = FW_BOLD;
hFont = CreateFontIndirect(&lf);
SendDlgItemMessage(hDlg, IDC_APPNAME, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
g_wndpStatic = (WNDPROC)SetWindowLongPtr(GetDlgItem(hDlg, IDC_URL),
GWLP_WNDPROC, (LONG_PTR)UrlProc);
}
return TRUE;
case WM_COMMAND:
switch (wParam)
{
case IDC_URL:
if(HIWORD(wParam) == STN_CLICKED)
{
ShellExecute(hDlg, NULL, TEXT("http://www.pellesc.de/"),
NULL, NULL, SW_SHOW);
}
return(TRUE);
case IDOK:
EndDialog(hDlg, TRUE);
return TRUE;
}
break;
case WM_CTLCOLORSTATIC:
if(GetDlgItem(hDlg, IDC_URL) == (HWND)lParam)
{
SetTextColor((HDC)wParam, GetSysColor(COLOR_HOTLIGHT));
SetBkMode((HDC)wParam, TRANSPARENT);
return((BOOL)GetStockObject(NULL_BRUSH));
}
break;
case WM_NCDESTROY:
if(hFont)
{
DeleteObject((HGDIOBJ)hFont);
}
break;
}
return FALSE;
}