Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Картинку вперед


Автор: WolfON 6.11.2004, 19:32
Блин, такая страшная проблема, есть компонент - RxRichEdit и мне надо, чтобы картинка закрывала его часть(по верх компоненты была картинка), но сколько не нажимал Bring To Front, не помогает smile Может можно как-нить это сделать?

Автор: WolfON 7.11.2004, 18:53
Поднимаю тему

Автор: krid24 7.11.2004, 20:39
А картинка - это TImage? Тогда через Bring To Front не получится. Потому как TImage наследник от TGraphicControl. Т.е. это не окно (не имеет оконный handle), а просто рисункок на форме. К примеру, TLabel - то же самое, и его тоже не выйдет положить поверх RichEdit'а (по той же причине - это такой же "рисунок", т.е текст прорисовывается на канве родителя API'шной ф-цией DrawText ).
Выход - положить TImage на TPanel, а уж для TPanel - Bring To Front.

Автор: Guest 8.11.2004, 03:08
krid24
хех, не все так просто smile каринка не стандартной формы(я поставлю св-во transperent, она в гифе) и если я ее положу на панель у меня получится, что на прозрачном месте будет панель... а мне нужно, чтобы там был ричедит smile

Автор: WolfON 8.11.2004, 21:34
Предыдущий пост - мой.
Поднимаю тему.
Блин, народ, помагайте!!!

Автор: Vit 8.11.2004, 21:48
Поверх положить прозрачную панель, а на панель картинку?

Автор: WolfON 8.11.2004, 21:50
Vit
хех, а откуда взять прозрачную панель???
вроде в стандартных компонентах она не прозрачная.... smile
(балин, я уже всех тут задолбал, наверное smile )

Автор: WolfON 8.11.2004, 22:40
WolfON
нащел в JEDI, но когда я текст скролиррую, ричедит все-равно наверх вылазит smile

Автор: Vit 8.11.2004, 22:54
Сейчас попробую поколдовать ...

Автор: Vit 8.11.2004, 23:29
Мдя... задачка ещё та, кроме как положить картинку на вторую прозрачную форму вариантов что-то пока нет... Буду ещё пробовать, может что накопаю...

Автор: WolfON 9.11.2004, 00:08
Vit
а реально, как-нибудь регионы использовать???

Автор: krid24 9.11.2004, 05:08
еще вариант - вставить картинку в RichEdit непосредственно в виде rtf-тегов (через EM_STREAMIN). Т.е. картинка становится частью rtf-документа:
Код
uses
  RichEdit;

// Stream Callback function
type
  TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
    cb: Longint; var pcb: Longint): DWORD;
  stdcall;

  TEditStream = record
    dwCookie: Longint;
    dwError: Longint;
    pfnCallback: TEditStreamCallBack;
  end;

// RichEdit Type
type
  TMyRichEdit = TRxRichEdit;

// EditStreamInCallback callback function
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): DWORD; stdcall;
  // by P. Below
var
  theStream: TStream;
  dataAvail: LongInt;
begin
  theStream := TStream(dwCookie);
  with theStream do
  begin
    dataAvail := Size - Position;
    Result := 0;
    if dataAvail <= cb then
    begin
      pcb := read(pbBuff^, dataAvail);
      if pcb <> dataAvail then
        Result := UINT(E_FAIL);
    end
    else
    begin
      pcb := read(pbBuff^, cb);
      if pcb <> cb then
        Result := UINT(E_FAIL);
    end;
  end;
end;

// Insert Stream into RichEdit
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);
  // by P. Below
var
  EditStream: TEditStream;
begin
  with EditStream do
  begin
    dwCookie := Longint(SourceStream);
    dwError := 0;
    pfnCallback := EditStreamInCallBack;
  end;
  RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));
end;

// Convert Bitmap to RTF Code
function BitmapToRTF(pict: TBitmap): string;
// by D3k
var
  bi, bb, rtf: string;
  bis, bbs: Cardinal;
  achar: ShortString;
  hexpict: string;
  I: Integer;
