用类封装 Bitmap,BitBlt()显示不出来的问题~~~~~~~~~~~~~~~~~~~~

aiyaya730 2011-03-30 05:50:41
用 WINDOWS API编程。

在没有 封装 的情况下,把位图各种BitBlt()都能成功。
但我现在把 位图 封装到类中后,出现了 BitBlt()出不来图像的问题!

把 一个 128×124的位图,Load到 m_hBitmap中,
作为 Hero 类的成员

1.
Hero类的 构造函数里 ,LoadBitmap()
LoadBitmap()中 ,hInstance 的参数,是由 WinMain()函数里获取的,我确定它不为NULL
并且 LoadBitmap()后 m_hBitmap可以取到宽度 和高度

2.
Hero类中 还有个 m_hdc成员,用于 存储 这个 位图
在构造函数 LoadBitmap()后,SelectObject(m_hdc,m_hBitmap);

按说这时候,m_hdc存储的图像就应该是 这张图片了

3.
在 消息循环里,想在 WM_PAINT里 ,想把Hero 类的 m_hdc成员所 存储的 图像 BitBlt()出来,
这时 出现了 问题 。

CHero类中的 m_hdc,怎么也BitBlt()不出来。

描述得可能不太清楚,有疑问我继续补充

各位帮我 看看 原因!
谢谢!

代码

lancher.cpp 这是消息循环


switch(message)
{
case WM_CREATE:

hdc=GetDC(hwnd);

g_pHero=new CHero(TEXT("IDB_HERO"),hInst,hdc);

//Ôݶ¨Îª 500¡Á 500 ½«À´Òª ·Åµ½ WM_SIZEÖÐ ÒÀµ±Ç°´óС¶ø¶¨
hBitmapBuffer=CreateCompatibleBitmap(hdc,g_iClientWidth,g_iClientHeight);
hdcMemBuffer=CreateCompatibleDC(hdc);
SelectObject(hdcMemBuffer,hBitmapBuffer);

//TEST ---OK...
//hBitmap=LoadBitmap(hInst,TEXT("IDB_HERO"));
//SelectObject(hdcMemBuffer,hBitmap);

ReleaseDC(hwnd,hdc);
return 0;
case WM_SIZE:


return 0;
case WM_LBUTTONDOWN:
/********************
测试,希望点左键,就把 g_pHero的 位图BitBlt出来
********************/


hdc=GetDC(hwnd);


g_pHero->draw(hdc);
g_pHero->draw(hdcMemBuffer);

//BitBlt(hdc,20,20,100,100,g_pHero->m_hdc,0,0,SRCCOPY);
//BitBlt(hdcMemBuffer,20,20,100,100,g_pHero->m_hdc,0,0,SRCCOPY);

ReleaseDC(hwnd,hdc);

return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);


BitBlt(hdc,0,0,g_iClientWidth,g_iClientHeight,
hdcMemBuffer,0,0,SRCCOPY);


/*

BitBlt(hdc,0,0,100,100,
g_pHero->m_hdc,0,0,SRCCOPY);
*/

EndPaint(hwnd,&ps);
return 0;

case WM_DESTROY:
DeleteDC(hdcMemBuffer);

delete g_pHero;
g_pHero=NULL;
PostQuitMessage(0);
return 0;
}




CHero.h Hero类头文件



#define WIDTH_UNIT_COUNT 4 //λͼ×ÊÔ´ ÊÇ 4*4С·½¸ñ
#define HEIGHT_UNIT_COUNT 4

#define DIR_UP 0 //·½Ïò
#define DIR_DOWN 1
#define DIR_LEFT 2
#define DIR_RIGHT 3


class CHero
{
private:
HBITMAP m_hBitmap;
int iBitmapWidth,iBitmapHeight;
int iUnitWidth,iUnitHeight;

HDC m_hdc;
HINSTANCE m_hInst; //´´½¨ÎªÍ¼ÓÃ

// Ã泯·½Ïò 0ÉÏ 1Ï 2×ó 3ÓÒ
int m_dir;

int m_iPosX; //λÖà ¼Ç¼ʵ¼ÊλÖà ¼ÆËãµÄ¹¤×÷ÔÚÀàÍâ½øÐÐ
int m_iPosY;

public:

//TEST
//HDC m_hdc;

CHero(LPSTR imgName,HINSTANCE hProgInstance,HDC hdc);

void draw(HDC &hdcDest); //»æÖÆ Ó¦¸ÃÊÇÀàÀïÃæÓиö DC£¬´ÓÕâ¸öDCÍù Ä¿µÄDC ÉÏÃæ»­
void run(); //Òƶ¯


~CHero();
};



CHero.cpp CHero类的实现

#include<windows.h>
#include "glob.h"
#include "CHero.h"

CHero::CHero(LPSTR imgName,HINSTANCE hProgInstance,HDC hdc)
{

//¼ÓÔØλͼ×ÊÔ´
//this->hBitmap=LoadBitmap(hProgInstance,imgName);
m_hInst=hProgInstance;
//m_hBitmap=LoadBitmap(hProgInstance,TEXT("IDB_HERO"));
m_hBitmap=LoadBitmap(m_hInst,TEXT("IDB_HERO"));


BITMAP bitmap;
GetObject(m_hBitmap,sizeof(BITMAP),&bitmap);

this->iBitmapWidth=bitmap.bmWidth;
this->iBitmapHeight=bitmap.bmHeight;

this->iUnitWidth=iBitmapWidth/WIDTH_UNIT_COUNT;
this->iUnitHeight=iBitmapHeight/HEIGHT_UNIT_COUNT;


//³õʼ»¯ HERO DC
m_hdc=CreateCompatibleDC(hdc); //û SELECT ½øÈ¥£¿
SelectObject(hdc,m_hBitmap); //±£´æ×Å 4¡Á4¸ñËùÓеÄHEROͼƬ ÐèÒªµÄʱºòÒª Ó¦½øÐнØÈ¡

//³õʼ»¯ λÖà & ·½Ïò
m_iPosX=0;
m_iPosY=0;
m_dir=DIR_DOWN;

}

//»æÖÆ
void CHero::draw(HDC &hdcDest)
{
//ÔÝʱ²»·Ö·½Ïò...TODO..
BitBlt(hdcDest,20,20,100,100,
m_hdc,0,0,SRCCOPY);
}

//Òƶ¯
void CHero::run()
{

}



CHero::~CHero()
{

//TODO..
DeleteDC(m_hdc);
DeleteObject(m_hBitmap);
}





...全文
106 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老猿的春天 2011-07-03
  • 打赏
  • 举报
回复
接分,那别的地方都可以绘图,不需要在WM_PAINT里,会不会影响效率
aiyaya730 2011-03-31
  • 打赏
  • 举报
回复
昨天有点着急了

其实是 变量名 写错了,把图像传到别的DC里去了。
昨天晚上改好了。

没法给自己分,
谁来回复分就给谁了~

aiyaya730 2011-03-30
  • 打赏
  • 举报
回复
重点是 lancher.cpp 消息循环里的

WM_LBUTTONDOWN 消息

调用了 g_pHero 的 draw()方法,

这个 方法 里面就是 BitBlt(),不能成功

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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