VC创建对话框并显示图片的问题,知道的请进。

linuxchenyy 2010-11-21 02:59:11
  
CDialog *m_pDlg = new CDialog();
//m_pDlg = new DialogShow();
if(m_pDlg)
{
if(!m_pDlg->Create(IDD_DLGSHOW, this))
{
MessageBox( _T("对话框初始化失败"), _T("温情提示") );
return ;
}
}

////////////////我用Create创建了一个对话框。

DWORD* pResultBuf = NULL;

pDC= m_pDlg->GetDC();

//然后截取屏幕到为bmp到 pResultBuf中。为什么用如下代码显示不到上面的对话框中。

		if(bm.CreateBitmap(497, 448,1,32, pBuffer))
{

CBrush brush;
if(brush.CreatePatternBrush(&bm))
{

CBrush* pOldBrush = (CBrush*)pDC->SelectObject(&brush);

pDC->FillRect(&CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY,
497, 448), &brush);

pDC->SelectObject(pOldBrush);

brush.DeleteObject();
}
bm.DeleteObject();
ReleaseDC(pDC);
}
...全文
497 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 linuxchenyy 的回复:]
[Quote=引用 33 楼 talentbabby 的回复:]
在你要画的区域创建内存DC
在内存dc上画就应该能解决

C/C++ code

CDC *pDC = GetDC();
CDC MemDC;
CDC Bitmap;
MemDC.CreateCompatibleDC(pDC);
Bitmap.LoadBitmap(IDB_GREEN);
CBitmap *ol……
[/Quote]
LoadImage()动态加载
linuxchenyy 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 talentbabby 的回复:]
在你要画的区域创建内存DC
在内存dc上画就应该能解决

CDC *pDC = GetDC();
CDC MemDC;
CDC Bitmap;
MemDC.CreateCompatibleDC(pDC);
Bitmap.LoadBitmap(IDB_GREEN);
CBitmap *oldmap = MemDC.SelectObject(&Bitmap);
pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(oldmap);
Bitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);

[/Quote]


这种方法我试过,确实能行,但是LoadBitmap是个资源文件,我的图是实时更新的.
talentbabby 2010-11-22
  • 打赏
  • 举报
回复
在你要画的区域创建内存DC
在内存dc上画就应该能解决
CDC *pDC = GetDC();
CDC MemDC;
CDC Bitmap;
MemDC.CreateCompatibleDC(pDC);
Bitmap.LoadBitmap(IDB_GREEN);
CBitmap *oldmap = MemDC.SelectObject(&Bitmap);
pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(oldmap);
Bitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);
yann2 2010-11-22
  • 打赏
  • 举报
回复
闪动?双缓冲贴图可以解决闪烁的问题。

将要贴的图片贴到内存中,在把该内存DC给BitBlt到客户区
linuxchenyy 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 wltg2001 的回复:]
只不过会不定的闪动。
高手们给个思路如何去闪动。OnInitDialog, OnPaint等函数都不执行;
有什么办法没?
==============
闪动的原因找到了吗?一般是重绘引起的。
[/Quote]

应该是重绘引起的,一般情况应该可以在OnPaint来解决,现在不知道在哪解决?
linuxchenyy 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 linuxchenyy 的回复:]
问题解决了。不过采用的是另一种方法。
先把pBuffer里的位图数据保存成bmp图片到本地硬盘。然后
LoadImage 进来再BitBlt到客户区中。
不过还有个问题就是创建出来的对话框总是闪动。
[/Quote]

我采用的就是这个加载.已经做成功了. 现在想解决如何创建出来的对话框闪动的问题.
wltg2001 2010-11-21
  • 打赏
  • 举报
回复
只不过会不定的闪动。
高手们给个思路如何去闪动。OnInitDialog, OnPaint等函数都不执行;
有什么办法没?
==============
闪动的原因找到了吗?一般是重绘引起的。
linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 linuxchenyy 的回复:]
引用 25 楼 wltg2001 的回复:
引用 17 楼 linuxchenyy 的回复:
引用 15 楼 wltg2001 的回复:
我现在是在对话框上有一个按钮,我点击这个按钮就create另一个对话框,同时把这个对话框的DC传进去执行。 OnPaint 函数执行不到。
===============
你到底显示在哪个对话框上啊?第一个还是另一个啊?你传啊个DC给哪个啊?


……
[/Quote]

第二个对话框在特定位置显示,并且是半透明的。然后在上面再显示一些东东。
鼠标点上去不会有焦点。会透过这个对话框。
现在基本完成了,图也显示出来了。
只不过会不定的闪动。
高手们给个思路如何去闪动。OnInitDialog, OnPaint等函数都不执行;
有什么办法没?
MYNAMELIULI 2010-11-21
  • 打赏
  • 举报
回复
学习中~
linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wltg2001 的回复:]
引用 17 楼 linuxchenyy 的回复:
引用 15 楼 wltg2001 的回复:
我现在是在对话框上有一个按钮,我点击这个按钮就create另一个对话框,同时把这个对话框的DC传进去执行。 OnPaint 函数执行不到。
===============
你到底显示在哪个对话框上啊?第一个还是另一个啊?你传啊个DC给哪个啊?


