一个画位图的问题

zengsheng 2006-08-29 04:09:26
我画了一张背景
代码如下:
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
这个画成功了.占了整个的对话框界面

现在我要画一个图标,也是bmp格式的.但是没有画出来.不画背景的话是可以把这个图标画出来的.但是一画了背景.就没有图标了.代码如下:
dc.StretchBlt(0,0,closebitMap.bmWidth*2,closebitMap.bmHeight*2,&dcMem,0,0,closebitMap.bmWidth,closebitMap.bmHeight,SRCCOPY);

请问错误在什么地方呢??
...全文
376 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Michelle25 2006-08-30
  • 打赏
  • 举报
回复
我想在对话框里画图怎么画啊?
littlepboy 2006-08-30
  • 打赏
  • 举报
回复
有人家的dc干吗不用呢,这样写真有些多此一举啊。。。
写两个这样的函数吧:
DrawBackground(CDC *pDC);
DrawIcon(CDC *pDC);

OnPaint调用:
DrawBackground(&dc);
DrawIcon(&dc);

另外,你这里创建的CDC对象不能用ReleaseDC(),而要用DeleteDC(),
可以去看MSDN。还有OnPaint里的dc不用释放,它会自己释放。
zengsheng 2006-08-30
  • 打赏
  • 举报
回复
TO:Mackz(在相互):
我的两个是在不同的函数里面.所以能通过编译

To: littlepboy(vc小p孩)
基本上是这个顺序.只不过我画背景是在paint函数里面:顺序如下

// 画背景
CreateCompatibleDC();
SelectObject(); // 选择
StretchBlt();
SelectObject(); // 选回
// 释放
DeleteDC();

画完背景,调用一个函数画图标.顺序如下:

SelectObject(); // 选择
StretchBlt();
SelectObject(); // 选回
// 释放
DeleteDC();



zengsheng 2006-08-30
  • 打赏
  • 举报
回复
每一个画图函数都必须使用paint函数的dc么??
xundeng 2006-08-30
  • 打赏
  • 举报
回复
调用画图标的时候 应该传递DC指针给那个函数
zengsheng 2006-08-30
  • 打赏
  • 举报
回复
To superarhow(苏泊尔耗)

在两个函数中,我释放两次dc,会有什么问题么??
整个代码如下:
void CMyClientDlg::OnPaint()
{
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_hIcon);
// PaintTitle();
}
else
{

// CDialog::OnPaint();
CPaintDC dc(this);
CRect rect;
//GetClientRect(&rect);

GetWindowRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
BITMAP bitMap;
m_bmpBackground.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//SRCCOPY
dcMem.SelectObject(pbmpOld);
ReleaseDC(&dcMem);
ReleaseDC(&dc);

PaintTitle(); //画图标
}
}

//////////以下画图标///////////////

void CMyClientDlg::PaintTitle()
{

CPaintDC dc(this);
CRect rect;
//GetClientRect(&rect);

GetWindowRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
BITMAP closebitMap;

m_bmpClose.GetBitmap(&closebitMap);
this->m_bCloseWidth = closebitMap.bmWidth;

CBitmap *pbmpOld=dcMem.SelectObject(&m_bmpClose);
dc.StretchBlt(rect.Width()-closebitMap.bmWidth - 1,0,closebitMap.bmWidth,closebitMap.bmHeight,&dcMem,0,0,closebitMap.bmWidth,closebitMap.bmHeight,SRCCOPY);

//dc.StretchBlt(0,0,closebitMap.bmWidth*2,closebitMap.bmHeight*2,&dcMem,0,0,closebitMap.bmWidth,closebitMap.bmHeight,SRCCOPY);
dcMem.SelectObject(pbmpOld);

ReleaseDC(&dcMem);
ReleaseDC(&dc);
}


现在大家应该看的够清楚了吧??



superarhow 2006-08-30
  • 打赏
  • 举报
回复
是同一个DC吗?不会已经释放了吧
zengsheng 2006-08-30
  • 打赏
  • 举报
回复
有知道的么??
littlepboy 2006-08-29
  • 打赏
  • 举报
回复
看看是不是如下的调用顺序:

// 画背景
CreateCompatibleDC();
SelectObject(); // 选择
StretchBlt();
SelectObject(); // 选回
// 画图标
SelectObject(); // 选择
StretchBlt();
SelectObject(); // 选回
// 释放
DeleteDC();
菜牛 2006-08-29
  • 打赏
  • 举报
回复
怎么两个都是dcMem?
zengsheng 2006-08-29
  • 打赏
  • 举报
回复
换SRCINVERT 也没有用啊
xlzxlich 2006-08-29
  • 打赏
  • 举报
回复
换成 SRCINVERT 看看.
zengsheng 2006-08-29
  • 打赏
  • 举报
回复
是啊.我是在先画了背景.然后画的图标啊
shenming123 2006-08-29
  • 打赏
  • 举报
回复
画图标在画背景之后
zengsheng 2006-08-29
  • 打赏
  • 举报
回复
是这样的.我的背景是在paint函数里画的.
图标是在自定义函数里面画的.然后由paint函数来调用的.

思危兄的意思是背景一个dc,图标一个dc,然后一个整体的dc??
是这个意思么??
思危 2006-08-29
  • 打赏
  • 举报
回复
要再创建一个内存DC,然后分别把2张图绘制目标DC上

15,975

社区成员

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

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