Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Изменение цвета выделенного текста в RichEdit


Автор: Burich-Caeser 29.9.2005, 20:55
Снова непонятки с RichEdit. Пытался менять цвет так:
Код

  LockWindowUpdate(hRichedit);
  SendMessage(hRichEdit,em_setsel,Range.cpMin ,Range.cpMax);
  SendMessage(hRichEdit,EM_GetCharFormat,Integer(true),longint(@CharFormat));
  CharFormat.cbSize :=sizeof(charformat);
  CharFormat.dwMask :=CFM_Color;
  CharFormat.crTextColor :=3;
  SendMessage(hRichEdit,em_setcharformat,SCF_WORD or SCF_SELECTION,longint(@Charformat));
  SendMessage(hRichEdit,em_setsel,pos,pos);
  LockWindowUpdate(0);

Ничего хорошего не вышло. В открытых VCL аналогичный код.
Кто знает, помоготе, пожалуйста.

Автор: Pakshin A. S. 29.9.2005, 21:05
Код

  RichEdit1.SelAttributes.Color:=clRed;

Добавлено @ 21:08
Черт... это же в WinApi тема... smile

Автор: Vex 29.9.2005, 21:57
попробуй так:

Код

 LockWindowUpdate(hRichedit);    
  SendMessage(hRichEdit,em_setsel,Range.cpMin ,Range.cpMax);    
  SendMessage(hRichEdit,EM_GetCharFormat,Integer(true),longint(@CharFormat));    
  CharFormat.cbSize :=sizeof(charformat);    
  CharFormat.dwMask :=CFM_Color;    
  CharFormat.crTextColor :=3;    
  SendMessage(hRichEdit,em_setcharformat,SCF_WORD or SCF_SELECTION,longint(@Charformat));    
  SendMessage(hRichEdit,em_exsetsel,0,longint(@Charformat));    
  SendMessage(hRichEdit,em_hideselection,false,false);
  LockWindowUpdate(0);
  

Автор: Vex 30.9.2005, 00:27
Вот, держи исходник. Выделяешь текст, а потом нажимаешь на кнопку (она сразу под текстом, ее не видно, но она существует smile ) Извини за не аккуратность, мне завтра рано вставать, думаю ты разберешься smile

Код

program SelectTextInRichEdit ;

uses
  QDialogs,  Windows,
  SysUtils, Classes,
  Controls, Forms, Dialogs,
   Messages,  Variants,  Graphics,
   Buttons, StdCtrls, ComCtrls, ImgList, RichEdit;

const
 RichId = 10;


var
  wc : TWndClassEx;
  MainWnd, RichWnd : HWND;
  Mesg : TMsg;
  hRichDll: HINST;
  CharFormat: TCharFormat;
  Button1:HWND;


function WindowProc(wnd:HWND; Msg : Integer; wParam:wParam; lParam:lParam):lResult; stdcall;
begin
  case msg of
    WM_DESTROY: begin
      PostQuitMessage(0);
      Exit; 
      Result:=0;
    end; 
    WM_SIZE: begin 
      MoveWindow(RichWnd, 0, 0, LoWord(lParam), HiWord(lParam), False);
      Result:=DefWindowProc(wnd,msg,wparam,lparam);
    end;
    WM_ACTIVATE: begin 
      Result:=DefWindowProc(wnd,msg,wparam,lparam); 
      SetFocus(RichWnd);
    end;

    WM_COMMAND: begin

     //**********************
    // òóò ìû è ìåíÿåì öâåò
    //*********************
if LoWord( wParam ) = 0 then begin

 LockWindowUpdate(RichWnd);

  SendMessage(RichWnd,EM_GetCharFormat,Integer(true),longint(@CharFormat));
  CharFormat.cbSize :=sizeof(charformat);
  CharFormat.dwMask :=CFM_Color;
  CharFormat.crTextColor :=clRed;
  SendMessage(RichWnd,em_setcharformat,SCF_WORD or SCF_SELECTION,longint(@Charformat));
  SendMessage(RichWnd,em_exsetsel,0,longint(@Charformat));
  SendMessage(RichWnd,em_hideselection,0,0);
  LockWindowUpdate(0);
end;
     end;


  else
    Result:=DefWindowProc(wnd,msg,wparam,lparam);
  end;

End;

