Конференция "Компоненты" » Требуется компонент - подобие TEdit [D7, WinXP]
 
  • {RASkov} © (01.05.08 13:59) [20]
  • Игорь Шевченко © (01.05.08 14:16) [21]

    > HsGradient - это что за юнит такой? Гугл молчит


    "Вместо HsGradientEdit и соответствующего класса можно вполне применить метод GradientFillCanvas из GraphUtil.pas, не мой вариант больше подходит, так как более переносим между версиями Delphi"

      ACanvas := TCanvas.Create;
      try
        ACanvas.Handle := Message.ChildDC;
        GradientFillCanvas (ACanvas, FStartColor, FEndColor, ClientRect,
          gdHorizontal);
      finally
        ACanvas.Handle := 0;
        ACanvas.Free;
      end;
  • R1ka © (01.05.08 14:18) [22]
    {RASkov},
    ага, нашел уже, спасибо!

    Игорь Шевченко,
    В моем GraphUtils нет такого метода
  • Игорь Шевченко © (01.05.08 14:18) [23]
    {RASkov} ©   (01.05.08 13:56) [18]


    > Красиво, но при вводе текст перед курсором пропадает, от
    > него остается только одна буква.
    > TextInEdit - текст находится в эдите
    >   t|InEdit - при редактировании
    > | - курсор.
    > [D7, WinXP]


    Не смог воспроизвести. D2006, WinXP, без тем

    Если не трудно, дай последовательность шагов для воспроизведения, а то я собираюсь кусок с градиентной заливкой в свой Edit вставлять и хотелось бы сразу наступить на возможные грабли.
  • Игорь Шевченко © (01.05.08 14:20) [24]

    > В моем GraphUtils нет такого метода


    Лови:

    unit HSGradient;

    interface
    uses
     Windows, Graphics;

    type
     THSGradientStyle = (gsNone, gsHorizontal, gsVertical);

     THSGradientFill = class
     private
       FStartColor: TColor;
       FEndColor: TColor;
       FStyle: THSGradientStyle;
     public
       procedure FillRect (ACanvas: TCanvas; ARect: TRect);
       property StartColor: TColor read FStartColor write FStartColor;
       property EndColor: TColor read FEndColor write FEndColor;
       property Style: THSGradientStyle read FStyle write FStyle;
     end;

    implementation
    uses
     HSMsImg;

    { THSGradientFill }

    procedure THSGradientFill.FillRect(ACanvas: TCanvas; ARect: TRect);
    const
     StdGradientRect: GRADIENT_RECT = (UpperLeft: 0; LowerRight: 1);
     GradientDirections: array[Boolean] of Integer = (GRADIENT_FILL_RECT_H,
       GRADIENT_FILL_RECT_V);
    var
     Vert: array[0..1] of THSTriVertex;
    begin
     Vert[0].Red := Word(GetRValue(FStartColor)) shl 8;
     Vert[0].Green := Word(GetGValue(FStartColor)) shl 8;
     Vert[0].Blue := Word(GetBValue(FStartColor)) shl 8;
     Vert[1].Red := Word(GetRValue(FEndColor)) shl 8;
     Vert[1].Green := Word(GetGValue(FEndColor)) shl 8;
     Vert[1].Blue := Word(GetBValue(FEndColor)) shl 8;
     Vert[0].x := ARect.Left;
     Vert[0].y := ARect.Top;
     Vert[1].y := ARect.Bottom;
     Vert[1].x := ARect.Right;
     HSGradientFill(ACanvas.Handle, PHSTriVertex(@Vert), 2, @StdGradientRect, 1,
       GradientDirections[FStyle = gsVertical]);
    end;

    end.



    {
      Модуль: HsMsImg

      Описание: Интерфейс к функциям MSIMG32

      Автор: Игорь Шевченко

      Дата создания: 18.10.2002

      История изменений:
    }

    unit HSMsImg;

    interface
    uses
     Windows;

    type
     THSTriVertex = packed record
       x: LongInt;
       y: LongInt;
       Red: Word;
       Green: Word;
       Blue: Word;
       Alpha: Word;
     end;
     PHSTriVertex = ^THSTriVertex;

    function HSGradientFill(DC: HDC; Vertex: PHSTriVertex; NumVertex: ULONG;
     Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall;
    const
     { gradient drawing modes }
     GRADIENT_FILL_RECT_H = $00000000;
     GRADIENT_FILL_RECT_V = $00000001;
     GRADIENT_FILL_TRIANGLE = $00000002;
     GRADIENT_FILL_OP_FLAG = $000000ff;

    implementation

    type
     THSGradientFill = function (DC: HDC; Vertex: PHSTriVertex; NumVertex: ULONG;
       Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall;
    var
     _HSGradientFill: THSGradientFill;
     DllHandle: THandle;

    const
     Dllname = 'msimg32.dll';

    function InitLib: Boolean;
    begin
     if DllHandle = 0 then begin
       DllHandle := LoadLibrary(Dllname);
       if DllHandle <> 0 then begin
         @_HSGradientFill := GetProcAddress(DllHandle, 'GradientFill');
       end;
     end;
     Result := DllHandle <> 0;
    end;

    function HSGradientFill(DC: HDC; Vertex: PHSTriVertex; NumVertex: ULONG;
     Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall;
    begin
     if InitLib and Assigned(_HSGradientFill) then
       Result := _HSGradientFill(DC, Vertex, NumVertex, Mesh, NumMesh, Mode)
     else begin
       Result := false;
       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     end;
    end;

    initialization
    finalization
     if DllHandle <> 0 then
       FreeLibrary(DllHandle);
    end.

  • R1ka © (01.05.08 14:21) [25]
    Некоторые глюки вылазиют зависимо от того, включен-ли манифест в проект, а не от того, включены ли темы XP
  • R1ka © (01.05.08 14:26) [26]
    Игорь Шевченко,
    глюки такие:
    сразу как запускается форма и фокус попадает в окно эдита - курсор ставится в конец, но текста не видно. если кликнуть или выделить текст, то последний начинает отображаться

    если набирать текст, и он не влезает в окошко, то при сдвиге вправо, часть текста слева пропадает до следующей перерисовки едита
  • Игорь Шевченко © (01.05.08 14:29) [27]
    R1ka ©   (01.05.08 14:26) [26]

    у тебя edit или memo ?

    C memo такие явления наблюдаются, с edit не могу воспроизвести. Манифестов и тем у меня нету.
  • R1ka © (01.05.08 14:30) [28]
    Я ваш код взял => TEdit
  • {RASkov} © (01.05.08 14:37) [29]
    > [23] Игорь Шевченко ©   (01.05.08 14:18)
    > Если не трудно, дай последовательность шагов для воспроизведения

    Да соб-сно какие шаги.... вот:
    подключили uses HsGradientEdit;
    Создали:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     with THsGradientEdit.Create(self) do begin
       Parent:=Self;
       Left:=50;
       Top:=100;
       StartColor:=clRed;
       EndColor:=clSkyBlue;
     end;
    end;

    Далее вводим текст.... и тот текст что "неподвижный" он не рисуется...
    только обновляется который либо сдвигается при вводе, либо последний введенный символ...

    Это самое и с манифестом и без него.... Тема стандартная XP
  • {RASkov} © (01.05.08 14:46) [30]
    > [23] Игорь Шевченко ©   (01.05.08 14:18)

    У нас одно только различие D7 vs D2006
  • Игорь Шевченко © (01.05.08 15:04) [31]
    Поставил стандартную тему XP - все вводится, ничего не пропадает, скроллинг нормальный.

    XPManifest в uses нету.
  • R1ka © (01.05.08 15:06) [32]
    А можно скомпиленый exe? Может не только в делфи дело?
  • {RASkov} © (01.05.08 15:08) [33]
    > [31] Игорь Шевченко ©   (01.05.08 15:04)
    > все вводится, ничего не пропадает, скроллинг нормальный.

    Значит везет не всем :)
  • Игорь Шевченко © (01.05.08 16:33) [34]

    > А можно скомпиленый exe?


    можно. на адрес в посте отправлен архив с ......@hotmail.com с темой
    "Edit with gradient fill"
  • R1ka © (01.05.08 16:52) [35]
    Получил, вот, скриншоты сделал с этими глюками:
    http://img329.imageshack.us/img329/4867/errwa4.png
  • Игорь Шевченко © (01.05.08 17:28) [36]
    Странно.
    У меня это выглядит вот так:

    http://cid-2fbfd926d50f54d0.spaces.live.com/photos/cns!2FBFD926D50F54D0!124/
  • guav © (01.05.08 19:17) [37]
    В Transparent Components вроде вполне успешно решена прорисовка произвольного бэкграунда (там рисуется не просто фон, а то что д.б. сзади)
    http://www.torry.net/quicksearchd.php?String=Transparent+Components&Title=Yes
  • Игорь Шевченко © (01.05.08 19:55) [38]
    guav ©   (01.05.08 19:17) [37]

    Интересно. Правда изображение мелькает со страшной силой, что неудивительно, у них по каждому поводу invalidate стоит.
    И некорректно отрабатывает Ctl3d := false;
  • {RASkov} © (01.05.08 20:48) [39]
    > Получил, вот, скриншоты сделал с этими глюками:
    > http://img329.imageshack.us/img329/4867/errwa4.png

    Вот именно так и у меня получилось.... :(
    Причем если двигать окно с эдитом за край экрана и возвращать, то можно по полбукве отрисовывать)...
    Т.е. текст не весь сразу рендерится, а только инвалидная облась...
 
Конференция "Компоненты" » Требуется компонент - подобие TEdit [D7, WinXP]
Есть новые Нет новых   [134464   +62][b:0][p:0.003]