Как создать гипер текстовую ссылку на форме
От: patriotyk  
Дата: 25.01.07 16:21
Оценка:
скажите как создать гипер текстовую ссылку на форме не используя мфс.
Re: Как создать гипер текстовую ссылку на форме
От: BlackHeretic Израиль  
Дата: 25.01.07 16:28
Оценка:
Перехватываем WM_CTLCOLORSTATIC для установления статику с линком синего цвета. Создаем фонт с подчеркиванием и устанавливаем этому статику.
Перехватываем WM_SETCURSOR и если мыша над статиком устанавливаем курсор-лапу, как наж настоящим линком.
ICQ 156156278
Re: Как создать гипер текстовую ссылку на форме
От: SeLarin Россия http://selarin.livejournal.com
Дата: 25.01.07 18:59
Оценка:
Здравствуйте, patriotyk, Вы писали:

P>скажите как создать гипер текстовую ссылку на форме не используя мфс.


Использовать TrackMouseEvent и затем обрабатывать сообщения WM_MOUSEHOVER и WM_MOUSELEAVE, для изменения внешнего вида "ссылки".
... << RSDN@Home 1.2.0 alpha rev. 653>>
Re: Как создать гипер текстовую ссылку на форме
От: _nn_  
Дата: 25.01.07 23:14
Оценка:
Здравствуйте, patriotyk, Вы писали:

P>скажите как создать гипер текстовую ссылку на форме не используя мфс.


WTL::CHyperLink
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Как создать гипер текстовую ссылку на форме
От: patriotyk  
Дата: 26.01.07 08:46
Оценка:
Здравствуйте, SeLarin, Вы писали:

SL>Здравствуйте, patriotyk, Вы писали:


P>>скажите как создать гипер текстовую ссылку на форме не используя мфс.


SL>Использовать TrackMouseEvent и затем обрабатывать сообщения WM_MOUSEHOVER и WM_MOUSELEAVE, для изменения внешнего вида "ссылки".


Я так пробовал но у меня WM_MOUSEHOVER не поылался
Re[3]: Как создать гипер текстовую ссылку на форме
От: SeLarin Россия http://selarin.livejournal.com
Дата: 26.01.07 11:11
Оценка:
Здравствуйте, patriotyk, Вы писали:

P>Я так пробовал но у меня WM_MOUSEHOVER не поылался

TrackMouseEvent сбрасывается при каждом мышином событии и его надо вызывать постоянно при наступлении событий. Я это делаю в обработчике WM_MOUSEMOVE и всё нормально работает.
Re: Как создать гипер текстовую ссылку на форме
От: Lonely Dog Россия  
Дата: 26.01.07 11:17
Оценка:
Здравствуйте, patriotyk, Вы писали:

P>скажите как создать гипер текстовую ссылку на форме не используя мфс.

Если приложение будет работать только на XP и выше, то можно использовать контрол SysLink из Common Controls v6.
Re: Как создать гипер текстовую ссылку на форме
От: SaZ  
Дата: 14.02.07 00:03
Оценка:
Здравствуйте, patriotyk, Вы писали:

P>скажите как создать гипер текстовую ссылку на форме не используя мфс.


Вот примерчик. Не так давно писал. Как новичку в программировании попрошу оценить...
Link.zip
.EXE и проект. Среда MSVS 2005, язык C++ (WinAPI).
Re[2]: Как создать гипер текстовую ссылку на форме
От: Аноним  
Дата: 14.02.07 06:36
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Вот примерчик. Не так давно писал. Как новичку в программировании попрошу оценить...


Клик по первой ссылке не пашет (не показывает сообщение).
И размер первой ссылки слишком большой, хоть это и не видно.
Re[3]: Как создать гипер текстовую ссылку на форме
От: SaZ  
Дата: 14.02.07 23:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, SaZ, Вы писали:


SaZ>>Вот примерчик. Не так давно писал. Как новичку в программировании попрошу оценить...


А>Клик по первой ссылке не пашет (не показывает сообщение).


Если вы внимательно почитаете код в файле Main.cpp, то поймёте, почему сообщение не выводится.

А>И размер первой ссылки слишком большой, хоть это и не видно.


Размер зависит от размера элемента управления. Я посчитал нерациональным определять область видимости текста, и, как ссылку, стал обрабатывать весь элемент управления.
Re[4]: Как создать гипер текстовую ссылку на форме
От: kero Россия  
Дата: 15.02.07 07:22
Оценка:
Здравствуйте, SaZ, Вы писали:

>Если вы внимательно почитаете код в файле Main.cpp, то поймёте, почему сообщение не выводится.


Лучше сами внимательно почитайте свой код, — утечка gdi.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: Как создать гипер текстовую ссылку на форме
От: SaZ  
Дата: 15.02.07 13:21
Оценка:
Здравствуйте, kero, Вы писали:

K>Лучше сами внимательно почитайте свой код, — утечка gdi.


Можно поподробнее?
Я поэтому и спросил мнение специалистов, потому что сам являюсь новичком в программировании.
Re[6]: Как создать гипер текстовую ссылку на форме
От: FDSC Россия consp11.github.io блог
Дата: 15.02.07 14:22
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, kero, Вы писали:


K>>Лучше сами внимательно почитайте свой код, — утечка gdi.


SaZ>Можно поподробнее?

SaZ>Я поэтому и спросил мнение специалистов, потому что сам являюсь новичком в программировании.

