2012-04-05 8 views
3

윈도우의 내용 영역에 문자 버퍼를 렌더링하는 방법을 찾고 있습니다.Windows의 화면 버퍼 렌더링

char buffer[300][200][3]; // 300px x 200px x RGB bytes 
// ... render stuff into buffer 
FancyWindowsFunctionToRenderBufferOnWindow(my_hwnd, buffer, 300, 200, offset_x, offset_y); 

비슷한 일을 할 수있는 방법이 있나요 : 이것은 단지 의사하지만 실제로 수행 할 작업을 설명하기위한 것입니까?

+1

이 질문은 매우 광범위합니다. 아마도 [winapi DrawText] (http://stackoverflow.com/search?q= [winapi] + drawtext)를 원하십니까? –

+0

자신의 창이나 다른 프로그램의 창에 텍스트를 그리는 중입니까? – chris

+0

@ Jesse, chris 어떻게하면 창문에 텍스트를 그려야한다는 결론에 도달 했습니까? ^^ –

답변

6

장치 독립적 비트 맵 (DIB)을 만들어야한다고 생각합니다. 응용 프로그램 창에 넣을 준비가 된 픽셀 배열이 이미있는 경우 전체 배열을 CreateDIBSection API에 의해 할당 된 버퍼로 복사하고 BitBlt를 호출하여 DIB를 창에 전송해야 할 수 있습니다. 이것은 Win32 플랫폼의 컴퓨터 화면에 보이는 그림처럼 단순한 픽셀 배열을 표시하는 유일한 방법이며 매우 복잡하고 이해하기 어렵습니다. 여기

내가 당신이 원하는 무엇을 비슷한 일을 테스트하기 위해 수행하는 데 사용되는 단계는 다음과 같습니다

만들기 DIB :

BITMAPINFO bmi; 
memset(&bmi, 0, sizeof(bmi)); 
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmi.bmiHeader.biWidth = /* Width of your image buffer */ 
bmi.bmiHeader.biHeight = - /* Height of your image buffer */ 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biBitCount = 32; 
bmi.bmiHeader.biCompression = BI_RGB; 

HDC hDesktopDC = GetDC(GetDesktopWindow()); 
HBITMAP hDib = CreateDIBSection(hDesktopDC, &bmi, DIB_RGB_COLORS, (void **)&buffer, 0, 0); 
if (buffer == NULL) { /* ERROR */ } 
HDC hDibDC = CreateCompatibleDC(hDesktopDC); 
HGDIOBJ hOldObj = SelectObject(hDibDC, hDib); 

/* Copy your array of pixels to buffer allocated above. */ 

ReleaseDC(GetDesktopWindow(), hDesktopDC); 

구현 WM_PAINT 이벤트 핸들러 (HWND를 변수는 창 아래 처리 보유) :

위의 코드 스 니펫이 직접 도움이 될 것으로 기대하지 않습니다. 위의 스 니펫에서와 같은 GDI 함수를 사용하기로 결정했다면 MSDN에서 API 문서를주의 깊게 읽는 것이 좋습니다. API를 사용하는 동안 획득 한 DC 또는 GDI 개체를 적절하게 해제하거나 삭제하는 것은 매우 까다로운 작업이기 때문입니다.

5

이미지 배열 (래스터)이 문자 배열로 저장되어있는 것처럼 들립니다. (원시 비트 맵 이미지에 부호없는 문자 배열이 필요하기 때문에 이상한 선택입니다.)

특정 정렬 제약 조건을 충족하는 경우 SetDIBits으로 직접 비트 맵을 표시 할 수 있습니다. 픽셀 형식 및 이미지 크기를 설명하는 BITMAPINFO 구조를 채운 다음 데이터와 함께 SetDIBits에 전달합니다. DC에 페인트 칠하겠습니다. 모든 매개 변수를 올바르게 처리하는 것은 약간 까다로울 수 있습니다.

정렬 요구 사항은 각 스캔 라인이 4 바이트 경계에서 시작해야한다는 것입니다. 그 요구 사항을 충족시키지 못하면 잘못된 보폭을 갖는 것과 비슷한 쓰레기가 나옵니다. 필요한 경우 올바른 정렬로 데이터 복사본을 만들 수 있습니다.

+0

감사합니다. 맞습니다. 보통 RGB 값에'unsigned char'을 사용합니다. 질문을 쓰는 동안 기억하지 못했습니다. –

관련 문제