begin
  GetDIBSizes(pict.Handle, bis, bbs);
  SetLength(bi, bis);
  SetLength(bb, bbs);
  GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);
  rtf := '{\rtf1 {\pict\dibitmap ';
  SetLength(hexpict, (Length(bb) + Length(bi)) * 2);
  I := 2;
  for bis := 1 to Length(bi) do
  begin
    achar := Format('%x', [Integer(bi[bis])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I - 1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I, 2);
  end;
  for bbs := 1 to Length(bb) do
  begin
    achar := Format('%x', [Integer(bb[bbs])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I - 1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I, 2);
  end;
  rtf := rtf + hexpict + ' }}';
  Result := rtf;
end;


// Example to insert image from Image1 into RxRichEdit1
procedure TForm1.Button1Click(Sender: TObject);
var
  SS: TStringStream;
  BMP: TBitmap;
begin
  BMP := TBitmap.Create;
  BMP := Image1.Picture.Bitmap;
  SS  := TStringStream.Create(BitmapToRTF(BMP));
  try
    PutRTFSelection(RxRichEdit1, SS);
  finally
    SS.Free;
  end;
end;

Автор: krid24 9.11.2004, 07:09
вот наваял сейчас на скорую руку. Что-то типа "прозрачной панели":
Код
function SetBitmapWindow(wnd:HWND; hBMP:HBITMAP; ExcludeColor:COLORREF=$FFFFFF):boolean;
Var
 x1,x,y: Integer;
 r:HRGN;
 bm:tagBITMAP;
 memDC:HDC;
 oldBM:HBITMAP;
begin
 result:=false;
 x1 := -1;
 r := CreateRectRgn(0,0,0,0);
 if r=0 then exit;
 if GetObject(hBmp,SizeOf(bm),@bm)=0 then exit;
 SetWindowPos(wnd,0,0,0,bm.bmWidth,bm.bmHeight,SWP_NOMOVE or SWP_NOZORDER);
 memDC:=CreateCompatibleDC(0);
 oldBM:=SelectObject(memDC, hBmp);
   for y := 0 to bm.bmHeight-1 do
     for x := 0 to bm.bmWidth-1 do
         if GetPixel(memDC,x,y)<>ExcludeColor then
         begin If x1=-1 then x1 := x end
       else
         if x1>-1 then
         begin
           CombineRgn(r,r,CreateRectRgn(x1,y,x-1,y+1),RGN_OR);
           x1 := -1;
         end;
SelectObject(memDC,oldBM);
DeleteDC(memDC);
Result:=SetWindowRgn(wnd, r, True)<>0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Align:=alClient;
  SetBitmapWindow(Panel1.Handle,Шmage1.Picture.Bitmap.Handle);
end;


берешь панель, не нее картинку и все это на RichEdit (или на любой другой контрол). А в SetBitmapWindow в последнем параметре (ExcludeColor) задаешь цвет, который у картинки прозрачным будет (умолчальный - белый).

Автор: WolfON 9.11.2004, 10:39
krid24
ты видимо не понял, зачем я это делаю smile МНЕ НУЖЕН RICHEDIT НЕСТАНДАРТНОЙ ФОРМЫ! smile

Автор: krid24 9.11.2004, 13:48
Цитата(Guest @ 8.11.2004, 04:08)
хех, не все так просто  каринка не стандартной формы

Не верь глазам своим (© К.Прутков) ?

хмм... напиши поподробней, что именно тебе нужно. Какой формы RichEdit и причем тут тогда картинка. Как это все должно выглядеть? smile

Автор: WolfON 9.11.2004, 22:18
krid24
Richedit формы - прямоугольник с закругленными(достаточно сильно закругленными) углами, а картинка тут затем, как я думал, чтобы ее наложить сверху и таким образом получить нст ричедит

Автор: WolfON 10.11.2004, 00:10
krid24
Ричедит формы прямоугольника со скругленными углами(сильно скругленными), я просто хотел наложить сверху картинку, чтобы ричедит стал такой формы

Автор: krid24 10.11.2004, 09:43
Ага, понял smile
Ну если просто RichEdit с круглыми углами, тогда можно примерно так
Код
procedure TForm1.FormCreate(Sender: TObject);
var
    FRegion:HRGN;
begin
    FRegion := CreateRoundRectRgn(0, 0, RichEdit1.Width, RichEdit1.Height, RichEdit1.Width div 4, RichEdit1.Height div 4);
  if FRegion <> 0 then
    SetWindowRgn(RichEdit1.Handle, FRegion, True);
end;

тока надо подобрать параметры у CreateRoundRectRgn (высоту/ширину/эллипсы), чтобы выглядело так, как тебе надо.

А если хочешь именно картинку, тогда вполне подойдет то, что я выше написАл (про SetBitmapWindow).
Можешь дать мне эту картинку (здесь приаттачить или мне на мыло krid24<гав-гав>@mail.ru) и я гляну чего с ней можно сделать.

Автор: WolfON 16.11.2004, 19:51
krid24
Хочешь обрадую??? smile
НЕ РАБОТАЕТ smile
(я юзаю jvrichedit, из JEDI http://jediproject.sourceforge.net)

Автор: p0s0l 18.11.2004, 02:25
Перенесено из раздела Дельфи

Автор: RuRnit 9.3.2008, 11:53
так че надо просто закруглить rich?
легко! (только полосы прокрутки пропадут)
Код

procedure MakeRounded(Control: TWinControl);
 var
   R: TRect;
   Rgn: HRGN;
 begin
   with Control do
   begin
     R := ClientRect;
     rgn := CreateRoundRectRgn(R.Left + 3, R.Top + 3, R.Right, R.Bottom, 5, 5);
     Perform(EM_GETRECT, 0, lParam(@r));
     InflateRect(r, -4, -4);
     Perform(EM_SETRECTNP, 0, lParam(@r));
     SetWindowRgn(Handle, rgn, True);
     Invalidate;
   end;
 end;


пошлешь в эту процедурку любой компонент и все ОК  smile 

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