Что-то я вообще не понял.

Вот это:
    switch (uMsg)
    {
    case WM_INITDIALOG:
        CCtrlLink::Init(hDlg, IDC_STATIC1);
        CCtrlLink::Init(hDlg, IDC_STATIC2);
        CCtrlLink::Init(hDlg, IDC_STATIC3);
        return TRUE;

    case WM_CLOSE:
        EndDialog(hDlg, 0);
        return TRUE;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_STATIC1:
//            MessageBox(hDlg, _T("IDC_STATIC1"), _T("Clicked"), MB_ICONINFORMATION);
            return TRUE;
<skipped>
        case IDOK:
        case IDCANCEL:
            SendMessage(hDlg, WM_CLOSE, 0, 0);
            return TRUE;
        }

DeleteObject(    default:
        return FALSE;
    }

и

BOOL CCtrlLink::Init(HWND hWnd)
{
    CCtrlLink *link;
    link = new CCtrlLink();

    return link->Assign(hWnd);
}

BOOL CCtrlLink::Assign(HWND hWnd)
{
    if (!IsWindow(hWnd))
        return FALSE;

    // Проверяем, является ли контрол статиком
    TCHAR szClassName[CL_MAXSTR];
    GetClassName(hWnd, szClassName, CL_MAXSTR);
    if (_tccmp(szClassName, _T("STATIC")))
        return FALSE;

    this->hWnd = hWnd;

    // Запоминаем шрифт
    GetFont();
    // Вешаем свой обработчик
    OldWndProc = (WNDPROC *)GetWindowLong(hWnd, GWL_WNDPROC);
    SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WndProc);
    // Запоминаем указатель на класс окна
    lUserData = GetWindowLong(hWnd, GWL_USERDATA);
    SetWindowLong(hWnd, GWL_USERDATA, (LONG)this);

    uID = GetDlgCtrlID(hWnd);

    // Говорим оконной процедуре, что хук повесили
    SendMessage(hWnd, WM_CREATEHOOK, 0, 0);

    return TRUE;
}


А где созданный в Init объект удаляется?






И ещё вот это:
HFONT CCtrlLink::CreateHotFont(void)
{
    if (!hFont)
        return NULL;

    DeleteObject(hColdFont);
    DeleteObject(hHotFont);

    HDC hdc = GetDC(hWnd);
    TEXTMETRIC tm;

    SelectObject(hdc, hFont);
    GetTextMetrics(hdc, &tm);

и
            // Рисуем
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

            // Рисуем кантик, если есть фокус ввода
            if (ctl->bFocused)
            {
                COLORREF clrOldText = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
                COLORREF clrOldBg = SetBkColor(hdc, RGB(0xff, 0xff, 0xff));
                DrawFocusRect(hdc, &r);
                SetTextColor(hdc, clrOldText);
                SetBkColor(hdc, clrOldBg);
            }
            // Выбираем шрифт
            ctl->bUnderline = ctl->bHotTracked;
            SelectObject(hdc, ctl->bUnderline ? ctl->hHotFont : ctl->hColdFont);
            // Устанавливаем стандартный цвет
            SetTextColor(hdc, GetSysColor(COLOR_HOTLIGHT));
            // Выводим текст
            DrawText(hdc, lpszText, len - 1, &rt, ctl->Style);

            EndPaint(hWnd, &ps);

Уппс. SelectObject возвращает нам, если я ещё не заболел шизофренией, дескриптор предыдущего выбранного объекта. Его нужно запомнить или очистить
Причём, его нельзя удалять DeleteObject, пока он выбран SelectObject в некоторый контекст. Т.е. в CreateHotFont НЕЛЬЗЯ удалять эти шрифты

Тогда должно быть скорее что-то в этом роде


DeleteObject(SelectObject(hdc, ctl->bUnderline ? ctl->hHotFont : ctl->hColdFont));
Re[7]: Как создать гипер текстовую ссылку на форме
От: SaZ  
Дата: 15.02.07 15:22
Оценка:
Здравствуйте, FDSC, Вы писали:


FDS> CCtrlLink::Init(hDlg, IDC_STATIC1);


FDS>А где созданный в Init объект удаляется?


Удаляется при обработке WM_DESTROY элемента управления (CCtrlLink::WndProc).


FDS>Уппс. SelectObject возвращает нам, если я ещё не заболел шизофренией, дескриптор предыдущего выбранного объекта. Его нужно запомнить или очистить

FDS>Причём, его нельзя удалять DeleteObject, пока он выбран SelectObject в некоторый контекст. Т.е. в CreateHotFont НЕЛЬЗЯ удалять эти шрифты

FDS>Тогда должно быть скорее что-то в этом роде


FDS>
FDS>DeleteObject(SelectObject(hdc, ctl->bUnderline ? ctl->hHotFont : ctl->hColdFont));
FDS>


DeleteObject я вызываю в методе CCtrlLink::CreateHotFont, который в свою очередь вызывается только тогда, когда нужно заменить шрифт. Действиельно, при удалении объекта шрифт не будет удаляться. Нужно деструктор доработать.
Re[7]: Как создать гипер текстовую ссылку на форме
От: SaZ  
Дата: 15.02.07 15:26
Оценка:
В общем понял, что прежде чем удалять, нужно установить новый. Соответственно прежде чем устанавливать новый, нужно запомнить тот, который был в самом начале. Переделаю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.