急!为什么用BitBlt显示不出来图象?

ajn_sailing 2002-11-04 12:00:02

void CXpButtonItemDlg::OnPaint()
{
RECT rt;
GetClientRect(&rt);

if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_TileIcon);
}
else
{
//绘制对话框的边框
CDC * dc = GetDC();

HDC memDCMask;
memDCMask = CreateCompatibleDC(dc->m_hDC);

HBITMAP pMask;
pMask = ::LoadBitmap(NULL,MAKEINTRESOURCE(IDB_MASK));//底图
::SelectObject(memDCMask,&pMask);

HDC memDCTu;
memDCTu = CreateCompatibleDC(dc->m_hDC);
HBITMAP pTu;
pTu = ::LoadBitmap(NULL,MAKEINTRESOURCE(IDB_TU));//凸图
::SelectObject(memDCTu,&pTu);

BOOL err2 = ::BitBlt(dc->m_hDC,105,111,40,40,memDCMask,0,0,SRCAND);
::BitBlt(dc->m_hDC,105,111,40,40,memDCTu,0,0,SRCPAINT);


delete pMask;
delete pTu;

CDialog::OnPaint();

}
}

谢谢
...全文
411 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajn_sailing 2002-11-07
  • 打赏
  • 举报
回复
放分喽.
ajn_sailing 2002-11-05
  • 打赏
  • 举报
回复
kathywp(树欲静而风不止)先生,您能解释一下吗?
xiaoqiqixiao 2002-11-05
  • 打赏
  • 举报
回复
把CDialog::OnPaint去掉
建议不要用CDC* pdc= GetDC();
用CPaintDC dc(this);
ajn_sailing 2002-11-04
  • 打赏
  • 举报
回复
还是不行!

用户 昵称 2002-11-04
  • 打赏
  • 举报
回复
使用CPaintDC,这样改动一下看看
void CXpButtonItemDlg::OnPaint()
{
RECT rt;
GetClientRect(&rt);
CPaintDC dc(this); // device context for painting

if (IsIconic())
{

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_TileIcon);
}
else
{
//绘制对话框的边框
//CDC * dc = GetDC();

HDC memDCMask;
memDCMask = CreateCompatibleDC(dc->m_hDC);

HBITMAP pMask;
pMask = ::LoadBitmap(NULL,MAKEINTRESOURCE(IDB_MASK));//底图
::SelectObject(memDCMask,&pMask);

HDC memDCTu;
memDCTu = CreateCompatibleDC(dc->m_hDC);
HBITMAP pTu;
pTu = ::LoadBitmap(NULL,MAKEINTRESOURCE(IDB_TU));//凸图
::SelectObject(memDCTu,&pTu);

BOOL err2 = ::BitBlt(dc->m_hDC,105,111,40,40,memDCMask,0,0,SRCAND);
::BitBlt(dc->m_hDC,105,111,40,40,memDCTu,0,0,SRCPAINT);


delete pMask;
delete pTu;

CDialog::OnPaint();

}
}
qing_li73 2002-11-04
  • 打赏
  • 举报
回复
See the links below, FYI :

http://www.codeproject.com/dialog/gribble2.asp
http://www.codeproject.com/dialog/ccreditsctrl.asp
ajn_sailing 2002-11-04
  • 打赏
  • 举报
回复
不行啊
nevergrief 2002-11-04
  • 打赏
  • 举报
回复
试试
pMask = ::LoadBitmap(NULL,"IDB_BITMAP1");//底图
同时,你的资源属性页,那个Bitmap的名称也要改为"IDB_BITMAP1",不能是IDB_BITMAP1
kathywp 2002-11-04
  • 打赏
  • 举报
回复
我不是给你例子了吗,怎么不试就乱说,我要生气了!!!!
zqone 2002-11-04
  • 打赏
  • 举报
回复
要先生成一个内存设备,用CreateCompatibleDC函数,然后把位图选入内存对象,再用bitblt函数
HDC hMemDc;
HDC hdc;
HBITMAP hBitmap;

hdc=::GetDC(hWnd);
hBitmap=::LoadBitmap(AppInfo.hInst,MAKEINTRESOURCE(IDB_BITMAP));
hMemDc=::CreateCompatibleDC(hdc);
::SelectObject(hMemDc,hBitmap);
::BitBlt(hdc,50,50,500,500,hMemDc,0,0,SRCCOPY);
::DeleteDC(hMemDc);
::ReleaseDC(hWnd,hdc);
ajn_sailing 2002-11-04
  • 打赏
  • 举报
回复
我到觉得不用MFC类库而用SDK是实现不了的.以下是SelectObject的解释

函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);

参数:

hdc:设备上下文环境的句柄。

hgdiobj:被选择的对象的句型,该指定对象必须由如下的函数创建。

位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。//选择位图句柄时不能选用LOADBITMAP加载的句柄

画笔:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。

字体:CreateFont, CreateFontIndirect。

笔:CreatePen, CreatePenIndirect。

区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。

zhenxizhou 2002-11-04
  • 打赏
  • 举报
回复
gz
kathywp 2002-11-04
  • 打赏
  • 举报
回复
HBITMAP hBmp;

hBmp = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
backDC = CreateCompatibleDC ( NULL);
SelectObject (backDC, hBmp );
BitBlt(dc->m_hDC,0,0,1024,768,backDC,0,0,SRCCOPY);
照着改吧!
其中backDC一定要是全局的HDC,还有dc是CDC*的变量也是全局的
Phourm 2002-11-04
  • 打赏
  • 举报
回复
//绘制对话框的边框
CDC * dc = GetDC();

HDC memDCMask;
memDCMask = CreateCompatibleDC(dc->m_hDC);

HBITMAP pMask;
HINSTANCE hIns = GetModuleHandle(NULL);
pMask = ::LoadBitmap(hIns,MAKEINTRESOURCE(IDB_MASK));//底图
::SelectObject(memDCMask,pMask);

HDC memDCTu;
memDCTu = CreateCompatibleDC(dc->m_hDC);
HBITMAP pTu;
pTu = ::LoadBitmap(hIns,MAKEINTRESOURCE(IDB_TU));//凸图
::SelectObject(memDCTu,pTu);

BOOL err2 = ::BitBlt(dc->m_hDC,0,0,40,40,memDCMask,0,0,SRCAND);
::BitBlt(dc->m_hDC,105,111,40,40,memDCTu,0,0,SRCCOPY);

ReleaseDC(dc);
// delete pMask;
// delete pTu;

CDialog::OnPaint();
ajn_sailing 2002-11-04
  • 打赏
  • 举报
回复
各位想想办法.多谢了!

这样也行:不用MFC,用SDK将一个BMP图象显示在对话框(得用BitBlt()API)

15,976

社区成员

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

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