文档视界 最新最全的文档下载
当前位置:文档视界 › 利用MFC的Picture控件显示和处理图像

利用MFC的Picture控件显示和处理图像

利用MFC的Picture控件显示和处理图像
利用MFC的Picture控件显示和处理图像

利用 MFC 的 Picture 控件显示和处理图像
在《OpenCV 教程-基础篇》的 2.8 节中,所创建的 MFC 图像显示是直接放在对话框面板的左上 角的,感觉不大美观;《MFC 中快速应用 OpenCV》 则是介绍用 SDI(单文档界面)来显示图 像,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》 使用 VS2005 来进行图像和视频的读取和处理, 但是其图像和视频的显示界面不是在对话框里面 的,而是新建一个窗口来做。所以下面我们就来看看怎么在对话框里使用 Picture 控件来显示和 处理图像。 [编辑]
创建 MFC
首先创建一个 MFC 对话框应用程序(Dialog-based Application)如下:

在 VS2005 和 2008 里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上 只包含一个 Program),当我们要构建一个多 Program 的应用时(例如一个客户端程序加一个 服务器应用程序),利用 Solution 可以将这些 Projects 组合起来、并且共享文件和函数库。 通常需要为 Solution 创建一个主路径,其中包含了所有 Projects 的路径。不过在这篇文章里, 我们只构建一个简单的 Project,所以在创建 MFC 的 New Project 对话框里,不用勾选“Create directory for solution”这个选项。 点击 OK -- Next 进入下一步,在这里我们创建一个 Dialog-based Application,大部分选项按默 认设置就行,不过最下面的“Use Unicode libraries”最好去掉。如果勾选了这个选项,程序代码 就会使用 16bit 的 Unicode 字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字 符,而将字符串从 Unicode 转换到 ASCII 是非常麻烦的。使用 Unicode 在编译时可能会遇到 下列错误:
cannot convert parameter 1 from 'CString' to 'const char *' cannot convert from 'const char [11]' to 'LPCWSTR'

这意味着在 Unicode 和 Multi-byte 字符串的转换中出现了问题。 在上一篇学习笔记中, 就提到“成 员函数 LoadBMP 其输入参数类型应为 const char*”,那应该只是一个治标的方法,这里的去掉 “Use Unicode libraries”选项,才是治本之道。往后的几步设置,可以根据自己的需要来操作, 我的设置如下:

[编辑]
编写代码
在 Resource View 面板->mymfc (工程名称) ->mymfc.rc->Dialog 双击 IDD_MYMFC_DIALOG, 可以看到一个初始的 GUI 界面,往里面添加两个 Button 和 一个 Picture 控件,如下:

选中单个控件、右击选择属性(Properties),可以看到控件的 ID 号,这个号可以自行编辑,例 如 Picture 控件的 ID 号我设置为 IDC_ShowImg, 这个 ID 号在后面的图像显示函数中要用到。 首先在项目属性中加载 lib 文件: 菜单 Project -> Properties -> Configuration Properties -> Linker –> Input -> additional dependencies 中加入 cxcore200.lib cv200.lib highgui200.lib。然后在 mymfc.h 的 #include "resource.h" 下加入如下代码:
#include "cv.h" #include "highgui.h" #define IMAGE_WIDTH 256 #define IMAGE_HEIGHT 256 #define IMAGE_CHANNELS 3
在 Class View 面板右击 CmymfcDlg,选择 Add –> Add Variable,添加一个 IplImage* 类型 的变量 TheImage;再点击 CmymfcDlg,在下面窗口的列表中双击 OnInitDialog,在“// TODO: Add extra initialization here”下面添加 TheImage 的初始化代码:
CvSize ImgSize; ImgSize.height = IMAGE_HEIGHT; ImgSize.width = IMAGE_WIDTH; TheImage = cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS );
然后双击 OnPaint,在 if(IsIconic())…的 else 里添加以下代码,用来重绘窗口:
CDialog::OnPaint(); // 重绘对话框 CDialog::UpdateWindow(); // 更新 windows 窗口,如果无这步调用,图片显示还会出现问题 ShowImage( TheImage, IDC_ShowImg ); // 重绘图片函数
接着在 CmymfcApp 下面的成员列表中双击 InitInstance,在两个“// TODO: Place code here to handle when the dialog is…”下面添加:
cvReleaseImage( &dlg.TheImage );

即按下“OK”或“Cancel”时,释放 TheImage 占用的内存。接下来就是写读取和处理图片的功能函 数了。回到 mymfc 的 GUI 编辑界面中,右击按钮 ReadImg,选择 Add Event Handler,建立 按钮点击的消息响应程序:
句柄名设置为 OnBnClickedReadimg,主要的响应操作包括 弹出对话框选择图片文件、读入图 片文件、对图片统一缩放至 256*256 的大小、显示图像,代码如下:
// TODO: Add your control notification handler code here // 选项图片的约定 CFileDialog dlg( TRUE, _T("*.bmp"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("image files (*.bmp; *.jpg) |*.bmp; *.jpg | All Files (*.*) |*.*||"), NULL );

