📄 subject_28230.htm
字号:
<p>
序号:28230 发表者:radargroup 发表日期:2003-01-19 17:24:20
<br>主题:这个方法为什么显示不出位图:(
<br>内容:程序运行的了,但是调试到hbitmap,发现返回hbitmap为空.可是,参数输入都挺好呀!<BR>怎么回事?<BR><BR>void CSplashWnd::OnPaint() <BR>{<BR> CPaintDC dc(this); // device context for painting<BR> <BR> CFile fbmp;<BR><BR> fbmp.Open("Sunset.bmp",CFile::modeRead|<BR> CFile::typeBinary|CFile::shareExclusive);//打开文件<BR><BR> fbmp.Seek(54,CFile::begin);//位图文件头为54字节<BR><BR> fbmp.ReadHuge(pBitsSrc,(long)(iW*iH*3));//读文件<BR><BR> fbmp.Close();//关闭文件<BR> <BR> HBITMAP hBitmap=::CreateDIBitmap(dc.m_hDC,<BR> (BITMAPINFOHEADER FAR*)&(Info.Header),<BR> CBM_INIT,pBitsSrc,(LPBITMAPINFO)&Info,<BR> DIB_RGB_COLORS);//建立位图<BR> <BR> HDC hMemDC=::CreateCompatibleDC(dc.m_hDC);//建立内存<BR> <BR> HBITMAP hBitmapOld=SelectBitmap(hMemDC,hBitmap);//选择对象<BR> <BR> ::StretchBlt(dc.m_hDC,0,0,iW,iH,hMemDC,0,0,iW,iH,SRCCOPY);//显示真彩位图<BR><BR> <BR> ::DeleteObject(SelectObject(hMemDC,hBitmapOld));//删除位图<BR><BR>}<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:upstream 回复日期:2003-01-19 19:49:33
<br>内容:pBitsSrc,iW,iH等都是怎么定义的?<BR>我帮你 look look。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:radargroup 回复日期:2003-01-20 11:49:23
<br>内容:大体是这样的<BR>iw = 600; ih = 450;<BR>pBitsSrc = ::GlobalAlloc(GMEM_FIXED,sizeof(iw*ih*3));
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:booky 回复日期:2003-01-20 13:39:37
<br>内容:找一份BMP文件格式的文章看看。除了信息头和文件头之外,它的每行的的字节数必须是4的倍数,如果不能被4整除则补零
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:radargroup 回复日期:2003-01-20 17:20:58
<br>内容:代码如下:怎么改?<BR><BR>CSplashWnd::CSplashWnd()<BR>{ <BR> iW=600;iH=450;//位图的宽度和高度<BR> <BR> Info.Header.biSize=sizeof(BITMAPINFOHEADER);<BR> <BR> Info.Header.biWidth=iW;<BR> <BR> Info.Header.biHeight=iH;<BR> <BR> Info.Header.biPlanes=1L;<BR> <BR> Info.Header.biBitCount=24L;<BR> <BR> hBitsSrc=::GlobalAlloc(GHND,(long)(iW*iH*3));//分配内存<BR> <BR> pBitsSrc=(LPSTR)::GlobalLock(hBitsSrc);//加锁内存<BR>}<BR><BR>void CSplashWnd::OnPaint() <BR>{<BR> CPaintDC dc(this); // device context for painting<BR> <BR> CFile fbmp;<BR><BR> fbmp.Open("Sunset.bmp",CFile::modeRead|<BR> CFile::typeBinary|CFile::shareExclusive);//打开文件<BR><BR> fbmp.Seek(54,CFile::begin);//位图文件头为54字节<BR><BR> fbmp.ReadHuge(pBitsSrc,(long)(iW*iH*3));//读文件<BR><BR> fbmp.Close();//关闭文件<BR> <BR> HBITMAP hBitmap=::CreateDIBitmap(dc.m_hDC,<BR> (BITMAPINFOHEADER FAR*)&(Info.Header),<BR> CBM_INIT,pBitsSrc,(LPBITMAPINFO)&Info,<BR> DIB_RGB_COLORS);//建立位图<BR> <BR> HDC hMemDC=::CreateCompatibleDC(dc.m_hDC);//建立内存<BR> <BR> HBITMAP hBitmapOld=SelectBitmap(hMemDC,hBitmap);//选择对象<BR> <BR> ::StretchBlt(dc.m_hDC,0,0,iW,iH,hMemDC,0,0,iW,iH,SRCCOPY);//显示真彩位图<BR> <BR> ::DeleteObject(SelectObject(hMemDC,hBitmapOld));//删除位图<BR><BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:booky 回复日期:2003-01-20 19:25:13
<br>内容:关键部分是,结构体BITMAPFILEHEADER,BITMAPINFOHEADER的值是从文件中得到,而不是由你指定。其他的流程是对的。我写过的程序不在手边,明天如果记得带过来就贴出来。不过网上有很多的例子,应该好找。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lixiang 回复日期:2003-01-20 20:43:57
<br>内容:直接用LoadImage()就可以了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:吴澄埃 回复日期:2003-01-26 11:52:19
<br>内容:<BR>其实,这是从磁盘上载入一.bmp的文件并显示的问题。<BR>下面,我就以对话框里显示它为例子:<BR>1.首先,初始化。<BR>BOOL CLTBDlg::OnInitDialog()<BR>{<BR> CDialog::OnInitDialog();<BR><BR> // Add "About..." menu item to system menu.<BR><BR> // IDM_ABOUTBOX must be in the system command range.<BR> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);<BR> ASSERT(IDM_ABOUTBOX < 0xF000);<BR><BR> CMenu* pSysMenu = GetSystemMenu(FALSE);<BR> if (pSysMenu != NULL)<BR> {<BR> CString strAboutMenu;<BR> strAboutMenu.LoadString(IDS_ABOUTBOX);<BR> if (!strAboutMenu.IsEmpty())<BR> {<BR> pSysMenu->AppendMenu(MF_SEPARATOR);<BR> pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);<BR> }<BR> }<BR><BR> // Set the icon for this dialog. The framework does this automatically<BR> // when the application's main window is not a dialog<BR> SetIcon(m_hIcon, TRUE); // Set big icon<BR> SetIcon(m_hIcon, FALSE); // Set small icon<BR><BR> // TODO: Add extra initialization here<BR><BR>//==============下面就是我们要加入初始化的======<BR> HBITMAP m_hBmp = (HBITMAP)::LoadImage(0,<BR> "game.bmp",<BR> IMAGE_BITMAP,<BR> 0,<BR> 0,<BR> LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);<BR> _ASSERT(m_hBmp!=NULL);<BR> m_pBmp = CBitmap::FromHandle(m_hBmp);<BR>//======================================<BR> return TRUE; // return TRUE unless you set the focus to a control<BR>}<BR><BR>2.就是显示了。在OnPaint()函数加入:<BR>void CLTBDlg::OnPaint()<BR>{<BR> if (IsIconic())<BR> {<BR> CPaintDC dc(this); // device context for painting<BR><BR> SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);<BR><BR> // Center icon in client rectangle<BR> int cxIcon = GetSystemMetrics(SM_CXICON);<BR> int cyIcon = GetSystemMetrics(SM_CYICON);<BR> CRect rect;<BR> GetClientRect(&rect);<BR> int x = (rect.Width() - cxIcon + 1) / 2;<BR> int y = (rect.Height() - cyIcon + 1) / 2;<BR><BR> // Draw the icon<BR> dc.DrawIcon(x, y, m_hIcon);<BR> }<BR> else<BR> {<BR>//=================下面就是我们加入的罗=============<BR> CPaintDC dc(this);<BR> BITMAP bm;<BR> CDC dcMem;<BR> VERIFY(m_pBmp->GetObject(sizeof(bm),(LPVOID)&bm));<BR> dcMem.CreateCompatibleDC(&dc);<BR> CBitmap *pOldBMP=(CBitmap *)dcMem.SelectObject(m_pBmp);<BR> //BitBlt(dc.m_hDC,0, 0, bm.bmWidth, bm.bmHeight, dcMem.m_hDC, 0, 0, SRCCOPY);<BR><BR> dc.StretchBlt(150, 100, 6*(bm.bmWidth),6*(bm.bmHeight), //rect.Width(), rect.Height(),<BR> &dcMem,<BR> 0, 0, bm.bmWidth, bm.bmHeight,<BR> SRCCOPY);<BR><BR> dcMem.SelectObject(pOldBMP);<BR><BR>//===================================================<BR> CDialog::OnPaint();<BR> }<BR>}<BR><BR>就这么简单,载入并显示一个磁盘.bmp文件!给分呵 :)<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:radargroup 回复日期:2003-01-27 10:21:25
<br>内容:谢谢wucheng_ai,但是我只是想用另一种方法显出位图来,你的那种我会的。现在我已经把我的代码改了。但我想问一下,给分就是点接受你的答案,是吗?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:booky 回复日期:2003-01-27 17:00:24
<br>内容:里面是用API写的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:吴澄埃 回复日期:2003-01-27 19:47:48
<br>内容:对呀,给分就是点接受你的答案。你我都个好学的人呵,答案都是有多种的罗,钻研一下,真是好有乐趣。:)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -