C++ 为什么两个图像在同一方法中表现不同?

C++ 为什么两个图像在同一方法中表现不同?,c++,image,C++,Image,我使用本文在VisualStudio2010中创建了win32应用程序 . 之后,我将一个cpp文件添加到这个项目中,并粘贴从图形教程中获得的代码片段。该代码如下所示 要编译此解决方案,我必须将字符集更改为在项目属性中使用多字节字符集 之后,我在项目文件夹中插入了一张名为truck.bmp的图片 当我用这张照片的时候 它给出了这个错误消息 未加载位图-确保项目文件夹中存在文件“truck.bmp” 因为hbitmap根据程序是空的 但是当我用这张照片的时候 它装载正确。程序使用LoadIma

我使用本文在VisualStudio2010中创建了win32应用程序 . 之后,我将一个cpp文件添加到这个项目中,并粘贴从图形教程中获得的代码片段。该代码如下所示

要编译此解决方案,我必须将字符集更改为在项目属性中使用多字节字符集

之后,我在项目文件夹中插入了一张名为truck.bmp的图片

当我用这张照片的时候

它给出了这个错误消息

未加载位图-确保项目文件夹中存在文件“truck.bmp” 因为hbitmap根据程序是空的

但是当我用这张照片的时候

它装载正确。程序使用LoadImage函数加载图像

我不明白为什么这两张图片在相同的功能下表现不同。有人能解释一下原因吗。对不起,我问题中的图像太大了

/* to demonstrate loading and displaying of bitmaps */
  #include < windows.h >
  LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsgId, WPARAM wParam,
                        LPARAM lParam);

  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nCmdShow)
{
static char name[]="Bitmap Display";

HWND hWnd;
MSG msg;
WNDCLASS wndClass;
wndClass.style=0;
wndClass.lpfnWndProc=WindowProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor=LoadCursor(NULL, IDC_ARROW);
wndClass.hInstance=hInstance;
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=name;

if(RegisterClass(&wndClass) == 0)
{
   MessageBox(0, "The Window is not registered", "Message", MB_OK);
   return 0;
}

    hWnd=CreateWindow(name, name, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,         CW_USEDEFAULT,  CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

if(hWnd==0)
{
   return 0;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg, NULL, 0, 0))
{
   TranslateMessage(&msg);
   DispatchMessage(&msg);
 }
 msg.wParam;
  }

   LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsgId, WPARAM wParam, LPARAM lParam)
 {
HBITMAP hbitmap;
BITMAP bitmap;
HDC hdc, hmemdc;

switch(uMsgId)
{
case WM_PAINT:
 PAINTSTRUCT paintStruct;
 hdc= BeginPaint(hWnd, &paintStruct);

 /* loading the bitmap from a BMP file (ensure the file is present under the    project folder) */
 hbitmap= (HBITMAP)LoadImage(NULL, "truck.bmp",IMAGE_BITMAP, 0,0, LR_LOADFROMFILE    );

 if(hbitmap == NULL)
 {
    MessageBox(NULL, "Bitmap not loaded- Ensure the file 'truck.bmp' is present in the project folder","Error",MB_OK);
 }

 hmemdc= CreateCompatibleDC(hdc);
 SelectObject(hmemdc, hbitmap);
 GetObject(hbitmap, sizeof(BITMAP), &bitmap);

 /* displaying the bitmap at certain x,y position on the window client area */
 BitBlt(hdc, 0, 0, bitmap.bmWidth,bitmap.bmHeight, hmemdc,0,0, SRCCOPY);

 /* displaying the bitmap with scaled dimensions at certain x,y position on the window client area */
 StretchBlt(hdc, bitmap.bmWidth+5, 0, bitmap.bmWidth*2,bitmap.bmHeight*2,  hmemdc,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

 DeleteDC(hmemdc);
 DeleteObject(hbitmap);
 EndPaint(hWnd, &paintStruct);
 return 0;

case WM_DESTROY:
 PostQuitMessage(0);
 return 0;
default:
 return DefWindowProc(hWnd, uMsgId, wParam, lParam);
}
  }
/*演示位图的加载和显示*/
#包括
LRESULT回调WindowProc(HWND HWND,UINT uMsgId,WPARAM WPARAM,
LPARAM(LPARAM);
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、,
LPSTR lpCmdLine,int nCmdShow)
{
静态字符名称[]=“位图显示”;
HWND-HWND;
味精;
WNDCLASS WNDCLASS;
wndClass.style=0;
wndClass.lpfnWndProc=WindowProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground=(HBRUSH)GetStockObject(灰色画笔);
wndClass.hIcon=LoadIcon(空,IDI_应用程序);
wndClass.hCursor=LoadCursor(空,IDC_箭头);
wndClass.hInstance=hInstance;
wndClass.lpszMenuame=NULL;
wndClass.lpszClassName=名称;
if(RegisterClass(&wndClass)==0)
{
MessageBox(0,“窗口未注册”,“消息”,MB_OK);
返回0;
}
hWnd=CreateWindow(名称、名称、WS_重叠窗口、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、NULL、NULL、hInstance、NULL);
如果(hWnd==0)
{
返回0;
}
显示窗口(hWnd、nCmdShow);
更新窗口(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
msg.wParam;
}
LRESULT回调WindowProc(HWND-HWND、UINT-uMsgId、WPARAM-WPARAM、LPARAM-LPARAM)
{
HBITMAP HBITMAP;
位图;
HDC-HDC,hmemdc;
交换机(uMsgId)
{
案例WM_油漆:
PAINTSTRUCT PAINTSTRUCT;
hdc=开始修复(hWnd和paintStruct);
/*从BMP文件加载位图(确保该文件位于项目文件夹下)*/
hbitmap=(hbitmap)LoadImage(NULL,“truck.bmp”,IMAGE\u位图,0,0,LR\u LOADFROMFILE);
if(hbitmap==NULL)
{
MessageBox(NULL,“未加载位图-确保项目文件夹中存在文件'truck.bmp'”,“错误”,MB_OK);
}
hmemdc=CreateCompatibleDC(hdc);
选择对象(hmemdc、hbitmap);
GetObject(hbitmap、sizeof(位图)和位图);
/*在窗口客户端区域的特定x、y位置显示位图*/
BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hmemdc,0,0,SRCCOPY);
/*在窗口客户端区域的特定x、y位置显示具有缩放尺寸的位图*/
StretchBlt(hdc,bitmap.bmWidth+5,0,bitmap.bmWidth*2,bitmap.bmHeight*2,hmemdc,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
DeleteDC(hmemdc);
删除对象(hbitmap);
EndPaint(hWnd和paintStruct);
返回0;
案例WM_销毁:
PostQuitMessage(0);
返回0;
违约:
返回DefWindowProc(hWnd、uMsgId、wParam、lParam);
}
}

您发布了PNG和JPG,但您声称正在加载BMP。如果这很重要,您需要共享正在使用的实际BMP文件。当您尝试这两个图像时,它们是否复制到同一文件夹?可能文件名不正确。您可能只看到了没有扩展名的名字。请在调用
LoadImage
后尝试调用
GetLastError()
,并将错误代码粘贴到此处。这不会解决问题,但不要每次绘制都加载位图,这样效率很低。我想当我上传它们的时候,它们会转换成那种格式。我在谷歌上搜索bmp并使用前两张图片进行测试*。bmp&hl=en&safe=off&prmd=imvns&source=lnms&tbm=isch&sa=X&ei=0zwCUNr9MsforQfk8L2EBg&ved=0ECQ_AUoAQ&biw=1366&bih=667我在项目文件夹中使用相同的名称