// 打开文件对话框的标题名 dlg.m_ofn.lpstrTitle = _T("Open Image"); // 判断是否获得图片 if( dlg.DoModal() != IDOK ) return; // 获取图片路径 CString mPath = dlg.GetPathName(); // 读取图片、缓存到一个局部变量 ipl 中 IplImage* ipl = cvLoadImage( mPath, 1 ); // 判断是否成功读取图片 if( !ipl ) return; // 对上一幅显示的图片数据清零 if( TheImage ) cvZero( TheImage ); // 对读入的图片进行缩放,使其宽或高最大值者刚好等于 256,再复
制到 TheImage 中
ResizeImage( ipl ); // 调用显示图片函数 ShowImage( TheImage, IDC_ShowImg ); // 释放 ipl 占用的内存 cvReleaseImage( &ipl );
其中包含了两个新的成员函数 ResizeImage 和 ShowImage,前者的作用是对读入的不同大小 的图像进行缩放, 再通过设置 ROI 的方式将图像存入 256*256 的 TheImage 中; 后者是将图 像 TheImage 显示到图片显示控件 IDC_ShouImg 窗口的正中部位。为了实现这两个功能,首 先在 Class View 面板右击 CmymfcDlg,选择 Add –> Add Function,创建两个函数:void ShowImage( IplImage* img, UINT ID ) 和 void ResizeImage(IplImage* img)。以下是这两个 函数的实现代码:
void CmymfcDlg::ResizeImage(IplImage* img) {

// 读取图片的宽和高 int w = img->width; int h = img->height; // 找出宽和高中的较大值者 int max = (w > h)? w: h; // 计算将图片缩放到 TheImage 区域所需的比例因子 float scale = (float) ( (float) max / 256.0f ); // 缩放后图片的宽和高 int nw = (int)( w/scale ); int nh = (int)( h/scale ); // 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值 int tlx = (nw > nh)? 0: (int)(256-nw)/2; int tly = (nw > nh)? (int)(256-nh)/2: 0; // 设置 TheImage 的 ROI 区域,用来存入图片 img cvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) ); // 对图片 img 进行缩放,并存入到 TheImage 中 cvResize( img, TheImage ); // 重置 TheImage 的 ROI 准备读入下一幅图片 cvResetImageROI( TheImage ); }
void CmymfcDlg::ShowImage( IplImage* img, UINT ID ) // ID 是 Picture Control 控件的 ID 号 {

// 获得显示控件的 DC CDC* pDC = GetDlgItem( ID ) ->GetDC(); // 获取 HDC(设备句柄) 来进行绘图操作 HDC hDC = pDC ->GetSafeHdc(); CRect rect; GetDlgItem(ID) ->GetClientRect( &rect ); // 求出图片控件的宽和高 int rw = rect.right - rect.left; int rh = rect.bottom - rect.top; // 读取图片的宽和高 int iw = img->width; int ih = img->height; // 使图片的显示位置正好在控件的正中 int tx = (int)(rw - iw)/2; int ty = (int)(rh - ih)/2; SetRect( rect, tx, ty, tx+iw, ty+ih ); // 复制图片 CvvImage cimg; cimg.CopyOf( img ); // 将图片绘制到显示控件的指定区域内 cimg.DrawToHDC( hDC, &rect ); ReleaseDC( pDC ); }
函数 ResizeImage 是参考了学习笔记(5)中单窗口显示多幅图像的函数 cvShowMultiImages 修改而成的,函数 ShowImage 则是参考了帖子《OpenCV 如何把图像显示到 MFC 的 picture 控件上》的代码,另外下面几个帖子也可以参考: 1、《MFC picture control 画框的问题》 2、《MFC picture control 控件实现(隐藏)文字显示》 3、《MFC 在 Picture Control 中显示图片(jpg)遇到的问题》 4、《vc 怎样在 picture control 中显示 jpg,jif,bmp 格式图象》

5、《使用 Picture Control 显示 BMP 图片》 最后是要对读入的图像做简单的 Canny 边缘处理,为此,建立一个按钮 EdgeDetect,相应的响 应代码如下:
void CmymfcDlg::OnBnClickedEdgedetect() { // TODO: Add your control notification handler code here IplImage *gray = 0, *edge = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvCanny( gray, edge, 30, 100, 3 ); cvCvtColor( edge, TheImage, CV_GRAY2BGR ); ShowImage( TheImage, IDC_ShowImg ); // 调用显示
图片函数
cvReleaseImage( &gray ); cvReleaseImage( &edge ); }
这里主要是参考了《OpenCV 教程-基础篇》P33 的代码,不过并没有像书中那样创建新的 MyIplClass 类来进行图像的读取和处理操作。我觉得这篇文章中直接对 TheImage 进行处理可 能不大妥当, 按照教程那样新建一个类来处理才是比较稳妥吧。 这里涉及到函数返回对象实例的 过程、深拷贝和浅拷贝、拷贝构造、动态内存的使用、opencv 相关接口的代码等方面,以后还 要进一步深入学习和理解! 我们还可以在 Resource View 面板->mymfc(工程名称)->mymfc.rc->Version 中修改程序的产 品版本、名称等信息。 来看看程序生成后的效果:


可以到这里下载源码: https://www.docsj.com/doc/0519434103.html,/source/1779188

mfc载入图片

我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对话框类为CTestDlg (一) 非动态载入图片. 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点击打开属性, 将type下拉框选择BITMAP,紧跟着下面就出现一个

Image下拉框, 拉开就会看到所有已经载入好的图片, 选择你要的图片.运行程序即可看到. 方法2.通过背景图 同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中 CBrush m_brBk;//在public中定义 TestDlg.cpp中 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); m_brBk.CreatePatternBrush(&bmp);

bmp.DeleteObject(); . . . return TRUE; // return TRUE unless you set the focus to a control } 在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下: HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == this) { return m_brBk; } return hbr; }

mfc中插入背景图片

1、添加背景图片到“Bitmap”资源里。方法为“插入——资源”,如果还没有Bitmap,则新建一个Bitmap,否则选择资源 类型为“Bitmap”后“引入”想要插入的背景图片,我加入的背景图片如图1,加入过程如图2。 图1

图2 说明:引入的图片可以插入256色、16位色或更高色的图片,若是其他格式图片可用PS打开再另存为BMP、24位windows格式就可 以了。提示说该资源使用了大于256色的调色板,在VC里无法编辑等等,点确定就可以了,没有影响的。 2、定位到void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码: else { //CDialog::OnPaint();//要禁止这个调用 CPaintDC dc(this); CRect rect;

GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP); //IDB_BITMAP是你自己的图对应的ID ,由于我刚刚加入的位图资源 //被我命名成了IDB_Bg,因而我这句就是bmpBackground.LoadBitmap(IDB_Bg); BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); } 3、编译运行结果如图3。

几种视频文件的插入方法

几种视频文件的插入方法: 一、avi、asf、asx、mlv、mpg、wmv等视频文件的插入方法: 1、使用PoerPoint“插入”菜单中的“插入影片”命令法方法简单常用,在这里不再赘述; 2、使用PoerPoint“插入”菜单中的“插入对象”命令法; 3、使用插入控件法 使用这种方法必须保证系统中安装有Windows MediaPlayer或者RealPlayer播放器,首先将视频文件作为一个控件插入到幻灯片中,然后通过修改控件属性,达到播放视频的目的。 步骤如下: (1)运行PowerPoint程序,打开需要插入视频文件的幻灯片; (2)打开“视图”菜单,通过“工具栏”子项调出“控件工具箱”面板,从中选择“其他控件” 按钮单击; (3)在打开的控件选项界面中,选择“Windows Media Player”选项,再将鼠标移动到PowerPoint的幻灯片编辑区域中,画出一个合适大小的矩形区域,这个矩形区域会自动转变 为Windows Media Player播放器的界面; (4)用鼠标选中该播放界面,然后单击鼠标右键,从弹出的快捷菜单中选择“属性”命令, 打开该媒体播放界面的“属性”窗口; (5)在“属性”窗口中,在“URL”设置项处正确输入需要插入到幻灯片中视频文件的详细路径(绝对路径和相对路径都可以)和完整文件名,其他选项默认即可; (6)在幻灯片播放时,可以通过媒体播放器中的“播放”、“停止”、“暂停”和“调节音量” 以及“进度条”等按钮对视频进行自如的控制。 二、rm、ra、rmvb等视频文件的插入方法 使用Windows Media Player控件可以实现mpg、asf、avi、wmv等视频文件的播放,但它不支持RM视频文件的播放,那么如何在PowerPoint中实现RM视频文件的播放呢? 如果通过其他的视频转换软件把RM视频文件转换成A VI或MPG格式的文件再插入,速度慢且转换后的文件体积也大,我们同样可以通过利用PowerPoint中的“控件工具箱”来插 入RM格式的视频文件,方法如下: 1、打开PowerPoint幻灯片文件,打开需要插入视频文件的幻灯片;

MFC背景图片修改

MFC添加背景图片方法 此文系转载,忘了博客地址了 VC++中如何给对话框加背景图片(2010-03-22 16:57:59) 方法一: 1、声明成员变量CBrush m_brush; 2、在InitDialog中添加代码: CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是图片资源ID m_brush.CreatePatternBrush(&bmp); 3、重载对话框的OnCtlColor,改最后的返回值: 1 return (HBRUSH)m_brush; 方法二: 把下面这段代码加进OnPaint()里就行了 CPaintDC dc(this); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加 CBrush brush; brush.CreatePatternBrush(&bitmap); CBrush* pOldBrush = dc.SelectObject(&brush); dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小

dc.SelectObject(pOldBrush); 方法三:使用StretchBlt()函数,具有图像自适应窗体功能 CPaintDC dc(this); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加 CBrush brush; brush.CreatePatternBrush(&bitmap); CBrush* pOldBrush = dc.SelectObject(&brush); dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小 dc.SelectObject(pOldBrush);

MFC 在对话框显示图片的多种方法

MFC 在对话框显示图片的多种方法 我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对话框类为CTestDlg (一) 非动态载入图片. 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点击打开属性, 将type下拉框选择BITMAP,紧跟着下面就出现一个

Image下拉框, 拉开就会看到所有已经载入好的图片, 选择你要的图片.运行程序即可看到. 方法2.通过背景图 同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中 CBrush m_brBk;//在public中定义 TestDlg.cpp中 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); m_brBk.CreatePatternBrush(&bmp);

bmp.DeleteObject(); . . . return TRUE; // return TRUE unless you set the focus to a control } 在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下: HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == this) { return m_brBk; } return hbr; }

监控系统安装流程(视频监控安装教程)

监控安装指导与注意事项 A、线路安装与选材 1、电源线:要选“阻燃”电缆,皮结实,在省成本前提下,尽量用粗点的,以减少电源的衰减。 2、视频线:SYV75-3线传输在300米内,75-5线传输500米内,75-7的线可传输800米;超过500米距离,就要考虑采用“光缆”。另外,要注意“同轴电缆”的质量。 3、控制线:一般选用“带屏蔽”2*1.0的线缆,RVVP2*1.0。 4、穿线管:一般用“PVC管”即可,要“埋地、防爆”的工程,要选“镀锌”钢管。 B、控制设备安装 1、控制台与机柜:安装应平稳牢固,高度适当,便于操作维护。机柜架的背面、侧面,离墙距离,考虑到便于维修。 2、控制显示设备:安装应便于操作、牢靠,监视器应避免“外来光”直射,设备应有“通风散热”措施。 3、设置线槽线孔:机柜内所有线缆,依位置,设备电缆槽和进线孔,捆扎整齐、编号、标志。

4、设备散热通风:控制设备的工作环境,要在空调室内,并要清洁,设备间要留的空间,可加装风扇通风。 5、检测对地电压:监控室内,电源的火线、零线、地线,按照规范连接。检测量各设备“外壳”和“视频电缆”对地电压,电压越高,越易造成“摄像机”的损坏,避免“带电拔插”视频线。 C、摄像机的安装 1、监控安装高度:室内摄像机的安装高度以2.5~5米,为宜,室外以3.5~10米为宜;电梯内安装在其顶部。 2. 防雷绝缘:强电磁干扰下,摄像机安装,应与地绝缘;室外安装,要采取防雷措施。 3、选好BNC:BNC头非常关键,差的BNC头,会让你生不如死,一点都不夸张。 4、红外高度:红外线灯安装高度,不超过4米,上下俯角20度为佳,太高或太过,会使反射率低。 5、红外注意:红外灯避免直射光源、避免照射“全黑物、空旷处、水”等,容易吸收红外光,使红外效果大大减弱。 6、云台安装:要牢固,转动时无晃动,检查“云台的转动范围”,是否正常,解码器安装在云台附近。

MFC设置窗体背景图片(画刷)

MFC设置窗体背景图片(画刷) 先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中: CBrush m_brBk;//在public中定义 TestDlg.cpp中: 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); m_brBk.CreatePatternBrush(&bmp); bmp.DeleteObject(); return TRUE; // return TRUE unless you set the focus to a control } 再打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(), 添加如下: HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == this) { return m_brBk; } return hbr; } 按照上面的方法一路COPY下来运行,OK!并且由于图片是做为背景显示的,所以再添的按钮都能很好的显示出来,非常方便。 总结一下其中出现的变量和函数。 CBrush:类CBrush封装了Windows图形设备接口(GDI)中的画刷,画刷也就是采取什么方案填充图形的背景的工具。 OnInitDialog ( ):用于对对话框类的变量的初始化(注意:是在产生对话框之前就初始化),是WM_INITDIALOG消息产生的消息处理函数,覆盖该函数可改变对话框初始设置。 用法: virtual BOOL OnInitDialog();返回值指定对话框是否对它的一个控件设置输入焦点。如果OnInitDialog返回非零值,Windows 将输入焦点设在对话框的第一个控件上,只有在对话框明确将输入焦点设在某控件上,应用返回0。 CBitmap:类CBitmap封装了Windows图形设备接口(GDI)中的位图,并且提供操纵位图的成员函数。 LoadBitmap ( ):CBitmap类的一个成员函数,从应用的可执行文件中加载一个命名的位图资源来初始化位图对象。 用法:

MFC添加背景图片

问题 有的程序员希望在自己的应用程序中以有趣味的位图来代替对话框中令人讨厌的灰色背景,希望位图在对话框中看起来象墙纸而且并不影响对话框中的控制或静态文本的显示。 许多程序员找不到一个改变窗口背景的简单方法,是否有方法利用Windows API 函数来改变对话框的背景为某个位图呢? 方法 改变对话框的背景为某个位图并不困难,关键是需要清楚对话框和窗口是如何设置背景颜色的,以及程序员应该如何修改对话框和窗口改变显示的行为。 当Windows 准备改变对话框背景的颜色时,通常发送两个消息给对话框。第一个消息是WM_ERASEBKGND,此消息指示对话框绘制对话框的背景颜色,以“抹去”屏幕上对话框显示区域的任何显示。 第二个消息是WM_CTLCOLOR,发送此消息给对话框或窗口来表示Windows 需要知道对话框中控制的颜色。 在本节中,将重置对消息WM_ERASEBKGND 的处理,以便将位图绘制在窗口的背景上。另外,将重置对消息WM_CTLCOLOR 的处理,以避免对话框中的控制“剪补”位图。最后的结果是对话框的背景位图绘制在对话框背景上,控制在背景位图的“上面”。 步骤 按照下列步骤实现一个例子程序。运行此例子程序,选择菜单Dialog 和菜单项Bitmap Background,将弹出一个对话框,显示背景位图和几个控制。 实现例子程序的具体步骤如下: 1.在Visual C++中,利用AppWizard 创建新的项目文件,并命名此项目文件为 Ld145。 2.进入资源编辑器并创建新的对话框模板。在对话框中,添加几个静态文本域和编辑域,以及几个单选按钮和列表框。对话框的实际组成并不重要,只要能够覆盖部分位图就可以了。 3.选择ClassWizard,为刚创建的对话框模板创建对话框类,新类命名为 CBitma PB kgdDlg。 4.在资源编辑器中创建新的位图。 5.进入ClassWizard,从下拉列表中选择CBitmapBkgdDlg,从对象列表中选择对象CBitmapBkgdDlg,从消息列表中选择消息WM_INITDIALOG,点击按钮Add Function,在CBitmapBkgdDlg 的方法OnInitDialog 中添加下列代码: BOOL CBitmapBkgdDlg::OnInitDialog() { CBitmap * pBmpOld; RECT rectClient; VERIFY(m_brush=(HBRUSH)GetStockObject(HOLLOW_BRUSH)); VERIFY(m_Bitmap.LoadBitmap(IDB_BITMAP1)); m_Bitmap.GetObject(sizeof(BITMAP),&m_bmInfo);

MFC中picture控件显示图片

PictureBox控件的主要作用是为用户显示图片。实际显示图片由Picture属性决定。Picture属性包括被显示的图片的文件名(及可选的路径名)。注意窗体对象也具有Picture属性,通过设置该属性可直接在窗体背景上显示图片。 要在运行时显示或替换图片,可利用函数LoadPicture来设置Picture属性。提供图片文件名和可选路径名,由LoadPicture函数处理加载和显示图片的细节。 picMain.Picture = LoadPicture("VANGOGH.BMP") PictureBox控件具有AutoSize属性,当该属性设置为True时,PictureBox能自动调整大小与显示的图片匹配。如果要用AutoSize属性设置为True的PictureBox,设计窗体时就需要特别小心。图片将不考虑窗体上的其它控件而调整大小,这可能导致意想不到的后果,如覆盖其它控件。设计时应通过加载每一幅图片来检查是否有这种现象发生。 vc picture控件的分类进行拉总结, (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对话框类为CTestDlg (一) vc picture控件非动态载入图片. 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2,然后在对话框上添加一个picture控件,右键点击打开属性,将type下拉框选择BITMAP,紧跟着Image下面就出现一个下拉框,拉开就会看到所有已经载入好的图片,选择你要的图片.运行程序即可看到. 方法2vc picture控件.通过背景图 同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中 CBrush m_brBk;//在public中定义 TestDlg.cpp中 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); m_brBk.CreatePatternBrush(&bmp); bmp.DeleteObject(); return TRUE; // return TRUE unless you set the focus to a control } 在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下: HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == this) { return m_brBk; } return hbr; }

MFC对话框背景---图片背景---背景色

对话框的背景 1、添加位图背景 首先在资源视图中添加bmp图片:选择项目名右击---添加—添加资源---Bitmap---导入---选择res文件中的位图(如果res文件中无位图请提前添加),此时可以知道位图ID为IDB_BITMAP1 (1)picture控件添加背景 在对话框中添加picture控件,并修改其属性,选中picture控件在属性表中修改Type为Bitmap,Image为IDB_BITMAP1。此时图片就显示在对话框中 (2)在CPP文件中初始化显示位图 添加位图后,在源文件XXXDlg.cpp的void C XXX Dlg::OnPaint()函数中添加初始化代码如下: void CbeijingDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 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; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpPri=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SR CCOPY); } }

