Для градусника, создай две картинки: одну под именем empty.jpg - это "пустой" градусник, другую - filled.jpg - это заполненный градусник. Теперь воспользуйся приведенным ниже кодом.
Type TFillProgressMode=(fpVertical,fpHorizontal);
procedure FillProgress(Img:TImage;BmpFill,BmpEmpty:TBitmap;Min,Progress,Max:integer;Mode:TFillProgressMode=fpVertical);
var MemDC,ComBit:cardinal;
Bnd:integer;
begin
if(BmpFill.Height<>BmpEmpty.Height)or(BmpFill.Width<>BmpEmpty.Width)then raise Exception.Create('Invalid dimensions');
MemDC:=CreateCompatibleDC(Img.Canvas.Handle);
ComBit:=CreateCompatibleBitmap(Img.Canvas.Handle,BmpFill.Width,BmpFill.Height);
SelectObject(MemDC,ComBit);
if Mode=fpVertical then begin
Bnd:=MulDiv(BmpFill.Height,Max-Progress,Max-Min);
BitBlt(MemDC,0,0,BmpFill.Width,Bnd,BmpEmpty.Canvas.Handle,0,0,SRCCOPY);
BitBlt(MemDC,0,Bnd,BmpFill.Width,BmpFill.Height-Bnd,BmpFill.Canvas.Handle,0,Bnd,SRCCOPY);
end else begin
Bnd:=MulDiv(BmpFill.Width,Progress-Min,Max-Min);
BitBlt(MemDC,0,0,Bnd,BmpFill.Height,BmpFill.Canvas.Handle,0,0,SRCCOPY);
BitBlt(MemDC,Bnd,0,BmpFill.Width-Bnd,BmpFill.Height,BmpEmpty.Canvas.Handle,Bnd,0,SRCCOPY);
end;
StretchBlt(Img.Canvas.Handle,0,0,Img.Width,Img.Height,MemDC,0,0,BmpFill.Width,BmpFill.Height,SRCCOPY);
DeleteObject(ComBit);
DeleteDC(MemDC);
end;
procedure TForm1.Button1Click(Sender: TObject);
var Jpg:TJpegImage;
BmpFill,BmpEmpty:TBitmap;
I:integer;
begin
(Sender as TButton).Enabled:=false;
Jpg:=TJpegImage.Create;
Jpg.LoadFromFile('empty.jpg');
BmpEmpty:=TBitmap.Create;
BmpEmpty.Assign(Jpg);
Jpg.LoadFromFile('filled.jpg');
BmpFill:=TBitmap.Create;
BmpFill.Assign(Jpg);
Jpg.Free;
For I:=0 to 100 do begin
FillProgress(Image1,BmpFill,BmpEmpty,0,I,100,fpHorizontal);
InvalidateRect(Handle,nil,false);
Application.ProcessMessages;
Sleep(50);
end;
For I:=0 to 100 do begin
FillProgress(Image1,BmpFill,BmpEmpty,0,I,100,fpVertical);
InvalidateRect(Handle,nil,false);
Application.ProcessMessages;
Sleep(50);
end;
BmpEmpty.Free;
BmpFill.Free;
(Sender as TButton).Enabled:=true;
end;
Не забудь uses Jpeg; Если оформишь этот код в компонент, не забудь выложить. Другим это тоже может быть интересно. Для эксплуатации, положи на форму кнопку Button1 и Image1. |