Оказалось нужным открытие браузера с нужным адресом при нажатии на тексте. Все довольно простенько.
Файл ресурсов:
#include <windows.h> #define IDD_DIALOG1 1000 #define IDC_LINK_GOOGLE 1100 LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT IDD_DIALOG1 DIALOGEX 0, 0, 186, 27 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Dialog" FONT 8, "Ms Shell Dlg 2", 400, 0, 1 { DEFPUSHBUTTON "Quit", IDOK, 129, 7, 45, 14 LTEXT "Click for google", IDC_LINK_GOOGLE, 25, 9, 53, 8, SS_LEFT | SS_NOTIFY }
Сырец:
#include <windows.h> #define IDD_DIALOG1 1000 #define IDC_LINK_GOOGLE 1100 // Main window callback function LRESULT CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam) { switch (msg) { case WM_CLOSE: // close dialog box EndDialog(hwnd, 0); return 1L; case WM_COMMAND: switch (LOWORD(wparam)) { case IDOK: EndDialog(hwnd, 0); return 1L; case IDC_LINK_GOOGLE: ShellExecute(hwnd,"open","http://google.ru",0,0,0); return 1L; } } return 0L; } // winmain entry point int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR line,int CmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),HWND_DESKTOP, reinterpret_cast(DlgProc)); }
компилим:
rc res.rc cl -c hyperlink.cpp link hyperlink.obj res.res user32.lib shell32.lib
Главный момент в этом сырце выделен красным цветом. Обязательно надо поставить флаг SS_NOTIFY, иначе элемент управления не будет сообщать нашей функции о клике на нем.
Все бы хорошо, но при наведении мышкой на этот самый элемент управления ничего не происходит. Как все уже привыкли, если элемент что-то должен делать, его надо подсветить / выделить / изменить над ним иконку курсора мыши и т.д.
Итак, узнаем, что за данный финт ушами у нас отвечает сообщение WM_SETCURSOR и добавляем в обработчик наш код:
... case WM_SETCURSOR: // сравниваем ID элемента с нашим if (GetDlgCtrlID((HWND)wparam) == IDC_LINK_GOOGLE) { // если это наш STATIC, то устанавливаем курсор в виде руки SetCursor(LoadCursor(NULL,IDC_HAND)); return 1L; } break; ...
Компилим, запускаем и, как результат, получаем полное зеро, никаких отличий. Сиё действие замечательно работает в обычном окне, созданном при помощи CreateWindow(Ex), а вот в диалоге почему-то не прокатывает.
MSDN нам всем поможет :) Внимательно читаем про DialogProc Callback Function. Оказывается,
If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.
Вооружившись «новым» знанием добавляем строчечку:
... case WM_SETCURSOR: // сравниваем ID элемента с нашим if (GetDlgCtrlID((HWND)wparam) == IDC_LINK_GOOGLE) { // если это наш STATIC, то устанавливаем курсор в виде руки SetCursor(LoadCursor(NULL,IDC_HAND)); SetWindowLong(hwnd, DWL_MSGRESULT, TRUE); return 1L; } break; ...
Теперь при наведении курсора мыши на наш STATIC (да и любой другой элемент), мы можем установить любой выбранный нами курсор. Вот такая вот сказочка про гиперссылки.