-
-
> 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;
-
{RASkov}, ага, нашел уже, спасибо!
Игорь Шевченко, В моем GraphUtils нет такого метода
-
{RASkov} © (01.05.08 13:56) [18]
> Красиво, но при вводе текст перед курсором пропадает, от > него остается только одна буква. > TextInEdit - текст находится в эдите > t|InEdit - при редактировании > | - курсор. > [D7, WinXP]
Не смог воспроизвести. D2006, WinXP, без тем
Если не трудно, дай последовательность шагов для воспроизведения, а то я собираюсь кусок с градиентной заливкой в свой Edit вставлять и хотелось бы сразу наступить на возможные грабли.
-
> В моем 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;
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.
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_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.
-
Некоторые глюки вылазиют зависимо от того, включен-ли манифест в проект, а не от того, включены ли темы XP
-
Игорь Шевченко, глюки такие: сразу как запускается форма и фокус попадает в окно эдита - курсор ставится в конец, но текста не видно. если кликнуть или выделить текст, то последний начинает отображаться
если набирать текст, и он не влезает в окошко, то при сдвиге вправо, часть текста слева пропадает до следующей перерисовки едита
-
R1ka © (01.05.08 14:26) [26]
у тебя edit или memo ?
C memo такие явления наблюдаются, с edit не могу воспроизвести. Манифестов и тем у меня нету.
-
Я ваш код взял => TEdit
-
> [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
-
> [23] Игорь Шевченко © (01.05.08 14:18)
У нас одно только различие D7 vs D2006
-
Поставил стандартную тему XP - все вводится, ничего не пропадает, скроллинг нормальный.
XPManifest в uses нету.
-
А можно скомпиленый exe? Может не только в делфи дело?
-
> [31] Игорь Шевченко © (01.05.08 15:04) > все вводится, ничего не пропадает, скроллинг нормальный.
Значит везет не всем :)
-
> А можно скомпиленый exe?
можно. на адрес в посте отправлен архив с ......@hotmail.com с темой "Edit with gradient fill"
-
-
-
-
guav © (01.05.08 19:17) [37]
Интересно. Правда изображение мелькает со страшной силой, что неудивительно, у них по каждому поводу invalidate стоит. И некорректно отрабатывает Ctl3d := false;
-
> Получил, вот, скриншоты сделал с этими глюками: > http://img329.imageshack.us/img329/4867/errwa4.png
Вот именно так и у меня получилось.... :( Причем если двигать окно с эдитом за край экрана и возвращать, то можно по полбукве отрисовывать)... Т.е. текст не весь сразу рендерится, а только инвалидная облась...
|