根据图片尺寸调整窗口的问题

夹心饼干 2009-02-24 05:09:53
CString str = fd.GetPathName();

HBITMAP bitmap;
bitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),str,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
ASSERT(bitmap);//这里的str没有问题的,我是通过CFILEDIALOG打开的
CBitmap bmp;
bmp.Attach(bitmap);

DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biWidth;
int cy=bminfo.biHeight;

SetWindowPos(&m_list,0,0,cx,cy,SWP_NOMOVE|SWP_NOZORDER);//本来这里是调整LIST的大小的,结果没有反应

m_list.GetWindowRect(&m_rect);
ScreenToClient(&m_rect);
// m_list.MoveWindow(rect.left,rect.top,cx,cy,true);
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);

dc.BitBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);

此外还有个问题,就是当我显示这副图片的时候,有时候一下子不能够完全显示出来,多打开几次后可以,是不是因为
图片尺寸太大?也或者是我在显示图片的时候没有对图片分层,都是在第0层的原因呢?
...全文
105 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
waizqfor 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stormlk1983 的回复:]
不好意思刚才的问题已经解决了,现在的问题是
我显示的图片有点大,800X600的,显示的时候在对话框一次不能够完全显示出来,只显示了图片的一部分
第二次点的时候就没问题了,难道对显示的图片的大小有限制吗
[/Quote]
LZ是在什么下运行的 可能跟图片的大小有关系的
xianyuxiaoqiang 2009-02-25
  • 打赏
  • 举报
回复
帮顶。

试试用滚动窗口?
夹心饼干 2009-02-25
  • 打赏
  • 举报
回复
不好意思刚才的问题已经解决了,现在的问题是
我显示的图片有点大,800X600的,显示的时候在对话框一次不能够完全显示出来,只显示了图片的一部分
第二次点的时候就没问题了,难道对显示的图片的大小有限制吗
夹心饼干 2009-02-25
  • 打赏
  • 举报
回复
我现在打开一个bmp文件后,会瞬间显示然后消失了,我在onpaint里设置了断点结果真进去了
但是我没有那个地方调用或者触发了onpaint啊?
比如我在显示图片的时候我sleep(20000),图片可以在窗口显示2s在消失,但是在这个基础上我在打开
该图片就没有问题很正常,打开别的图片的时候又是马上消失,第2次后打开就正常显示

请教是什么问题啊


m_str = fd.GetPathName();//m_str是CSTRING类型

HBITMAP bitmap;
bitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_str,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
ASSERT(bitmap);
CBitmap bmp;
bmp.Attach(bitmap);

DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biWidth; //得到图像宽度
int cy=bminfo.biHeight; //得到图像高度

m_list.SetWindowPos(NULL,0,0,cx,cy,SWP_NOMOVE|SWP_NOZORDER);

m_list.GetWindowRect(&m_rect);
ScreenToClient(&m_rect);

HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
dc.BitBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
  • 打赏
  • 举报
回复
帮顶吧
夹心饼干 2009-02-25
  • 打赏
  • 举报
回复
调整窗口可以了,但是显示的时候随便谈出一个东西就会在窗口上覆盖掉我的一部分图片
是不是说我每次都要把窗口里的图片用onpaint重绘下呢?
逸萌 2009-02-25
  • 打赏
  • 举报
回复
图片有点大或者小,dc.BitBlt(改StrechBit伸缩
夹心饼干 2009-02-25
  • 打赏
  • 举报
回复
我用的是VS2008,图片是在LISTBOX上显示的
逸萌 2009-02-24
  • 打赏
  • 举报
回复
此外还有个问题,就是当我显示这副图片的时候,有时候一下子不能够完全显示出来,多打开几次后可以,是不是因为
图片尺寸太大?也或者是我在显示图片的时候没有对图片分层,都是在第0层的原因呢?
我没有这个问题,可能其它原因
逸萌 2009-02-24
  • 打赏
  • 举报
回复
SetWindowPos(m_list.GetSafeHwnd(),NULL,0,0,cx,cy,SWP_NOMOVE|SWP_NOZORDER);
m_list.SetWindowPos(NULL,0,0,cx,cy,SWP_NOMOVE|SWP_NOZORDER);

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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