procedure THiImageLoader.Stretch;
var memDC: HDC;
bm: HBITMAP;
begin
memDC := CreateCompatibleDC(DC);
bm := CreateCompatibleBitmap(DC, w1-x1, h1-y1);
SelectObject(memDC, bm);
FImgCtx.StretchBlt(memDC, 0,0,w1-x1,h1-y1,x3,y3,w3,h3, SRCCOPY);
BitBlt(DC, x1, y1, w1-x1, h1-y1, memDC, 0,0, SRCCOPY);
DeleteDC(memDC);
DeleteObject(bm);
// FImgCtx.StretchBlt(DC, x1,y1,w1,h1,x3,y3,w3,h3, SRCCOPY);
end;
А вот пример для проверки
#sha
Add(Button,16323980,329,364)
{
Left=315
Top=385
Width=70
Height=25
TabOrder=-1
Caption="Draw"
Data=String()
link(onClick,16422065:doWork3,[(431,370)])
}
Add(MainForm,11367671,476,231)
{
Left=20
Top=105
Width=416
Height=452
Ctl3D=0
Caption="ImageLoader -- BMP, GIF, JPG, JPEG, ICO, WMF, EMF, PNG, XBM, TIFF"
BorderStyle=4
Position=1
Point(onResize)
}
Add(Button,12242450,161,315)
{
Left=315
Top=355
Width=70
Height=25
TabOrder=-1
Caption="Load File"
link(onClick,1527495:doEvent1,[])
}
Add(ODialog,6607378,273,322)
{
Filter="BMP, GIF, JPG, JPEG, ICO, WMF, EMF, PNG, XBM, TIFF files (*.bmp;*.gif;*.ico;*wmf;*.emf;*.xbm;*.tiff;*.png;*.jpg;*.jpeg)|.bmp;*.gif;*.ico;*wmf;*.emf;*.xbm;*.tiff;*.png;*.jpg;*.jpeg|All files (*.*)|*.*"
StartDir=""
FileName=""
link(onExecute,3684329:doEvent1,[])
}
Add(Image,5070384,476,273)
{
@Hint=#2:10|
Left=5
Top=5
Width=400
Height=300
Color=16777215
TabOrder=-1
ViewStyle=1
Point(Handle)
Point(Width)
Point(Height)
Point(doRefresh)
}
Add(ImageLoader,1836674,476,329)
{
ScaleMode=1
DrawSource=1
Point2AsOffset=0
Point(Point3)
Point(Point4)
link(onLoad,16422065:doWork2,[(522,335)(522,313)(415,313)(415,342)])
link(Bitmap,5070384:Handle,[])
link(Point4,10680386:Point,[(503,317)(524,317)])
}
Add(Repeat,5895942,476,378)
{
Op1=Integer(1)
link(onRepeat,5295562:doProcessMessages,[])
link(Op1,1836674:Busy,[])
}
Add(Application,5295562,539,378)
{
Wait=1
}
Add(Hub,1527495,217,315)
{
link(onEvent1,5070384:doClear,[(272,321)(272,286)])
link(onEvent2,6607378:doExecute,[])
}
Add(Hub,3684329,329,322)
{
link(onEvent1,1836674:doLoad,[(383,328)(383,335)])
link(onEvent2,5895942:doRepeat,[(383,335)(383,384)])
}
Add(PointXY,10680386,518,273)
{
X=639
Y=479
}
Add(HubEx,16422065,427,329)
{
link(onEvent,1836674:doDraw,[])
}
Если загрузить картинку до исправления и понажимать подряд несколько раз на кнопку Draw, то будут заметны мерцания. После исправления, у меня мерцания исчезли напрочь, сколько не жал. Но есть один недостаток -- такой метод сильно порожорлив до памяти.