第一个对话框上有一个按钮,点击后用的是cre……
[/Quote]

第二个对话框是Create出来的,好像OnInitDialog, OnPaint等函数都不执行。
我这个对话框是做成半透明的,然后置顶在屏幕上。
然后再在上面画一些东东。

现在创建出的对话框总闪动。

linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复
问题解决了。不过采用的是另一种方法。
先把pBuffer里的位图数据保存成bmp图片到本地硬盘。然后
LoadImage 进来再BitBlt到客户区中。
不过还有个问题就是创建出来的对话框总是闪动。
wltg2001 2010-11-21
  • 打赏
  • 举报
回复
bm.CreateCompatibleBitmap(pDC, 497, 448);
//bm.CreateBitmap(497,448,1,32, pBuffer);

用上面的代码,我直接注释掉这一句,可以看到一个黑框在对话框里,说明区域是对的。
但如何把pBuffer的内容显示出来。
===============
你的pBuffer中是位图数据,你可以用
DWORD SetBitmapBits(
DWORD dwCount,
const void* lpBits
);
将pBuffer中的数据导入到一个CBitmap对象中去,然后显示。
wltg2001 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 linuxchenyy 的回复:]
引用 15 楼 wltg2001 的回复:
我现在是在对话框上有一个按钮,我点击这个按钮就create另一个对话框,同时把这个对话框的DC传进去执行。 OnPaint 函数执行不到。
===============
你到底显示在哪个对话框上啊?第一个还是另一个啊?你传啊个DC给哪个啊?


第一个对话框上有一个按钮,点击后用的是create方法创建的第二个对话框, 然后在第一个对话框上……
[/Quote]
清楚了,不过为什么非要将显示第二个对话框上的图像的函数写在第一个对话框中呢?
linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 flydreamgg 的回复:]
引用 20 楼 linuxchenyy 的回复:
C/C++ code

CDC memDC;
CBitmap memBitmap;
if(memDC.CreateCompatibleDC(pDC))
{
AfxMessageBox("ok1");
}
else
{
AfxMessageBox("error1");
}
i……


memBitmap.CreateB……
[/Quote]


bm.CreateCompatibleBitmap(pDC, 497, 448);
//bm.CreateBitmap(497,448,1,32, pBuffer);

用上面的代码,我直接注释掉这一句,可以看到一个黑框在对话框里,说明区域是对的。
但如何把pBuffer的内容显示出来。
linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复
楼上的,要不我把代码发你,你帮我调试一下吧。
昨夜无风 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 linuxchenyy 的回复:]
C/C++ code

CDC memDC;
CBitmap memBitmap;
if(memDC.CreateCompatibleDC(pDC))
{
AfxMessageBox("ok1");
}
else
{
AfxMessageBox("error1");
}
i……
[/Quote]

memBitmap.CreateBitmap(497,448,1,32, pBuffer)
要改成
CreateCompatibleBitmap
========================================

另外,你1楼的代码没问题,怀疑你绘图的区域有问题,你再检查一下
CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY,497, 448);
wltg2001 2010-11-21
  • 打赏
  • 举报
回复
上面的代码弹出error3 对话框。 不知道哪里有错
========
能显示出来吗?我觉得是一定显示不出来。
linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复

CDC memDC;
CBitmap memBitmap;
if(memDC.CreateCompatibleDC(pDC))
{
AfxMessageBox("ok1");
}
else
{
AfxMessageBox("error1");
}
if(memBitmap.CreateBitmap(497,448,1,32, pBuffer))
{
AfxMessageBox("ok2");
}
else
{
AfxMessageBox("error2");
}
CBitmap* pOldBitmap= memDC.SelectObject(&memBitmap);
pDC->BitBlt(0,0,497,448,&memDC,0,0,SRCCOPY);
if(memDC.SelectObject(pOldBitmap))
{
AfxMessageBox("ok3");
}
else
{
AfxMessageBox("error3");
}
memBitmap.DeleteObject();
ReleaseDC(pDC);


上面的代码弹出error3 对话框。 不知道哪里有错。
xiaohuh421 2010-11-21
  • 打赏
  • 举报
回复
if(bm.CreateBitmap(497, 448,1,32, pBuffer))
{

CBrush brush;
if(brush.CreatePatternBrush(&bm))
{

CBrush* pOldBrush = (CBrush*)pDC->SelectObject(&brush);

pDC->FillRect(&CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY,
497, 448), &brush);

pDC->SelectObject(pOldBrush);

brush.DeleteObject();
}
bm.DeleteObject();
ReleaseDC(pDC);
}

首先,你得测试下你这个代码在正常对话框上,能不能显示出你想要的图.
如果能,那你得看看
CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY, 497, 448),
这个矩形所在的位置,是否不在你的new出来的对话框可见区域.
linuxchenyy 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 feixue5199 的回复:]
楼主,不是已经调用了GetDC了么pDC= m_pDlg->GetDC();
[/Quote]

这个是CDC,不是hdc
加载更多回复(17)

16,472

社区成员

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

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

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