| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1108 人关注过本帖
标题:[求助]在WM_PAINT位图怎么也显示不了!附代码
只看楼主 加入收藏
llt2007
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-10-12
收藏
 问题点数:0 回复次数:4 
[求助]在WM_PAINT位图怎么也显示不了!附代码

从节前到现在卡在这个问题上都有15天了,买了好几本书,看了很多网页,居然还没有搞定,真是服了自己的气,完全没有办法了(靠自己摸),现在求师傅们帮帮我......谢谢了!
目 标:想在窗口过程回调函数里的WM_PAINT中显示一张位图。(由于以后应用方向上的原因,不打算用MFC)
准备工作:A 资源准备:由VC生成.RC文件 里面有 IDB_BITMAP1 BITMAP DISCARDABLE "tanke.bmp" //(一张坦克的图片 600*400大小)
resource.h头文件 里面有 #define IDB_BITMAP1 111 //(下面还有一些#ifdef、#ifndef、#define是VC生成的)
图片在项目文件夹根目录下 。
B GDI+准备:做好了VC6的include以及lib目录添加,并在工程中连接了GdiPlus.lib
做了有关GDI+的头文件,里面写了#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "gdiplus.h"
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")这是核对了网上与书中的内容后照抄的
WinMain()所在的程序中include了这个头文件,然后在程序中做了GDI+的初始化,这样写的:
ULONG_PTR gdi_Opject; //GDI对象
GdiplusStartupInput gdiplusStartupInput; //用于初始化的GDI对象
GdiplusStartup(&gdi_Opject, &gdiplusStartupInput, NULL); //初始化GDI+,这一句我写在了WinMain()里
C 窗口准备:已经可以显示一个窗口了,在WindowProc()加了WM_KEYDOWN消息,可以按ESC退出。
准备工作做完了,下面在在WindowProc()里加了WM_PAINT事件的代码,编译和连接没有出错误,显示了窗口,就是没有图片。
下面是WindowProc()里的全部代码:(其中qd_hInstance是程序句柄,qd_hwnd是窗口句柄。因为我的程序名是qd,所以这样命名)

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
HBITMAP qd_bmp=(HBITMAP)LoadImage(qd_hInstance,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
BITMAP bm;
::GetObject( qd_bmp, sizeof( bm ), &bm );
int bmWidth = bm.bmWidth;
int bmHeight =bm.bmHeight;
HDC hdc=GetDC(qd_hwnd);
HDC QDdc=CreateCompatibleDC(GetDC(qd_hwnd));
SelectObject(QDdc,&qd_bmp);
PAINTSTRUCT ps;
RECT rect; //以上这些声明在WM_PAINT之外,是怕由BeginPaint()产生多余的重复声明,不知道应不应该这样做。
switch (uMsg)
{
case WM_PAINT:
{
hdc = BeginPaint(qd_hwnd,&ps);
GetClientRect(qd_hwnd,&rect);
BitBlt(hdc,0,0,bmWidth,bmHeight,QDdc,0,0,SRCCOPY);
EndPaint (qd_hwnd, &ps);
return 0;
}
break;

case WM_KEYDOWN: //按ESC键退出窗口
if(wParam == VK_ESCAPE)
{
PostMessage(hwnd, WM_CLOSE, 0, 0);
PostQuitMessage(0);
DeleteObject(qd_bmp); //删除位图 ***********************
ReleaseDC(qd_hwnd,hdc); //释放设备上下文 *
DeleteDC(QDdc); //删除内存设备上下文 *
GdiplusShutdown(gdi_Opject); //销毁GDI+ *
} //我想,应该是在窗口退出的时候释放这些,所以这样做了*****
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;

结果:编译和连接没有错误,有窗口,没有显示图片。耽误师傅们的宝贵时间,帮我看一下,谢谢、谢谢!

搜索更多相关主题的帖子: PAINT 位图 坦克 IDB 代码 
2007-10-13 01:14
Janlex
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:303
专家分:0
注 册:2006-9-12
收藏
得分:0 
SelectObject(QDdc,&qd_bmp);

==>

SelectObject(QDdc,qd_bmp);

花了半天帮你把臭虫找出来了...

★★★★★欢迎光临我的博客 ★★★★★
http://www.
2007-10-14 00:32
llt2007
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-10-12
收藏
得分:0 
血洗女寝室师傅,谢谢你啊,我照你的改了,还是没有显示图像,一定是我其它地方也有错误。
被难住的这几天一直在思考,为什么学习过程这么困难,我上网查资料,买书看书,包括发贴子
(除了师傅你之外,少有人回应),都找不到清晰、明确、详细的说法...我想会不会是我的学习方
向有问题,因为我以后想往图形图像方向发展(或者游戏),在初步掌握WINDOWS API之后,就转而
学习DirectX以及其他关于图形图象算法...我一直怕学习MFC不利于我理解基础的东西(感觉MFC封
装得太厉害了)。
现在,所有的书,多数的网上资料都主要讲解MFC,以后会更加如此。而针对传统方式的学习资料
也许会越来越少,我想试一下MFC,看看会不会顺一些......以后请你多多帮助,谢谢你...
2007-10-15 20:11
Janlex
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:303
专家分:0
注 册:2006-9-12
收藏
得分:0 

SelectObject(QDdc,&qd_bmp);

==>

SelectObject(QDdc,qd_bmp);

我测试你程序通过...

如果还不行,肯定是你别的地方有问题.

你把源代码贴上来吧.或者工程打包...我帮你修改.

我有事要出去一下...晚点回来帮你解决


★★★★★欢迎光临我的博客 ★★★★★
http://www.
2007-10-15 21:02
llt2007
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-10-12
收藏
得分:0 
血洗女寝室师傅,我把工程打包了,谢谢你帮我看一下,
向你报告一下我的学习进度:
我学习了一下MFC,倒还确实是方便一些,比方说,用它里面的CSplash组件可以很快实现一个启动画面,但是,从这个例子中也反映了MFC使用和学习上的一些障碍。用MFC提供的CSplash组件实现的启动画面是含在主窗口里的,就是说窗口和启动画面是同时出现的,如果想让启动画面出现几秒后,主窗口再出现,改起来就不容易了,我试着用定时器控制窗口的显示ShowWindows()和更新UpdateWindows(),却意外地发现,MFC提供的类里虽然有这两句,但是我把它们删掉后,窗口还是显示了,虽有这两句,但又不为其控制,昏,云山雾罩,越发糊涂了...
jaPDzWRT.rar (821.22 KB) [求助]在WM_PAINT位图怎么也显示不了!附代码


2007-10-16 23:50
快速回复:[求助]在WM_PAINT位图怎么也显示不了!附代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015541 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved