...왜 다음 코드가 작동하지 않습니까? 내 프로그램의 곳에서 나는 다음과 같은 스타일을 사용하여 정적 컨트롤을 만들었습니다
picBoxDisp = CreateWindow("STATIC", "image box",
WS_VISIBLE |WS_CHILD | SS_BITMAP |WS_TABSTOP | WS_BORDER,
50, 50, 250, 300,
hwnd , (HMENU)10000, NULL, NULL);
SetWindowLongPtr(picBoxDisp,GWLP_WNDPROC,(LONG) dispWndProc);
는 다음 코드 ..
SendMessage(picBoxDisp,STM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM) hBitmap);
이제 dispWndProc 내부에서 나는 다음과 같은 코드가 있습니다. lParam에 다시 HBITMAP에 캐스트 나던 왜 IMG가 NULL 이유.
LRESULT CALLBACK dispWndProc(HWND hwnd,UINT msg, WPARAM wParam, LPARAM lParam)
{
static HDC hdc;
static PAINTSTRUCT paintSt;
static RECT aRect;
switch(msg)
{
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&paintSt);
GetClientRect(hwnd,&aRect);
// the code for painting
EndPaint(hwnd,&paintSt);
}
break;
case STM_SETIMAGE:
{
//painting code;
HBITMAP img = (HBITMAP)lParam;
BITMAP bmp;
GetObject(img,sizeof(bmp),&bmp);
HDC imgDC = GetDC((HWND)img);
HDC memDC = CreateCompatibleDC(imgDC);
SelectObject(memDC,img);
if((img==NULL))// ||(imgDC==NULL)||(memDC==NULL))
{
MessageBox(NULL,"img is NULL","Bad Programming!!! Error",MB_OK);
}
else
{
StretchBlt(hdc,0,0,aRect.right,aRect.bottom,
memDC,0,0,bmp.bmWidth,bmp.bmHeight,
SRCCOPY);
}
}
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}
는 사람이 .... 알 수 있습니까? 사전에
덕분에,
왜 자신의 클래스를 만드는 대신 정적 컨트롤을 서브 클래스로 만드나요? 일반적으로 기존 기능 중 일부를 사용하고 사용자 지정하려는 경우가 아니면 다른 컨트롤을 하위 클래스로 만들지 않습니다. STM_SETIMAGE에서 페인팅 코드를 수행하는 것은 이상합니다. 일반적으로 비트 맵 핸들을 저장하고 InvalidateRect를 호출 한 다음 WM_PAINT에서 모두 페인팅합니다. 또한; SetWindowLongPtr에서 LONG_PTR로 캐스트하고 LONG으로 캐스트하지 않습니다. LONG으로 형변환하면 win64 용으로 컴파일 할 때이 코드가 실패 할 수 있습니다. – BrendanMcK