Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Nikfel
60 / 32 / 15
Регистрация: 30.05.2009
Сообщений: 234
1

Как сделать подцветку ссылок и переход по ним в RichEdit на winapi?

27.07.2010, 21:05. Показов 1310. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сделать подцветку ссылок и переход по ним в RichEdit на winapi?
В интернете нашёл один вариант, но переписать не вышло по нормальному, вот как пробовал:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
...
uses Shellapi;
...
function GetTextLine(H,id:longint):string;
  var
    Text: array[0..4095] of Char;
begin
  Word((@Text)^) := SizeOf(Text);
  SetString(Result, Text, SendMessage(h, EM_GETLINE, id, Longint(@Text)));
end;
 
Function MainWinProc(HWin: THandle; Msg: Cardinal;
WParam, LParam: Integer): Cardinal; Stdcall;
var
   p: TENLink;
   strURL:string;
   mask:Word;
...
wm_create:begin
     mask := SendMessage(hWin, EM_GETEVENTMASK, 0, 0);
     SendMessage(RichWND, EM_SETEVENTMASK, 0, mask or ENM_LINK or ENM_CHANGE);
     SendMessage(RichWND, EM_AUTOURLDETECT, Integer(True), 0);
end;
WM_NOTIFY:begin
  if (PNMHDR(lParam).code = EN_LINK) then begin
    p := TENLink(Pointer(TWMNotify(Msg).NMHdr)^);
    if (p.Msg = WM_LBUTTONDOWN) then begin
    SendMessageEx(RichWND, EM_EXSETSEL, 0, Longint(@(p.chrg)));
    strURL:=GetTextLine(richWND, SendMessage(richWND,Em_LineFromChar,-1,0) );//не понятно зачем надо
    SendMessage(richWND,EM_GETSELTEXT,0,longint(strURL));
    ShellExecute(hWin, 'open', PChar(strURL), nil, nil, SW_SHOWNORMAL);
    end
  end;
end;
...
msg - имеет тип Cardinal, а надо TMessage, но как тогда заполнить правильно этот TENLink, если Tmessage у меня нет вообще, т.к. чистый WinApi. Заранее спасибо.

Добавлено через 7 часов 22 минуты
Вот вроде разобрался, но возможно можно сделать по другому:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
uses RichEdit, ShellApi;
 
function Trim(inp_str: String): String;
 var
   i: Integer;
 begin
   for i := 1 to Length(inp_str) do if (inp_str[i] <> ' ') and (inp_str[i] <>Char(9)) then Break;
   if i > 1 then Delete(inp_str, 1, i - 1);
   for i := Length(inp_str) downto 1 do if (inp_str[i] <> ' ') and (inp_str[i] <>Char(9)) then Break;
   if i < Length(inp_str) then Delete(inp_str, i + 1, Length(inp_str));
   result := inp_str;
   if result = ' ' then result := '';
 end;
 
function GetTextLine(H,id:longint):string;
  var
    Text: array[0..4095] of Char;
begin
  Word((@Text)^) := SizeOf(Text);
  SetString(Result, Text, SendMessageEx(h, EM_GETLINE, id, Longint(@Text)));
end;
 
Function MainWinProc(HWin: THandle; Msg: Cardinal;
WParam, LParam: Integer): Cardinal; Stdcall;
var mask:Word;
     p: TENLink;
     strURL:string;
...
WM_CREATE:begin
mask := SendMessage(hWin, EM_GETEVENTMASK, 0, 0);
SendMessage(RichWND, EM_SETEVENTMASK, 0, mask or ENM_LINK or ENM_CHANGE);
SendMessage(RichWND, EM_AUTOURLDETECT, Integer(True), 0);
end;
WM_NOTIFY:begin
  if (PNMHDR(lParam).code = EN_LINK) then begin
    p:=TENLink(Pointer(PNMHDR(Lparam))^);
    if (p.Msg = WM_LBUTTONDOWN) then begin
      SendMessage(RichWND, EM_EXSETSEL, 0, Longint(@(p.chrg)));
      strURL:=GetTextLine(RichWnd,SendMessage(richWnd,Em_LineFromChar,-1,0));
      strURL:=Copy(strURL, p.chrg.cpMin-SendMessage(richWnd,EM_LINEINDEX,-1,0),p.chrg.cpMax-p.chrg.cpMin+1);
      ShellExecute(hWin, 'open', PChar(trim(strURL)), nil, nil, SW_SHOWNORMAL);
      SetFocus(RichWnd);
    end
  end;
