哪位高手帮我看看这段代码为啥显示不出图像.

zy2015036 2010-03-24 12:23:03
	CFile file;
BITMAPFILEHEADER FILE_HEADER; //文件头
BITMAPINFOHEADER INFO_HEADER; //信息头
file.Open(_T("D:\\256.bmp"),CFile::modeRead); //任意一个256色位图
file.Read(&FILE_HEADER, sizeof(BITMAPFILEHEADER));
if(FILE_HEADER.bfType != 0x4d42)
{
file.Close();
AfxMessageBox(_T("原图象不为BMP图象!"));
return;
}
file.Read(&INFO_HEADER,sizeof(BITMAPINFOHEADER));
int numQuad = 0;
if(INFO_HEADER.biBitCount < 24)
{
numQuad = 1 << INFO_HEADER.biBitCount; //1右移?位 = 2的?次方
}
BITMAPINFO *pBMP_INFO = (BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,
sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD));
memcpy(pBMP_INFO, &INFO_HEADER, sizeof(BITMAPINFOHEADER));
RGBQUAD *quad = (RGBQUAD*)((BYTE*)pBMP_INFO + sizeof(BITMAPINFOHEADER));
if(numQuad != 0)
{
file.Read(quad, sizeof(RGBQUAD) * numQuad);
}
int sizeBuf = FILE_HEADER.bfSize - FILE_HEADER.bfOffBits;
BYTE *bmpBuf = new BYTE[sizeBuf];
file.Read(bmpBuf, sizeBuf);
file.Close();

CDC *pDC = GetDC();
Graphics gdiDC(pDC->GetSafeHdc());
Bitmap *pBmp = Bitmap::FromBITMAPINFO(pBMP_INFO, bmpBuf);//GDI+从BITMAPINFO生成bmp的方法
gdiDC.DrawImage(pBmp, 0, 0);
ReleaseDC(pDC);

这段代码是能编译通过(也加入了GDI+头文件)但是显示不出图像.请问为什么?
这段代码我放在OnPaint和OnDraw都显示不出来,代码应该没错误,是不是我忘加了什么.请高手帮我看看.谢谢!
...全文
100 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangshd1234 2010-04-27
  • 打赏
  • 举报
回复
今天我也是这个问题,我是对话框的程序,用vs2008,后来发现是初始化函数太靠后了

BOOL CTestFwtApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);

// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinAppEx::InitInstance();

AfxEnableControlContainer();
GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL); // 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

CTestFwtDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);//开始位置,不能显示
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
zy2015036 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
GDI+初始化做了么?
[/Quote]
没有 - -! 咋初始化?
fandh 2010-03-24
  • 打赏
  • 举报
回复
GDI+初始化做了么?
zy2015036 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vc_zsy 的回复:]
一、包含头文件 #include <GdiPlus.h>
二、将Gdiplus.lib文件联编加入到项目中去
可在项目代码中加入
#pragma comment(lib,"gdiplus.lib")
不加会出出LINK 2001错误
三、使用GDI+后命名空间
using namespace Gdiplus
四、定义全局 无符号长整形指针 ULONG_PTR
如 ULONG_PTR……
[/Quote]
我就是按着这个做的,GDI+初始化错误.你们能用这个初始化吗?
VC_ZSY 2010-03-24
  • 打赏
  • 举报
回复
一、包含头文件 #include <GdiPlus.h>
二、将Gdiplus.lib文件联编加入到项目中去
可在项目代码中加入
#pragma comment(lib,"gdiplus.lib")
不加会出出LINK 2001错误
三、使用GDI+后命名空间
using namespace Gdiplus
四、定义全局 无符号长整形指针 ULONG_PTR
如 ULONG_PTR gdiplusupToken;
五、在构造函数里对GDI+进行初始化
GdiplusStartupInput gdipluwStartupInput;
GdiplusStartup(&gdiplusupToken,&gdipluwStartupInput,NULL);
六、析构函数里销毁GDI+资源
GdiplusShutdown(gdiplusupToken);
zy2015036 2010-03-24
  • 打赏
  • 举报
回复
感谢你的回复,但是我用的VS2008,我在网上找的初始化GDI+的方法都用不了.哪位有经验的高手能给我一个VS2008初始化GDI+的方法.谢谢了
fandh 2010-03-24
  • 打赏
  • 举报
回复
http://www.23book.net/SoftwareDev/VC/53294.htm

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