Перехватываем WM_CTLCOLORSTATIC для установления статику с линком синего цвета. Создаем фонт с подчеркиванием и устанавливаем этому статику.
Перехватываем WM_SETCURSOR и если мыша над статиком устанавливаем курсор-лапу, как наж настоящим линком.
Здравствуйте, SeLarin, Вы писали:
SL>Здравствуйте, patriotyk, Вы писали:
P>>скажите как создать гипер текстовую ссылку на форме не используя мфс.
SL>Использовать TrackMouseEvent и затем обрабатывать сообщения WM_MOUSEHOVER и WM_MOUSELEAVE, для изменения внешнего вида "ссылки".
Я так пробовал но у меня WM_MOUSEHOVER не поылался
Re[3]: Как создать гипер текстовую ссылку на форме
Здравствуйте, patriotyk, Вы писали:
P>Я так пробовал но у меня WM_MOUSEHOVER не поылался
TrackMouseEvent сбрасывается при каждом мышином событии и его надо вызывать постоянно при наступлении событий. Я это делаю в обработчике WM_MOUSEMOVE и всё нормально работает.
Здравствуйте, patriotyk, Вы писали:
P>скажите как создать гипер текстовую ссылку на форме не используя мфс.
Если приложение будет работать только на XP и выше, то можно использовать контрол SysLink из Common Controls v6.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, SaZ, Вы писали:
SaZ>>Вот примерчик. Не так давно писал. Как новичку в программировании попрошу оценить...
А>Клик по первой ссылке не пашет (не показывает сообщение).
Если вы внимательно почитаете код в файле Main.cpp, то поймёте, почему сообщение не выводится.
А>И размер первой ссылки слишком большой, хоть это и не видно.
Размер зависит от размера элемента управления. Я посчитал нерациональным определять область видимости текста, и, как ссылку, стал обрабатывать весь элемент управления.
Re[4]: Как создать гипер текстовую ссылку на форме
Здравствуйте, 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;
}
Уппс. SelectObject возвращает нам, если я ещё не заболел шизофренией, дескриптор предыдущего выбранного объекта. Его нужно запомнить или очистить
Причём, его нельзя удалять DeleteObject, пока он выбран SelectObject в некоторый контекст. Т.е. в CreateHotFont НЕЛЬЗЯ удалять эти шрифты
FDS> CCtrlLink::Init(hDlg, IDC_STATIC1);
FDS>А где созданный в Init объект удаляется?
Удаляется при обработке WM_DESTROY элемента управления (CCtrlLink::WndProc).
FDS>Уппс. SelectObject возвращает нам, если я ещё не заболел шизофренией, дескриптор предыдущего выбранного объекта. Его нужно запомнить или очистить FDS>Причём, его нельзя удалять DeleteObject, пока он выбран SelectObject в некоторый контекст. Т.е. в CreateHotFont НЕЛЬЗЯ удалять эти шрифты
FDS>Тогда должно быть скорее что-то в этом роде
FDS>
DeleteObject я вызываю в методе CCtrlLink::CreateHotFont, который в свою очередь вызывается только тогда, когда нужно заменить шрифт. Действиельно, при удалении объекта шрифт не будет удаляться. Нужно деструктор доработать.
Re[7]: Как создать гипер текстовую ссылку на форме
В общем понял, что прежде чем удалять, нужно установить новый. Соответственно прежде чем устанавливать новый, нужно запомнить тот, который был в самом начале. Переделаю.