반응형
실시간 그래프 컨트롤을 새로 제작 하는 도중 이미지 연산이 많아 다른 방법을 생각 할 수밖에 없었다.
다음과 같은 2가지 방법이 있겠다.
1. 새로운 데이터 삽입 시 이전 데이터들을 앞으로 당겨주고 새로운 데이터 삽입 -> 데이터가 많을 수록 무수한 연산 실행
2. 현재 이미지 자체를 앞으로 한칸 당겨 그린다. -> 이미지를 redraw하는 몇번의 연산만 수행
결국 2번 으로 가야 했다.
하지만 문제 발생...
1. DrawImage의 오버로딩중에 (Image, destRect, sourceRect, GraphUnit.Pixcel) -> 요 함수로 자기 자신의 영역을 옮기지 못한다. C++에서는 bitblt로 같은 문제를 해결 할 수 있다. (자신의 이미지도 가능)
기본적으로 C#에서는 bitblt 함수를 쓸 수 없기 때문에 다음과 같이 gdi32.dll에서 import 해서 사용하는 수밖에 없다.
public enum BITBLT
{
SRCCOPY = 0x00CC0020, /* dest = source*/
SRCPAINT = 0x00EE0086, /* dest = source OR dest*/
SRCAND = 0x008800C6, /* dest = source AND dest*/
SRCINVERT = 0x00660046, /* dest = source XOR dest*/
SRCERASE = 0x00440328, /* dest = source AND (NOT dest )*/
NOTSRCCOPY = 0x00330008, /* dest = (NOT source)*/
NOTSRCERASE = 0x001100A6, /* dest = (NOT src) AND (NOT dest) */
MERGECOPY = 0x00C000CA, /* dest = (source AND pattern)*/
MERGEPAINT = 0x00BB0226, /* dest = (NOT source) OR dest*/
PATCOPY = 0x00F00021, /* dest = pattern*/
PATPAINT = 0x00FB0A09, /* dest = DPSnoo*/
PATINVERT = 0x005A0049, /* dest = pattern XOR dest*/
DSTINVERT = 0x00550009, /* dest = (NOT dest)*/
BLACKNESS = 0x00000042, /* dest = BLACK*/
WHITENESS = 0x00FF0062, /* dest = WHITE*/
};
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern int BitBlt(
IntPtr hdcDest, // handle to destination DC (device context)
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
IntPtr hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
System.Int32 dwRop // raster operation code
);
하지만 요 bitblt를 사용하는 방법으로도 해결 되지 않았다. 기껏 해봤드니 왠지 모르겠지만 memoryBitmap의 영역을 그린 부분은 검은색으로 나오는 현상 =_= 왤까...
결국 다음과 같은 방법으로 해결
DrawImage(Image, destRect, sourceRect, GraphUnit.Pixcel) 를 사용 하되,
TempBitmap을 활용한다.
이동할 메모리비트맵의 이미지 -> temp공간에 그림 -> 다시 이동하고자 하는 메모리비트맵에 그림
생각해보면 그리 어려운 짓은 아닌데..-_-;; 몰랐써용
다음과 같은 2가지 방법이 있겠다.
1. 새로운 데이터 삽입 시 이전 데이터들을 앞으로 당겨주고 새로운 데이터 삽입 -> 데이터가 많을 수록 무수한 연산 실행
2. 현재 이미지 자체를 앞으로 한칸 당겨 그린다. -> 이미지를 redraw하는 몇번의 연산만 수행
결국 2번 으로 가야 했다.
하지만 문제 발생...
1. DrawImage의 오버로딩중에 (Image, destRect, sourceRect, GraphUnit.Pixcel) -> 요 함수로 자기 자신의 영역을 옮기지 못한다. C++에서는 bitblt로 같은 문제를 해결 할 수 있다. (자신의 이미지도 가능)
기본적으로 C#에서는 bitblt 함수를 쓸 수 없기 때문에 다음과 같이 gdi32.dll에서 import 해서 사용하는 수밖에 없다.
public enum BITBLT
{
SRCCOPY = 0x00CC0020, /* dest = source*/
SRCPAINT = 0x00EE0086, /* dest = source OR dest*/
SRCAND = 0x008800C6, /* dest = source AND dest*/
SRCINVERT = 0x00660046, /* dest = source XOR dest*/
SRCERASE = 0x00440328, /* dest = source AND (NOT dest )*/
NOTSRCCOPY = 0x00330008, /* dest = (NOT source)*/
NOTSRCERASE = 0x001100A6, /* dest = (NOT src) AND (NOT dest) */
MERGECOPY = 0x00C000CA, /* dest = (source AND pattern)*/
MERGEPAINT = 0x00BB0226, /* dest = (NOT source) OR dest*/
PATCOPY = 0x00F00021, /* dest = pattern*/
PATPAINT = 0x00FB0A09, /* dest = DPSnoo*/
PATINVERT = 0x005A0049, /* dest = pattern XOR dest*/
DSTINVERT = 0x00550009, /* dest = (NOT dest)*/
BLACKNESS = 0x00000042, /* dest = BLACK*/
WHITENESS = 0x00FF0062, /* dest = WHITE*/
};
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern int BitBlt(
IntPtr hdcDest, // handle to destination DC (device context)
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
IntPtr hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
System.Int32 dwRop // raster operation code
);
하지만 요 bitblt를 사용하는 방법으로도 해결 되지 않았다. 기껏 해봤드니 왠지 모르겠지만 memoryBitmap의 영역을 그린 부분은 검은색으로 나오는 현상 =_= 왤까...
결국 다음과 같은 방법으로 해결
DrawImage(Image, destRect, sourceRect, GraphUnit.Pixcel) 를 사용 하되,
TempBitmap을 활용한다.
이동할 메모리비트맵의 이미지 -> temp공간에 그림 -> 다시 이동하고자 하는 메모리비트맵에 그림
생각해보면 그리 어려운 짓은 아닌데..-_-;; 몰랐써용
반응형
'프로그래밍' 카테고리의 다른 글
[C#] 초간단 성능테스트 하기 (0) | 2011.01.20 |
---|---|
[C#] ?? 연산자(물음표 두개) (0) | 2011.01.19 |
[C#] 초간단 캡쳐 함수 (0) | 2011.01.11 |
[C# 꽁짜 책] 무료 기술 서적 - Inside C# (한글 번역본) (0) | 2011.01.05 |
여러개의 ROW를 한줄로 구성하는 방법 (0) | 2010.10.27 |
댓글