首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC图片显示有关问题

2012-04-14 
MFC图片显示问题#includewindows.h#includeresource.hLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPA

MFC图片显示问题
#include<windows.h>
#include"resource.h"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
  MSG Msg;
  WNDCLASS wndclass;
  char lpszClassName[]="图片窗口";
  wndclass.style = 0;
  wndclass.lpfnWndProc = WndProc;
  wndclass.cbClsExtra = 0;
  wndclass.cbWndExtra = 0;
  wndclass.hInstance = hInstance;
  wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
  wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  wndclass.lpszMenuName = NULL;
  wndclass.lpszClassName = lpszClassName;
  //窗口初始化完成

  //窗口注册
  if(!RegisterClass(&wndclass))
  {
  return FALSE;
  }
  //注册完成

  //窗口创建
  HWND hwnd;
  char lpszTitle[] = "图片显示";
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  hbm=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
 //hbm未定义? 怎么查看使用hbm这个变量 这个变量的类型是什么? 应该定义在代码的什么位置?
/////////////////////////////////////////////////////////////////////////////
  hwnd=CreateWindow(
lpszClassName, 
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
  //窗口创建完成
  ShowWindow(hwnd,nCmdShow);
  UpdateWindow(hwnd);
  //窗口显示完成

  //消息循环
  while(GetMessage(&Msg,NULL,0,0))
  {
  TranslateMessage(&Msg);
DispatchMessage(&Msg);
  }
  return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
 HDC hdc,hdmem; 
 switch(message)
 {
  case WM_CREATE:
hdc=GetDC(hwnd);
hdmem=CreateCompatibleDC(hdc);
ReleaseDC(hwnd,hdc);
break;
   
  case WM_PAINT:
hdc=::BeginPaint(hwnd,&ps);
  //////////////////////////////////////////////////////////////////////////////////
  ///hbm在上面定以后为什么 在这里会显示这个hbm未定义?
SelectObject(hdmem,hbm);
  ///////////////////////////////////////////////////////////////////////////////////
  ///bm是什么类型的变量 该怎么初始化他,如何从图片获得数据?
BitBlt(hdc,20,20,bm.bmWidth,bm.bmHeight,hdmem,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
break;
  case WM_DESTROY:
PostQuitMessage(0);
break;
  default:
return DefWindowProc(hwnd,message,wParam,lParam);
 }
 return 0;
}

一下是运行结果及报错








[解决办法]
HBITMAP LoadBitmap(
HINSTANCE hInstance, 
LPCTSTR lpBitmapName
); 
所以是HBITMAP类型
[解决办法]
HBITMAP hbm;
BITMAP bm;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
//
GetObject(hbm, sizeof(BITMAP), (LPSTR)&bm); 

[解决办法]
可以放函数内。有个问题是如果函数2次调用间这个变量要保持上次值那么要加static如:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hbm;
。。。

热点排行