end;
Добавлено через 15 минут
Ещё лучше делать обработку WM_LBUTTONUP и тогда можно будет убрать строчку: SetFocus(RichWnd);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2010, 21:05
Ответы с готовыми решениями:

Загрузка ссылок с txt файла и переход по ним
var page = VkRequest.Request(&quot;http://www.socks24.org/&quot;).Content; var matches = Regex.Matches(page,...

Поиск ссылок с определенной последовательностью символов и переход по ним
Мне необходимо организовать поиск ссылок в listbox3, в ссылки которых могут входит 2 последовательности символов: ps.ram или //horos (то...

Переход текста, как по страницам RichEdit Delphi 7
Нужна помощь. Есть два RichEdit, по событию OnChange должно проверятся: достиг ли нами написанный текст конца, и если достиг, то переносить...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2010, 21:05
Помогаю со студенческими работами здесь

Как определить переход на новую строку в RichEdit
Можно ли как-то определить переход на новую строку в RichEdit? Пытался через RichEdit.text методом поиска символов #13#10, но они не...

RichEdit и WinApi
У меня такая проблема. При компиляции Pastebtn.Enabled:=RichEdit1.Perform(em_canpaste , 0, 0)&lt;&gt;0; выдает ошибку Как...

Как сделать печать из RichEdit?
пытаюсь сделать блокнот не могу добавить распечатку текста,искал но везде по-заумному написано, компонент Richedit, пишу с помощью MFC. ...

Как сделать Redo в RichEdit?
RichEdit называется MainText Я пишу так: MainText-&gt;Undo(); Undo есть, а Redo нету и Undo почему-то имеет один шаг отмены.Как сделать...

Переход на следующую строку в RichEdit
Всем здравствуйте ! Подскажите пожалуйста, как в делфи (компонент Richedit) реализовать набор текста как в МС Word. Т.е. когда набираю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Java Record или Kotlin Data Class: что лучше для неизменяемых данных
Wired 04.03.2025
Java Record и Kotlin Data Class - средства для работы с неизменяемыми структурами данных, каждое из которых предлагает свой уникальный подход к решению этой задачи. История их появления весьма. . .
Создание производительны­­х API с Java и gRPC
Wired 04.03.2025
В разработке производительность и масштабируемость микросервисных приложений играют ключевую роль. Традиционные REST API, несмотря на свою популярность и простоту, не всегда способны обеспечить. . .
Что нового в JDK 24
Wired 04.03.2025
JDK 24 знаменует собой значительный скачок в развитии Java, внося фундаментальные улучшения в производительность, безопасность и удобство разработки. Релиз включает множество революционых изменений,. . .
Разработка блокчейн с использованием Java: смарт-контракты и dApp
Wired 04.03.2025
Современная блокчейн-разработка на Java предоставляет разработчикам широкий спектр возможностей. В отличие от Solidity, который ограничен экосистемой Ethereum, Java позволяет создавать как. . .
WebAssembly в Kubernetes
stackOverflow 03.03.2025
В современной экосистеме облачных технологий WebAssembly (Wasm) становится все более значимым компонентом, предлагая уникальный подход к выполнению кода в распределенных системах. Эта технология. . .
GitHub Actions или Jenkins: Выбираем CI/CD платформу
stackOverflow 03.03.2025
Непрерывная интеграция и развертывание (CI/ CD) изменили подход к разработке программного обеспечения, превратив его в бесшовный процесс от написания кода до развертывания в продакшн. GitHub Actions и. . .
Автоматизация тестирования Pull Request в Kubernetes: Интеграция с GitHub Actions и GKE
stackOverflow 03.03.2025
Масштабные проекты с использованием Kubernetes требуют надежной системы тестирования изменений перед их внедрением в продакшн-среду. Традиционный подход с ручной проверкой Pull Request не справляется. . .
Tестирование Pull Request в Kubernetes с помощью vCluster
stackOverflow 03.03.2025
При работе с микросервисной архитектурой критически важно обеспечить качественное тестирование каждого изменения перед его слиянием в основную кодовую базу. Однако тестирование Pull Request в. . .
Использование пакета Context в Golang
bytestream 03.03.2025
Управление параллельными процессами в современных приложениях - сложная задача, особенно когда речь идет о микросервисной архитектуре и распределенных системах. Пакет context в Go - это гибкое. . .
WebAssembly и Go: Работа с DOM и обработка ошибок
bytestream 03.03.2025
WebAssembly представляет собой технологию, позволяющую запускать низкоуровневый код в браузере практически на нативной скорости. Особенно интересные возможности открываются при использовании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru