首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

在对话框初始化时添加如上代码,为什么不能在静态文本控件显示图片

2012-12-29 
在对话框初始化时添加如下代码,为什么不能在静态文本控件显示图片?CWnd * pWndShowCDC *pDCShowpWndShow

在对话框初始化时添加如下代码,为什么不能在静态文本控件显示图片?
CWnd * pWndShow;
CDC *  pDCShow;
pWndShow = GetDlgItem(IDC_STATIC_PICTURE);  // 得到控件的窗口句柄  static text控件ID
pDCShow  = pWndShow->GetDC();  //  GetDC取得与窗口客户区相关的dc

CDC  memDC;  //声明内存DC
CRect rect;   
CBitmap memBmp;//声明一个位图 
pWndShow->GetClientRect(rect);//得到显示图片的区域
memDC.CreateCompatibleDC(pDCShow);   //创建一个与指定设备兼容的内存设备上下文环境DC
memBmp.CreateCompatibleBitmap(&memDC, rect.Width(), rect.Height());  //创建一个兼容位图
/*pWndShow->UpdateWindow(); */  //更新窗口

memDC.FillSolidRect(rect, RGB(255,255,255));//用指定的固体色填充矩形
memDC.SetBkMode(TRANSPARENT);//透明填充

// 将内存DC中的内容拷贝到设备DC中
pDCShow->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

// 最后一次把位图拷到屏幕DC上
/*memBmp.DeleteObject();
memDC.DeleteDC();
pWndShow->ReleaseDC(pDCShow); */


//HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, IDB_BITMAP1, 0, NULL, 0);
 //   HBITMAPhm_hBitmap = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);
//
 pWndShow->UpdateWindow();   //更新窗口
[解决办法]
显示图片不难
没细看楼主的代码,我想楼主应该能够定义一个按钮,点击这个按钮就显示图片

之所以不能在对话框初始化的时候显示图片,原因在于“重绘”
没错,屏幕上各种图形都是临时放置的,只要被新的图形覆盖就会消失,所以每个窗口的刷新显示和改变实际上都在不停的重绘屏幕上的图形
楼主也许在初始化函数中成功的画出了一个图形,但转眼它就被窗口的刷新覆盖掉了
用按钮画出的图形,因为此时窗口已经稳定,不需要频繁重绘,所以可以保留,但只要你用其他窗口覆盖掉图形的一部分,再把那个窗口移开,此时图形所在的窗口就会自动重绘窗口——而你画出的图形就没戏了

所以,要在窗口上绘制图形,或者显示图片(本质上也就是个复杂图形),一般有两种方法
第一,不停绘制,例如实时采集图像,采集一张绘制一张,窗口重绘比不上你画的频繁,你画的图形就停留在屏幕上了
第二,在窗口重绘时顺便重绘你的图形,例如对话框,就要在OnPaint()函数中添加绘制代码,这样每次窗口重绘的时候,都会顺便把你的图形绘制出来

当然,比较复杂的视频显示3D图形等等,各有各的专门处理方法
这里说的只是使用MFC窗口时的简单图形绘制方法。

热点排行