2010-02-16 6 views
3

'디버깅'목적으로 만 사용하므로 많은 시간을 소비하지 않으려 고하지 않으며 매우 중요하지 않습니다. 이 프로그램은 png, jpg, svg 등으로 데이터를 내 보냅니다. 이미지가 생성되는 동안 이미지를 보는 것이 좋을 수도 있지만 큰 문제는 아닙니다. 또한이 프로그램은 Linux 서버에서 사용됩니다. 하지만이 '기능'은 Windows 버전으로 제한됩니다.C++ Win32, 비트 맵을 사용하여 창을 표시하는 가장 쉬운 방법

매우 가볍다는 것을 제외하고는 라이브러리를 사용하고 싶지 않습니다 (잠시 CImg을 사용했지만 속도에 만족하지 않아서 중요한 기능을 작성했습니다. 직접 libjpeg와 libpng를 사용하는 것).

형식을 변환해도 전혀 문제가되지 않지만 ARGB 형식 (32bpp)의 이미지가 있습니다. Win32를 사용하여 코드 내부의 함수 (알려진 hInstance 등)에서 윈도우를 생성하고 비트 맵을 작성하고 싶습니다. 빠르고 쉽고, 잘하면.

그러나 저는 win32api를 충분히 모릅니다. (GDI)를 그릴 수있는 유일한 옵션은 HBITMAP 객체의 물결입니다 ... 어떤 코드 스 니펫이나 예제를 의지 할 수 있습니까? 간과하지 않을 것인가? 또는 어쩌면 - 내 시간 제약을 생각하면 - 그냥 잊어 버려야할까요?

감사합니다.

답변

4

여기서 가장 큰 작업은 실제로 창 클래스를 등록하고 최소 창 프로 시저를 작성하는 것입니다. 그러나이 코드 만 디버그하는 경우 실제로 해당 부분을 건너 뛸 수 있습니다. (나는 나중에 다시 돌아올 것이다).

당신은 HBITMAP있는 경우에, 당신은 그것을 그릴 BitBlt 또는 StretchBlt을 사용하지만, 이미 HBITMAP으로 이미지가없는 경우, 다음 StretchDIBits에만 경우 사용할 수 있기 때문에 더 나은 선택은 아마도 비트 맵 데이터에 대한 포인터가 있어야합니다. 원본 및 대상 사각형 인 BITMAPINFOHEADER과 원시 비트 맵 데이터에 대한 포인터를 전달해야합니다. 내가 그려 할 수있는 HDC를 얻는 방법이

SIZE sBmp = { 100, 200 }; 
LPBITMAPINFOHEADER pbi; // the bitmap header from the file, etc. 
LPVOID    pvBits; // the raw bitmap bits 

StretchDIBits (hdc, 0, 0, sBmp.cx, sBmp.cy, 
       0, 0, sBmp.cx, sBmp.cy, 
       pvBits, pbi, 
       DIB_RGB_COLORS, 
       SRCCOPY); 

같은 뭔가 그래서 다음 부분은? 디버그 코드는 종종 화면에 직접 그립니다. HDC hdc = GetDC(NULL)은 화면에 그릴 수있는 DC를 얻지 만 보안 문제가 있으며 Windows Vista의 Aero와 동일하게 작동하지 않으므로 다른 방법은 창에 그리는 것입니다. 그냥 그릴 수있는 창이 있으면 HDC hdc = GetDC (hwnd)가 작동합니다.

이런 식으로하는 것의 장점은 창을 만들어서 표시 할 필요가 없으므로 코드 흐름을 방해하지 않고 특정 문제를 디버깅하는 데 유용하지만 떠날 수있는 일은 아닙니다. 항상 켜져있다.

장기적인 솔루션의 경우 대화 상자를 만들고 비트 맵 그리기 호출을 대화 상자의 WM_PAINT 또는 WM_ERASEBKGND 메시지 처리기에 넣을 수 있습니다.그러나 UI를 수행하지 않아야하는 코드 내부의 대화 상자를 표시하는 것은 좋지 않습니다. 창, 특히 대화 상자 창을 표시하면 응용 프로그램의 정상적인 메시지 흐름을 방해합니다. 이 비트 맵 뷰어에 대한 대화 상자를 사용하려면 해당 대화 상자 창이 사용자가 표시하는 내용이되고 원하는 경우 표시되도록합니다.

HINSTANCE에 액세스 할 수 없다면 대화 상자를 표시 할 수 있습니다. 단지 더 많은 작업입니다. 그것은 일종의 다른 질문입니다.

+0

답장을 보내 주셔서 감사합니다. 글쎄, 실제로, Windows 7 에어로에서는 화면에 그려지면 화면에 나타나고 즉시 사라집니다. uxsms를 비활성화하면 더 잘 작동하지만 대화 상자 위에 그리는 것을 선호하므로 다른 질문에 대한 대답이 필요합니다. D. – huff

+0

@huff : 새로운 질문이어야합니다. "리소스가없는 간단한 대화 상자를 만드는 방법"과 같은 것입니다. –

+0

나는 그것을 할 것이다. 나는'CreateIndirect'로 자신의 탈출구를 추측하고 있습니다.하지만 여전히 질문을 여기에 올리는 것이 좋습니다. – huff

1

장치 컨텍스트 (HDC)에 대한 핸들 만 있으면됩니다. 데이터를 표시하려면 :

  1. DIBSection을 만드는 CreateDibSection.
  2. CreateDibSection에서 반환 한 메모리 블록에 데이터를 복사합니다.
  3. 대상 DC와 호환되는 DC를 만듭니다.
  4. 새로 만든 DC에 DIBSection을 선택하십시오.
  5. DC에서 대상 DC 로의 BitBlt (또는 StretchBlt).
+0

답장을 보내 주셔서 감사합니다. – huff

관련 문제