var R: tRect;
begin 
  hRichDll := LoadLibrary('RICHED20.DLL');
  if hRichDll = 0 then exit;
  try
    with wc do begin
      cbSize := sizeof(wc);
      style := cs_hredraw or cs_vredraw;
      lpfnWndProc := @WindowProc;
      cbClsExtra := 0; 
      cbWndExtra := 0;
      hInstance := HInstance;
      hIcon := LoadIcon(0,idi_application);
      hCursor := LoadCursor(0,idc_arrow);
      hbrBackground := COLOR_BTNFACE+1;
      lpszMenuName := nil;
      lpszClassName := 'WinMin : Main';
    end;


    RegisterClassEx(wc);
    MainWnd := CreateWindowEx (0,'WinMin : Main','Win Min',
    WS_OVERLAPPEDWINDOW,500,100,400,100,0,0,Hinstance,nil);
   GetClientRect(MainWnd, R);

    Button1 := CreateWindowEx( WS_EX_STATICEDGE, 'Button', 'Button1', WS_VISIBLE or WS_CHILD,
10, 20, 90, 40, MainWnd, 0, hInstance, nil );



    RichWnd := CreateWindowEx (WS_EX_STATICEDGE,'RichEdit20W','idjkjhfdhsf dhfkdh kdsh fkdsh fkdsfd',
      WS_VISIBLE or WS_CHILD,
     100, 100,100, 100,MainWnd,RichID,Hinstance,nil);





    ShowWindow(MainWnd,SW_NORMAL);
    ShowWindow(Button1,SW_NORMAL);
    SetFocus(Button1);





 //********************
 //if (Mesg.message = WM_CHAR) and (Mesg.hwnd = REWnd) then begin



//end;
 //********************
         while GetMessage(Mesg,0,0,0) do begin




      TranslateMessage(Mesg);
      DispatchMessage(Mesg);
    end;


  finally
    FreeLibrary(hRichDll);
  end;
end.

Автор: Burich-Caeser 30.9.2005, 22:35
Vex сПАсибище. Попробую разобраться. smile

Автор: Burich-Caeser 1.10.2005, 17:21
Vex Странно, работает только в одно выделение. Подкрасить два отдельных слова, оставив между ними черный не получается smile


lonely delphist Спасибо, в VCL я знаю. Проблема в том, что надо через АПИ.

Автор: Vex 2.10.2005, 22:38

Код

WM_COMMAND: begin
if LoWord( wParam ) = 0 then begin
  LockWindowUpdate(RichWnd);
  SendMessage(RichWnd,EM_GetCharFormat,Integer(true),longint(@CharFormat));
  CharFormat.cbSize :=sizeof(charformat);
  CharFormat.dwMask :=CFM_Color;
  CharFormat.crTextColor :=clRed;
  SendMessage(RichWnd,em_setcharformat,SCF_WORD or SCF_SELECTION,longint(@Charformat));
  SendMessage(RichWnd,em_exsetsel,0,longint(@Charformat));
 SendMessage(RichWnd,em_hideselection,0,0);
 LockWindowUpdate(0);


добавь:

Код

Charformat.cbSize:=0;


Автор: Burich-Caeser 3.10.2005, 18:57
Vex Прошу прощения за глупый вопрос, но почему 0, а не размер структуры. Всегда срабатывал второй вариант.

Автор: Vex 3.10.2005, 19:29
Цитата(Burich @ 3.10.2005, 18:57)
Vex Прошу прощения за глупый вопрос, но почему 0, а не размер структуры. Всегда срабатывал второй вариант.

по моему проблема где-то здесь:
Код

 CharFormat.cbSize :=sizeof(charformat);


вот, кстати интересная загадка smile
Буратине дали три яблока. Два он съел. Сколько яблок осталось у Буратины?
Думаете одно? Нифига … Оказывается — ответа нет. Никто же не знает сколько у него уже было яблок до этого…
Мораль — обнуляйте переменные

smile

Цитата
Всегда срабатывал второй вариант.

Только что проверил, не сработал...
Добавлено @ 19:34
Может ты меня не правильно понял, Charformat.cbSize:=0; добавь в конец, а не вместо CharFormat.cbSize :=sizeof(charformat);

вот так должно быть:

Код

WM_COMMAND: begin    
if LoWord( wParam ) = 0 then begin    
  LockWindowUpdate(RichWnd);    
  SendMessage(RichWnd,EM_GetCharFormat,Integer(true),longint(@CharFormat));    
  
CharFormat.cbSize :=sizeof(charformat);    

  CharFormat.dwMask :=CFM_Color;    
  CharFormat.crTextColor :=clRed;    
  SendMessage(RichWnd,em_setcharformat,SCF_WORD or SCF_SELECTION,longint(@Charformat);
  SendMessage(RichWnd,em_exsetsel,0,longint(@Charformat));    
 SendMessage(RichWnd,em_hideselection,0,0);    
 LockWindowUpdate(0);


CharFormat.cbSize :=0;    



Автор: Burich-Caeser 5.10.2005, 18:59
Vex Урреу, все работает как надо. Спасибо большое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)