Копирование изображения в C#.net
Столкнулся со следующей проблемой (а может быть и не проблемой вовсе): я создал компонент, прорисовка контента которого полностью реализована мной. Каким образом можно фрагмент изображения этого компонента скопировать (или сдвинуть) в другое место без перерисовки? Другими словами, мне нужно организовать скроллинг содержимого в окне компонента, т.е. изображение как бы сдвинуть на несколько пикселей вверх или вниз, а освободившееся пространство уже зарисовать "новой" инфой. Понятно, что можно организовать перерисовку всего содержимого, но есть ли более эффективный способ?
К примеру, в Builder есть замечательный метод для этого TCanvas->CopyRect(TRect SrcRect, TRect DestRect, TCanvas DestCanvas) - могу ошибаться в последовательности параметров, но это сейчас не суть. Так если ли что-нибудь подобное в C#.NET?
Заранее спасибо ;)
[DllImport(gdi32, EntryPoint = 'StretchBlt')]
function StretchBlt;
Вот её описание в MSDN:
StretchBlt
The StretchBlt function copies a bitmap from a source rectangle into a destination rectangle, stretching or compressing the bitmap to fit the dimensions of the destination rectangle, if necessary. The system stretches or compresses the bitmap according to the stretching mode currently set in the destination device context.
BOOL StretchBlt(
HDC hdcDest, // handle to destination DC
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
DWORD dwRop // raster operation code
);
И всё же - есть ли подобная функция не в виндовой API, а в самом FrameWork?
Цитата:
Originally posted by OverseeR
[DllImport(gdi32, EntryPoint = 'StretchBlt')]
function StretchBlt;
[DllImport(gdi32, EntryPoint = 'StretchBlt')]
function StretchBlt;
Хм, так CopyRect и есть VCL-обертка над StretchBlt...
Цитата:
Originally posted by smartsoft
Хм, так CopyRect и есть VCL-обертка над StretchBlt...
Хм, так CopyRect и есть VCL-обертка над StretchBlt...
Хех, да, действительно - полез в исходники VCL, и впрямь CopyRect реализован через эту APIшную ф-цию. И всё же - есть ли другой способ, в классах FrameWork? API не хотелось бы применять, т.к. утрачивается кроссплатформенность...
Цитата:
Originally posted by OverseeR
Хех, да, действительно - полез в исходники VCL, и впрямь CopyRect реализован через эту APIшную ф-цию. И всё же - есть ли другой способ, в классах FrameWork? API не хотелось бы применять, т.к. утрачивается кроссплатформенность...
Хех, да, действительно - полез в исходники VCL, и впрямь CopyRect реализован через эту APIшную ф-цию. И всё же - есть ли другой способ, в классах FrameWork? API не хотелось бы применять, т.к. утрачивается кроссплатформенность...
рисуешь через контекст Graphics, я подозреваю?
Если так, то, имхо, надо копать в направлении методов Graphics. Есть объект Image, создаешь свой Graphics, а там что-нибудь через Graphics.DrawImage(Image, PointF);
.