导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

为什么不显示图像?奇诡

deirdre 2010-08-01 09:03:34

我仿照《向世明 VisualC++ 数字图像与图形处理》第一章显示图像的代码,但是我的图像就是显示不出来。
我的关键代码如下,请高手指教,在线等

void CMyDispModeView::OnDraw(CDC* pDC)
{
CMyDispModeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// if (!pDoc)
// return;

// TODO: 在此处为本机数据添加绘制代码
CDib *pDib = pDoc->m_pDib;
if (pDib)
{
int nWidth = pDib->GetWidth();
int nHeight = pDib->GetHeight();

CDC memDc;
memDc.CreateCompatibleDC(pDC);

CBitmap *pOldBitmap = memDc.SelectObject(&m_Bitmap);
pDib->Draw(memDc.m_hDC,0,0,nWidth,nHeight,0,0,nWidth,nHeight,DIB_RGB_COLORS,SRCCOPY);
int nOldBKMode = memDc.SetBkMode(TRANSPARENT);
pDC->BitBlt(0,0,800,600,&memDc,0,0,SRCCOPY);
memDc.SelectObject(pOldBitmap);
memDc.SetBkMode(nOldBKMode);

}
}

int CMyDispModeView::OnCreate(LPCREATESTRUCT lpcs)
{
CClientDC dc(this);
m_Bitmap.CreateCompatibleBitmap(&dc,800,600);

CDC memDC;
memDC.CreateCompatibleDC(&dc);

CBitmap *pOld = memDC.SelectObject(&m_Bitmap);
CBrush *pBrush = new CBrush(RGB(255,255,255));
CRect rect(0,0,800,600);
memDC.FillRect(rect,pBrush);

memDC.SelectObject(pOld);
delete pBrush;
ReleaseDC(&dc);
return 0;

}

void CMyDispModeDoc::OnFileOpen()
{
CFileDialog fileDlg(TRUE,L"bmp",L"*.bmp",NULL,L"Bitmap Files(*.bmp)",NULL);
int Respond = (INT)fileDlg.DoModal();
if (Respond == IDOK)
{
CString filesz = fileDlg.GetPathName();
char szFileNm[_MAX_FNAME] = {0};
WideCharToMultiByte(CP_ACP,0,filesz.GetBuffer(),filesz.GetLength(),szFileNm,_MAX_FNAME,NULL,NULL);
m_pDib = new CDib(szFileNm);
if (m_pDib->IsValid())
{
SetTitle(filesz);
}
else
DeleteContents();
}
UpdateAllViews(0);
}
...全文
107 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
deirdre 2010-08-03

