WinAPI — C++ — добавить гиперссылку в окно

Мне было интересно, как я могу добавить гиперссылку (ссылку на веб-страницу в Интернете) в свое окно. Использую ли я CreateWindow, WM_PAINT и т. д.? Пожалуйста, дайте мне совет. Спасибо!

Изменить: вот что я делаю:

HWND CreateSysLink(HWND hDlg, HINSTANCE hInst, RECT rect){
    return CreateWindowEx(0, WC_LINK,
                          "For more information, <A HREF=\"http://www.microsoft.com\">click here</A> " \
                          "or <A ID=\"idInfo\">here</A>.",
                          WS_VISIBLE | WS_CHILD | WS_TABSTOP,
                          rect.left, rect.top, rect.right, rect.bottom,
                          hDlg, NULL, hInst, NULL);
}

Я копирую hInstance из параметров WinMain в глобальную переменную «globalhInstance», запустив globalhInstance = hInstance; в WinMain. Я также создаю глобальный RECT с именем globalRect. Затем в WM_CREATE я вызываю GetWindowRect(hwnd, &globalRect); ("hwnd" — это параметр WndProc). Наконец, в операторе switch внутри WM_COMMAND я вызываю CreateSysLink(hwnd, globalhInstance, globalRect);. Но это просто не работает.


person jadenPete    schedule 16.06.2015    source источник
comment
Вы ищете общий SysLink? контролировать?   -  person Jonathan Potter    schedule 17.06.2015
comment
CreateWindowEx( 0x0, WC_LINK, ... );   -  person IInspectable    schedule 17.06.2015
comment
Не могли бы вы дать мне пример кода   -  person jadenPete    schedule 17.06.2015
comment
Если это диалоговое окно и у вас есть Visual C++, вы можете перетащить элемент управления SysLink из панели инструментов.   -  person Barmak Shemirani    schedule 17.06.2015
comment
@JonathanPotter - Нет, я просто помещаю RECT globalRect; под моими включениями вверху моего файла .cpp и вызываю GetWindowRect(hwnd, &globalRect); для WM_CREATE.   -  person jadenPete    schedule 17.06.2015
comment
Вам необходимо предоставить действительные координаты, которые сообщают Windows, где расположен элемент управления и насколько он велик. Вы когда-нибудь создавали окно раньше?   -  person Jonathan Potter    schedule 17.06.2015
comment
Оооооооо.... Я думал, что ему нужен Rect окна. Я такой тупой :p Извините, я очень устал. И да - я создал окно раньше. Спасибо!   -  person jadenPete    schedule 17.06.2015
comment
@jadenPete: CreateWindowEx действительно хочет, чтобы RECT указывало размер создаваемого элемента управления. Поскольку это дочернее окно, вам нужно будет передать координаты клиента. GetWindowRect возвращает экранные координаты.   -  person IInspectable    schedule 17.06.2015


Ответы (1)


Вот пример кода из страница MSDN, указанная выше:

HWND CreateSysLink(HWND hDlg, HINSTANCE hInst, RECT rect)
{
    return CreateWindowExW(0, WC_LINK, 
        L"For more information, <A HREF=\"http://www.microsoft.com\">click here</A> " \
        L"or <A ID=\"idInfo\">here</A>.", 
        WS_VISIBLE | WS_CHILD | WS_TABSTOP, 
        rect.left, rect.top, rect.right, rect.bottom, 
        hDlg, NULL, hInst, NULL);
}
person Jonathan Potter    schedule 16.06.2015
comment
Я знаю, но мой компилятор говорит: ошибка: невозможно преобразовать 'const wchar_t*' в 'LPCSTR {aka const char*}' для аргумента '3' в 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int , int, HWND, HMENU, HINSTANCE, LPVOID)' кстати, я использую компилятор GNU GCC - person jadenPete; 17.06.2015
comment
Этот код вызывает TCHAR версию CreateWindowEx(), поэтому оберните строковые литералы макросом TEXT(), например: return CreateWindowEx(0, WC_LINK, TEXT("For more information, ..."), ...);. В противном случае вызовите CreateWindowExW() напрямую (класс WC_LINK не поддерживает CreateWindowExA()), передав ему расширенные строковые литералы (с префиксом L), например: return CreateWindowExW(0, WC_LINK, L"For more information, ...", ...);. - person Remy Lebeau; 17.06.2015
comment
Я ненавижу жаловаться, но обертывание их с помощью Text() скомпилировано нормально, но ссылка не отображается. Использование CreateWindowExW и L показывает ту же ошибку - person jadenPete; 17.06.2015
comment
@jadenPete Это базовые вещи Win32, создание дочерних окон. Не видя больше вашего кода, мы понятия не имеем, что может пойти не так. Например. вы передаете действительные координаты? - person Jonathan Potter; 17.06.2015
comment
@jadenPete Перед созданием элементов управления SysLink необходимо вызвать функцию InitCommonControlsEx, указав ICC_LINK_CLASS. см. здесь - person gudako; 26.07.2020