MFC中设置对话框颜色、添加背景图片、添加音乐的方法

一、设置背景颜色的三种方法: 1、我们知道程序在运行的时候会调用OnPain函数,那么我们可以在这里设置背景颜色。void CFlipCardsDlg::OnPaint() { if (IsIconic()) { //保持不变 } else { CRect rc; GetClientRect( &rc );// 获取客户区 CPaintDC dc(this); dc.FillSolidRect(&rc, RGB(0,160,0)); // 填充客户区颜色 CDialog::OnPaint(); } } 2、第二种方法只要一条语句,但是这里要注意这里绘制的颜色是针对程序中所有的对话框(如果是单文档的话,好像不行) SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); // 前一个RGB是背景色,后一RGB是文本颜色 该函数放在工程的APP文件的初始化函数中。 3、第三种方法,利用ClassWizard重载OnCtlColor(),即WM_CTLCOLOR消息 在要着色的对话框中申明一个变量,CBRUSH m_hbrush;然后在项目的Dlg类初始化函数中给m_hbrush赋值。

m_brush.CreateSolidBrush(RGB(0, 255, 0)); 然后在OnCtlColor(...)返回该画刷就可以了,如下。 HBRUSH CFlipCardsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here switch (nCtlColor) { case CTLCOLOR_DLG: HBRUSH aBrush; aBrush = CreateSolidBrush(RGB(0, 150, 0)); hbr = aBrush; break; } // TODO: Return a different brush if the default is not desired return hbr; } 这样为对话框着色就可以实现了。 二、给MFC添加背景图图片代码: 定位到 void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码: //CDialog::OnPaint();//要禁止这个调用 CPaintDC dc(this); CRect rect; GetClientRect(&rect);

MFC中更改背景图片

1.如果你建的是对话框应用程序,可以有以下方法改变对话框的背景色重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下: ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量: class CExampleDlgDlg : public CDialog { ... protected: CBrush m_brush; ... }; ---- ②在OnInitDialog()函数中添加如下代码: BOOL CExampleDlgDlg::OnInitDialog() { ... // TODO: Add extra initialization here m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子 ... } ---- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息):HBRUSH CExampleDlgDlg::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); //在这加一条是否为对话框的判断语句 if(nCtlColor ==CTLCOLOR_DLG) return m_brush; //返加绿色刷子 return hbr; } 2.如果建立的是单文档程序 CDC* pDC = GetDC(); CRect rect; GetClientRect(&rect); //加载背景位图 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); //图片ID BITMAP bmp; bitmap.GetBitmap(&bmp);

视频监控系统控件安装(从IE访问)

使用IE访问监控设备的时候,会自动从设备上下载控件并自动注册。当控件HCNetVideoActiveX.cab没有下载或注册成功的时候,则不能正常访问设备。 安装HCNetVideoActiveX.cab控件的方法如下: 1.使用IE访问前的注意事项: 降低IE的安全级别,选择IE“工具”->“Internet选项”->“安全”->“自定义级别”,将涉及到控件下载运行和脚本运行的选项都设置成“启用”和“提示”。然后再打开监控的IP地址,会自动安装控件。 2.使用IE访问的时候提示“网页上有错误”或者有“×”的显示 出现该情况,很有可能是控件没有下载成功或则有残余的控件相关内容没有删除。可参考3.清除控件的方法进行清除处理后,在设置安全级别后进行访问。 3.清除控件的方法: 1.关闭IE,进入Windows系统目录下,找到Downloaded ProgramFiles文件夹中的相关控件信息是否还在,若在,将其删除。(HCNetVideoActiveX.cab对应HCNetVideoActiveX Control,NewHCNetActiveX.cab对应NewHCNetActiveX Control) 2.进入system32文件夹下,确认是否还有残留的相关文件,若存在将其删除。如果是XP 的操作系统,还需要将Windows下LastGood文件夹中的相关文件删除。 HCNetVideoActiveX.cab的相关文件是 HCNetVideoActiveX.ocx,HCNetSDK.dll,playm4.dllShowHCRemCfgWnd.dll RemoteCfgRes_CHI.dll,RemoteCfgRes_ENG.dll,RemoteCfgRes_TRAD.dll. NewHCNetActiveX.cab的相关文件是 newocx.ocx,HCNetSDK.dll, playm4.dll,langchg.dll,ShowHCRemCfgWnd.dll,RemoteCfgRes_CHI.dll, RemoteCfgRes_ENG.dll,RemoteCfgRes_TRAD.dll. 3.在“开始”的“运行”中输入:regedit进入注册表,在“我的电脑”下的第一个文件夹“HKE_CLASSES_ROOT”下查找相关内容,如果存在,则是控件手动注册后,没有手动注销掉,需要用手动注销控件方法将其销毁。 说明:该情况一般适用于有我们提供的控件包,并使用其进行手动注册的情况。具体方法见4.手动注册的方法。 4.如果完成上述步骤后,还是无法下载控件,建议重启下电脑或换台电脑测试。IE浏览涉及到的内容较多,系统其他的插件有可能造成OCX控件下载不成功。 4.手动注册的方法:

MFC 对话框 背景图片 以及消除 字体重影 字体重叠

很多人都想改变对话框的背景图,其实很简单,只需要一个函数就可以了,不过还是有问题的,下面讲述。 只需要响应WM_ERASEBKGND消息,然后重载OnEraseBkgnd(CDC*pDC)这个函数就可以,首先我们要添加消息响应,由于该消息不能用MFC ClassWizard添加,因为ClassWizard 没有该消息添加的选项,我们需要手动添加,只需要在消息响应MAP添加一下ON_WM_ERASEBKGND(),如下所示: BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog) //{{AFX_MSG_MAP(CSerialTestDlg) ON_WM_ERASEBKGND()//添加重绘背景消息响应 //}}AFX_MSG_MAP END_MESSAGE_MAP() 我们然后进行消息响应,添加消息响应函数,然后在对话框类的声明文件添加该函数的声明virtual BOOL OnEraseBkgnd(CDC*pDC);在实现文件中进行该函数的书写,如: BOOL CSerialTestDlg::OnEraseBkgnd(CDC*pDC) { CBitmap m_bitmap; m_bitmap.LoadBitmap(IDB_DLGBK);//加载背景图片,选择你对应的图片ID CDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC); dcCompatible.SelectObject(&m_bitmap); CRect rect; GetWindowRect(&rect); ScreenToClient(&rect);//选择客户区域 BITMAP bmp; m_bitmap.GetBitmap(&bmp); pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmW idth,bmp.bmHeight,SRCCOPY);//绘制BMP背景图 m_bitmap.DeleteObject(); return TRUE; } 但是这样做一般就可以,细心的人会发现字体有重叠,比如说静态文本框和EDIT控件,如果选择只读模式,作为输出,这时EDIT的背景是BMP背景图片,但是字体重叠,如下图,我这样就行消除。

mfc背景音乐与图片的实现

MFC播放声音文件 一.播放声音文件的简单方法 在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名,hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。例如播放C:\sound\music.wav可以用sndPlaySound ( "c:\\sound\\music.wav ",SND_ASYNC);或PlaySound( "c:\\sound\\music.wav ",NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。 二.将声音文件加入到程序中 在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE 文件,实现无.WAV文件的声音播放。 要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句: PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_ RESOURCE|SND_NODEFAULT|SND_LOOP); 其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄, SND_RESOURCE是必须的标志。 作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:1.获得包含资源的模块句柄: HMODULE hmod=AfxGetResourceHandle();

Cinestyle(佳能插件)简介和前期安装详解

Cinestyle简介和前期安装详解 Cinestyle是由Technicolor公司发布的一个针对Canon单反视频用户开发的颜色分级工具。通过使用Cinestyle加上后期的LUT,可以让佳能单反相机拍摄的视频获得更大的动态范围,更平滑的明暗过渡,更多的画面细节,以及更少的噪点。Cinestyle是针对5D Mark II开发的,但同样适用7D,550D,60D等其它Canon单反,它可以明显有效的提升单反视频的画质,就像是Red 的HDRx,或Sony的S-Log。 自从几个月前Cinestyle发布以来,着实在单反视频的世界里引起了一场不小的轰动。现在再来讲Cinestyle似乎晚了点,网上到处都是相关的信息,很多朋友也已经熟知Cinestyle的使用了。不过最近还是连续有人来问我相关的问题,很多入门级的朋友希望能有更加简明的操作指南。为了节省这些朋友和我自己的时间,我现在把Cinestyle前后期的使用方法写在这里。 这个工具的使用方法是:先将Cinestyle文件作为一个画面风格档导入相机之中,前期使用该风格档拍摄,会得到一个非常“平”的画面,保留更多的细节,保留更大的动态范围。进入后期制作时,可以在编辑软件或调色软件中调用LUT文件或直接使用调色软件来进行调整,达到理想的画面效果。 前期安装详解: 1、免费下载的Cinestyle工具。先到 https://www.docsj.com/doc/0519434103.html,/en/hi/theatrical/visual-post-production/digit al-printer-lights/cinestyle,填写一些信息后会进入下载页面。

如何给MFC对话框添加背景图片

如何给MFC对话框添加背景图片 2009年11月09日星期一 13:08 1、添加背景图片到“Bitmap”资源里。方法为“插入——资源”,如果还没有Bitmap,则新建一个Bitmap,否则选择资源 类型为“Bitmap”后“引入”想要插入的背景图片,我加入的背景图片如图1,加入过程如图2。 图1

图2

说明:引入的图片可以插入256色、16位色或更高色的图片,若是其他格式图片可用PS打开再另存为BMP、24位windows格式就可 以了。提示说该资源使用了大于256色的调色板,在VC里无法编辑等等,点确定就可以了,没有影响的。 2、定位到 void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码: else { //CDialog::OnPaint();//要禁止这个调用 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP); //IDB_BITMAP是你自己的图对应的ID ,由于我刚刚加入的位图资源 //被我命名成了IDB_Bg,因而我这句就是bmpBackground.LoadBitmap(IDB_Bg);

BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); } 3、编译运行结果如图3。

VC添加背景图

https://www.docsj.com/doc/0519434103.html,/weiloujushi/blog/item/7a4 d1943f1561d159213c67a.html图解 https://www.docsj.com/doc/0519434103.html,/s/blog_618b45a00100hu 9d.html VC++中如何给对话框加背景图片 (2010-03-22 16:57:59) 转载 分类:MFC/Windows 标签: it 方法一: 1、声明成员变量CBrush m_brush; 2、在InitDialog中添加代码: CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加 m_brush.CreatePatternBrush(&bmp); 3、重载对话框的OnCtlColor,改最后的返回值: return (HBRUSH)m_brush; 方法二:

把下面这段代码加进OnPaint()里就行了 CPaintDC dc(this); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加 CBrush brush; brush.CreatePatternBrush(&bitmap); CBrush* pOldBrush = dc.SelectObject(&brush); dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小 dc.SelectObject(pOldBrush); 方法三:使用StretchBlt()函数,具有图像自适应窗体功能 CPaintDC dc(this); CBitmap m_bmpBK; m_bmpBK.LoadBitmap(IDB_BITMAP1); CRect rect; GetClientRect(&rect);//获得目标尺寸,即窗口客户区的坐标 BITMAP bitMap;//位图结构体 m_bmpBK.GetBitmap(&bitMap);//获得原图片尺寸 CDC dcMem; //目标DC dcMem.CreateCompatibleDC(&dc); //创建与dc兼容的内存DC dcMem.SelectObject(&m_bmpBK);//将位图对象m_bmpBK选入内存DC dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SR CCOPY); 函数参考: GetClientRect

MFC单文档添加背景图片

MFC单文档添加背景图片 2009-05-08 10:50 改变视图单调的背景 1; 我们在用Visual C++写程序时,会看到她自动产生的界面背景非常的单调,我们可以自己来改变这个问题来实现美丽的背景,希望本文对初学者有所帮助。 本文代码运行效果图如下 下面来跟我做: 1.首先准备好一张美丽的图片,保存为BMP格式。 2.新建一个工程,命名为:test ,在资源编辑里用Import导入刚才准备好的位图文件.ID为IDB_BITMAP 如果位图是大于16色的,会出现无法显示的提示。不要紧,这并不影响程序最终的显示。 3.代码实现 3.1 我们为CTestView类添加一个变量 CBrush m_brushBackground;这个画刷就是用于画背景的。 3.2 我们在CTestView的构造函数中加入如下代码: CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP); ///加载位图 m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷 3.3 接着我们需要在OnDraw函数中画出来,代码如下: CRect rect; GetClientRect(rect);///取得客户区域 pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域 3.4 为了避免背景的闪烁,使显示更加完美,我们添加WM_ERASEBKGND消息的处理函数,并取消调用父类的处理函数,代码如下: BOOL CTestView::OnEraseBkgnd(CDC* pDC) {

相关文档
相关文档 最新文档