void CMyDispModeView::OnDraw(CDC* pDC)
{
CMyDispModeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// if (!pDoc)
// return;

// TODO: 在此处为本机数据添加绘制代码
CDib *pDib = pDoc->m_pDib;
CBitmap bmp;
if (pDib)
{
int nWidth = pDib->GetWidth();
int nHeight = pDib->GetHeight();

CDC memDc;
memDc.CreateCompatibleDC(pDC);

bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);
CBitmap *pOldBitmap = memDc.SelectObject(&bmp);
pDib->Draw(memDc.GetHDc(),0,0,nWidth,nHeight,0,0,nWidth,nHeight,DIB_RGB_COLORS,SRCCOPY);
int nOldBKMode = memDc.SetBkMode(TRANSPARENT);
pDC->BitBlt(0,0,800,600,&memDc,0,0,SRCCOPY);
bmp.DeleteObject();
memDc.SelectObject(pOldBitmap);

这样写就显示OK了,但是当改变窗口大小时,会发生闪烁。奇怪,我不是已经用到了双缓冲了吗?
}
回复
zhangkaial 2010-08-03
CRect winrect,clientrect;
GetWindowRect(winrect);
GetClientRect(clientrect);
CWindowDC windowdc(this);
CBitmap bmp;
bmp.LoadBitmap(IDB_Title);
BITMAP bitmap;
bmp.GetBitmap(&bitmap);
CDC memDC;
memDC.CreateCompatibleDC(&windowdc);
memDC.SelectObject(&bmp);
windowdc.StretchBlt(0,0,winrect.Width(),title_cy+9,&memDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
bmp.DeleteObject();
//////////////////////
回复
na_he 2010-08-03
检查读取文件到bitmap结构体的部分.
回复
deirdre 2010-08-03

哦,MYGOD, 我不知道如何传入HBITMAP的参数了。毕竟是用到了别人的第三方文件。

我发现
//CBitmap *pOldBitmap = memDc.SelectObject(&m_Bitmap); TMD这根本没用
pDib->Draw(pDC->GetSaftHdc(),0,0,nWidth,nHeight,0,0,nWidth,nHeight,DIB_RGB_COLORS,SRCCOPY);
// 在Draw函数中调用了StretchDIBits(hdc,.......);
//pDC->BitBlt(0,0,800,600,&memDc,0,0,SRCCOPY); 这句也可以屏蔽掉。

但是这样当调整大小时会有些闪烁,如何用到memdc呢?


回复
lazy_2010 2010-08-03
那你用下面的函数调试输出你的 bitmap 看看是否图像载入存在问题吧。

void DebugShowBmp(HBITMAP hBmp)
{
HDC hDC = GetWindowDC(NULL);
if (hDC == NULL)
return;
BITMAP bmp = {0};
GetObject(hBmp, sizeof(BITMAP), &bmp);

HDC hCreate = CreateCompatibleDC(hDC);
if (hCreate != NULL)
{
HGDIOBJ hOld = SelectObject(hCreate, hBmp);
BitBlt(hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hCreate, 0, 0, SRCCOPY);
SelectObject(hCreate, hOld);
DeleteDC(hCreate);
}

ReleaseDC(NULL, hDC);
}
回复
deirdre 2010-08-03
[Quote=引用 6 楼 lazy_2010 的回复:]
给你的函数是输出到屏幕上左上角查看的,别修改了,那个就是通用的输出 HDC 的函数。
[/Quote]

我没有修改您的函数,这样调用:
DebugShowDC(memDc.GetSafeHdc());
pDib->Draw(memDc.m_hDC.....)
//DebugShowDC(memDc.GetSafeHdc());或者这样调用。
在屏幕的左上角都是没有图像显示的。
我的补充一下基础知识了,太诡异了。在线等。

回复
lazy_2010 2010-08-03
重载 WM_ERASEBKGND 消息了没?
回复
lazy_2010 2010-08-02
是让你调试的时候,在 pDib->Draw 之前和之后,看看 HDC 的图像


void DebugShowDC(HDC hDCShow)
{
HDC hDC = GetWindowDC(NULL);
if (hDC == NULL)
return;

BITMAP bmp;
HBITMAP hBmp = CreateCompatibleBitmap(hDCShow, 1, 1);
HBITMAP hShowBmp = (HBITMAP)SelectObject(hDCShow, hBmp);
GetObject(hShowBmp, sizeof(BITMAP), &bmp);
SelectObject(hDCShow, hShowBmp);
DeleteObject(hBmp);

BitBlt(hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCShow, 0, 0, SRCCOPY);
ReleaseDC(NULL, hDC);
}
回复
deirdre 2010-08-02
[Quote=引用 1 楼 lazy_2010 的回复:]
没看过这本书,

pDib->Draw(memDc.m_hDC,...);

这个函数执行正确吗?

试一试讲 memDc 输出到屏幕上看看。
[/Quote]

已经有这么一句了:
pDC->BitBlt(0,0,800,600,&memDc,0,0,SRCCOPY);

楼上:不是采用LoadBitmap的方式。

回复
deirdre 2010-08-02
加入ON_WM_CREATE,怎么这里会出错:
void CMyDispModeView::OnDraw(CDC* pDC)
{
CMyDispModeDoc* pDoc = GetDocument();//出错行。
ASSERT_VALID(pDoc);
}

BEGIN_MESSAGE_MAP(CMyDispModeView, CView)
// 标准打印命令
//ON_WM_CREATE()
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
END_MESSAGE_MAP()
回复
lazy_2010 2010-08-02
给你的函数是输出到屏幕上左上角查看的,别修改了,那个就是通用的输出 HDC 的函数。
回复
deirdre 2010-08-02
[Quote=引用 4 楼 lazy_2010 的回复:]
是让你调试的时候,在 pDib->Draw 之前和之后,看看 HDC 的图像


C/C++ code

void DebugShowDC(HDC hDCShow)
{
HDC hDC = GetWindowDC(NULL);
if (hDC == NULL)
return;

BITMAP bmp;
HBITMAP hBmp……
[/Quote]

我加了下边的函数,在pDib->Draw 前后,看到还是没有输出。怎么办?
void CMyDispModeView::DebugShow(HDC hdShow)
{
CDC *dc = CWnd::GetWindowDC();
BITMAP bmp;
HBITMAP hBmp = CreateCompatibleBitmap(hdShow,1,1);
HBITMAP hShowBmp = (HBITMAP)SelectObject(hdShow,hBmp);
GetObject(hdShow,sizeof(BITMAP),&bmp);
SelectObject(hdShow,hShowBmp);

BitBlt(dc->m_hDC,0,0,bmp.bmWidth,bmp.bmHeight,hdShow,0,0,SRCCOPY);
DeleteObject(hBmp);
ReleaseDC(dc);
}
回复
蒙飞鸿 2010-08-01
m_Bitmap LoadBitmap正确了吗
回复
lazy_2010 2010-08-01
没看过这本书,

pDib->Draw(memDc.m_hDC,...);

这个函数执行正确吗?

试一试讲 memDc 输出到屏幕上看看。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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