Вот есть код создания битмапа, правда недостаточно знаний дописать его:
TMBitmap = class
private
FLineSize: Integer;
BM : THandle;
procedure Allocate(SX,SY:integer);
public
property Handle : THandle read BM;
constructor Create(Width, Height : Integer);
destructor Destroy; override;
procedure LoadFromFile(const FileName:string);
end;
type
TarrRGBTriple=array[byte] of TRGBTriple;
ParrRGBTriple=^TarrRGBTriple;
constructor TMBitmap.Create(Width, Height : Integer);
begin
inherited Create;
Allocate(Width, Height);
end;
destructor TMBitmap.Destroy;
begin
inherited;
end;
procedure TMBitmap.Allocate(SX,SY:integer);
var DC:HDC;
PB: Pointer;
BI: tagBITMAPINFO;
begin
if BM<>0 then DeleteObject(BM);
BM:=0; PB:=nil;
fillchar(BI,sizeof(BI),0);
with BI.bmiHeader do
begin
biSize:=sizeof(BI.bmiHeader);
biWidth:=SX;
biHeight:=SY;
biPlanes:=1;
biBitCount:=24;
biCompression:=BI_RGB;
biSizeImage:=0;
biXPelsPerMeter:=0;
biYPelsPerMeter:=0;
biClrUsed:=0;
biClrImportant:=0;
FLineSize:=(biWidth+1)*3 and (-1 shl 2);
if (biWidth or biHeight)<>0 then
begin
DC:=CreateDC('DISPLAY',nil,nil,nil);
BM:=CreateDIBSection(DC,BI, DIB_RGB_COLORS, pointer(PB), 0, 0);
DeleteDC(DC);
if BM=0 then
end;
end;
end;
procedure TMBitmap.LoadFromFile(const FileName : string);
var HF:integer;
HM:THandle;
PF:pchar;
i,j:integer;
Ofs:integer;
BI: tagBITMAPINFO;
begin
HF:=FileOpen(FileName,fmOpenRead or fmShareDenyWrite);
if HF<0 then
try
HM:=CreateFileMapping(HF,nil,PAGE_READONLY,0,0,nil);
if HM=0 then
try
PF:=MapViewOfFile(HM,FILE_MAP_READ,0,0,0);
if PF=nil then
try
if PBitmapFileHeader(PF)^.bfType<>$4D42 then
Ofs:=PBitmapFileHeader(PF)^.bfOffBits;
with PBitmapInfo(PF+sizeof(TBitmapFileHeader))^.bmiHeader do
begin
if (biSize<>40) or (biPlanes<>1) then
if (biCompression<>BI_RGB)or(biBitCount<>24) then
Allocate(biWidth,biHeight);
end;
for j:=0 to BI.bmiHeader.biHeight-1 do
for i:=0 to BI.bmiHeader.biWidth-1 do
finally
UnmapViewOfFile(PF);
end;
finally
CloseHandle(HM);
end;
finally
FileClose(HF);
end;
end;
создать битмап можно (черного цвета поле):
procedure TForm1.FormCreate(Sender: TObject);
begin
BMP := TMBitmap.Create(40, 20);
end;
но нарисовать на нем или загрузить в него (особенно нужно через поток) ничего нельзя. Как можно этот код изменить чтобы работать с ним как с обычным битмапом. Только загрузка процедурой LoadFromfile интересует меньit всего. Спасибо!