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