《windows程序设计》有关位图在客户区显示的疑问
看到第五章位图那里,有一个程序是在客户区显示自定义的位图,我程序代码按照它的要求写了,可是运行出来,就是看不到位图,不知道怎么回事,请大家帮我看下,程序如下我只贴窗口函数...
看到第五章位图那里,有一个程序是在客户区显示自定义的位图,我程序代码按照它的要求写了,可是运行出来,就是看不到位图,不知道怎么回事,请大家帮我看下,程序如下
我只贴窗口函数中的代码:
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HBITMAP hBitmap;
BITMAP bitmap;
static cxClient,cyClient,cxSource,cySource;
int i,j;
PAINTSTRUCT ps;
HDC hdc,hMemDc;
HINSTANCE hInstance;
switch(message)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hBitmap=LoadBitmap(hInstance,TEXT("IDB_BITMAP1"));
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
cxSource=bitmap.bmWidth;
cySource=bitmap.bmHeight;
return 0;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hMemDc=CreateCompatibleDC(hdc);
SelectObject(hMemDc,hBitmap);
for(i=0;i<cxClient;i+=cxSource)
{
for(j=0;j<cyClient;j+=cySource)
{
BitBlt(hdc,i,j,cxSource,cySource,hMemDc,0,0,SRCCOPY);
}
}
DeleteDC(hMemDc);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
} 展开
我只贴窗口函数中的代码:
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HBITMAP hBitmap;
BITMAP bitmap;
static cxClient,cyClient,cxSource,cySource;
int i,j;
PAINTSTRUCT ps;
HDC hdc,hMemDc;
HINSTANCE hInstance;
switch(message)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hBitmap=LoadBitmap(hInstance,TEXT("IDB_BITMAP1"));
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
cxSource=bitmap.bmWidth;
cySource=bitmap.bmHeight;
return 0;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hMemDc=CreateCompatibleDC(hdc);
SelectObject(hMemDc,hBitmap);
for(i=0;i<cxClient;i+=cxSource)
{
for(j=0;j<cyClient;j+=cySource)
{
BitBlt(hdc,i,j,cxSource,cySource,hMemDc,0,0,SRCCOPY);
}
}
DeleteDC(hMemDc);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
} 展开
2个回答
展开全部
for(i=0;i<cxClient;i+=cxSource)
{
for(j=0;j<cyClient;j+=cySource)
{
BitBlt(hdc,i,j,cxSource,cySource,hMemDc,0,0,SRCCOPY);
}
}
上面这段换成下面代码试试:
BitBlt(hdc,0,0,cxSource,cySource,hMemDc,0,0,SRCCOPY);
若还看不到位图,那就检查位图是否有效地加载了
{
for(j=0;j<cyClient;j+=cySource)
{
BitBlt(hdc,i,j,cxSource,cySource,hMemDc,0,0,SRCCOPY);
}
}
上面这段换成下面代码试试:
BitBlt(hdc,0,0,cxSource,cySource,hMemDc,0,0,SRCCOPY);
若还看不到位图,那就检查位图是否有效地加载了
追问
我试了下,还是看不到位图,是不是有效加载怎么判断呢? 我是建立一个资源文件然后在里面插入一幅位图然后导入这样来做的。
追答
hBitmap这个句柄所指向的内存区是否有了位图数据,没有就是位图数据没有加载,有了就是刷新的问题或者说是响应WM_PAINT消息的代码有问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询