tag 标签: mfc

相关博文
  • 热度 44
    2016-4-26 10:50
    1941 次阅读|
    6 个评论
      最近调了一下TQ210的mfc硬件h264编码功能,编码是成功了,但出来的视频却是花的。这个问题困扰了我很久,网上关于这方面的资料也很少,没办法只能查看s5pv210的芯片手册,功夫不负有心人,终于让我找到了原因,主要是s5pv210中MFC的帧内存格式不同造成的。   1.YV12和NV12   首先让我们了解一下s5pv210中MFC编码需要的视频格式,YV12和NV12都属于YUV420格式,每个像素占12位,其中Y占8位,每4个像素占8位的U和8位的V,平均一下就是每个像素的U和V各占2位,结构如下图所示,圈表示UV,叉表示Y。        YV12和NV12是YUV420的具体格式类型,YV12是比较常用的格式,Y分量在前面,后面是V分量,最后是U分量,具体如下图所示。        虽然YV12比较常用,但在s5pv210中用的却是NV12格式,这两种格式唯一的区别就是后面UV分量的排列上,在NV12中UV分量是分别穿插排列的,先U后V,如下图所示。        一般我们用摄像头采集到的YUV420都是YV12格式的,要想把它输入到MFC里就必须转换为NV12格式,否则编码出来的视频颜色会出问题。   2.linear和tile   这是MFC中图像存储的内存格式,这是造成编码花屏的主要原因。linear mode线性模式,也就是一般的内存格式,在上面NV12的格式图中从左到右,从上到下,依次写入MFC的内存空间。而tile mode就不一样了,喂给MFC的数据是以块的形式写入的,比如一张QCIF(176x144)的Y分量,以64x32的大小分为20块,再按一定顺序写入内存空间,具体如下图。        图片的宽度为176,所以上图右边一部分的数据用不到,留空即可。UV分量也是按章这个顺序,因为尺寸小一倍,会被分为12块。MFC使用哪种模式取决于ENC_MAP_FOR_CUR(0xF170_C51C)寄存器。   使用正确的视频格式和帧内存格式后,花屏问题终于解决了,再次庆祝一下。   文章来源:http://wuyuans.com/2013/04/s5pv210-frame-memory   供货情况:   天嵌科技提供专业嵌入式板卡和行业解决方案。如有需要,可以联系天嵌科技的销售人员。   销售电话:020-38219416 38373101   技术支持:020-38219416转807 820   网址:http://www.embedsky.com   官方淘客:https://embedsky.taobao.com/
  • 热度 17
    2014-8-17 19:46
    1520 次阅读|
    0 个评论
    核心:UpdateD(*),更新指令;FALSE是将变量映射到控件,而TRUE则是从控件到变量。     在VC里,可以为对话框上的控件设置对应的变量,如文本框可以设置对应的 CString变量,但是在程序中修改文本框的内容时,对应的CString变量不会随着改变,需要调用UpdateData(TRUE)来改变变量。类 似的,程序中改变了CString变量,也需要调用UpdateData(FALSE)也改变文本框的内容。 其他的控件都类似,如单选、复选按钮的状态和对应的BOOL变量等。 即:FALSE是将变量映射到控件,而TRUE则是从控件到变量   当你使用了ClassWizard建立了控件和变量之间的联 系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输 入了什么,就应该在访问变量前调用UpdateData(TRUE)。  1、 UpdateData(true);  用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量)  例如:你在你的窗体中有一个Edit控件,为这个控件关联了CString类型的变量m_strName;  你在控件中添入内容之后,必须调用UpdateData(true);才能把你添入的内容传给m_strName这个变量 UpdateData(false);  和上面的正好相反,还是以上面的Edit为例,当你在程序中改变了m_strName变量的内容的时候,如果你想让那个Edit也显示更新后的m_strName,就必须调用UpdateData(false);  这样在你的Edit中才能显示更新完的变量的值!  2、 UpdateData(TRUE)是将控件的状态传给其关联的变量,当然你要为控件关联上变量才行。 UpdateData(FALSE)是将控件的关联变量的值传给控件并改变控件状态。 UpdateData刷新的是当前对话框。 UpdateData(true);//用于将屏幕上控件中的数据交换到变量中。 UpdateData(false);//用于将数据在屏幕中对应控件中显示出来。 3、edit控件,与控件关联的变量m_edit,当程序执行,你在控件中输入数21,要把21传到m_edit,UpdateData(true).如果把m_edit修改,要传到控件UpdateData(false); 另外注意一点: 使用UpdateData()函数时,当前界面上所有绑定了的变量(即通过MFC ClassWizard给控件添加了对应的变量)都会被UpdateData(TRUE)更新成对应控件中的内容;同样所有绑定了变量的控件中的内容也会 UpdateData(FALSE)更新成对应变量中的内容。 要接受用户的输入就true, 要输入结果给用户就flase 数据量不多的话,最好用SetDlgItemText()和GetDlgItemText() 重要补充: GetWindowText()是获取控件当前内容(Caption或者the text within the control —for the control,具体可以查看MSDN)值,是对单个控件而言;  而UpdateData()是作用于整个CWnd的DDX数据交换机制之中的,是控件和数据的双向通道。    
  • 热度 20
    2013-12-14 16:50
    1198 次阅读|
    0 个评论
    最近要开发一个小的MFC的测试程序,需要使用动态链接库,在这里把关于静态和动态链接库的生成和使用方法总结如下: 1.静态链接库 生成: 用VC++的工程向导建立一个Win32 Static Library,勾选Precompiled header和MFC support(可以不勾选),新建相应的.h和.cpp文件,在.cpp文件当中编写需要定义的函数,在.h当中正常声明,编译生成.lib文件即可,如果勾选了 Precompiled header,则需要在.cpp文件当中包含 #include "StdAfx.h"。 在生成静态库时,经常容易出现类似如下错误: fatal error C1010: unexpected end of file while looking for precompiled header directive 问题一般发生在:通过添加文件的方式,添加了一些cpp文件到一个MFC的程序,但该cpp文件并不是MFC,而是标准的C++。  解决方案1: 右键单击项目工程中的cpp文件,在菜单Project-Settings-C/C++-Precompile Header,设置为第一项:Not using precompile headers。 解决方案2:在.cpp文件开头添加包含文件stdafx.h。 #include"stdafx.h" 使用静态链接库: 将生成库的.h和.lib两个文件文件拷贝到要使用的工程目录下,将库的.h文件添加到工程目录下,并且在要使用库的cpp文件里面包含库的.h文件,在工程设置里面设置.lib文件的路径:link--general--object/library modules,填写相应的库的lib的名称,以.lib结尾,也可以将库的.lib文件直接通过Add to projects添加到工程当中,就不需要设置路径了。 2.动态链接库 生成: 用VC++的工程向导建立一个Win32 Dynamic-Link Library ,新建.h和cpp文件,需要注意的是在.h文件的函数声明之前处需要在函数名前使用如下的声明:extern "C" _declspec(dllexport) int Add(int a,int b); 不这样声明则无法生成lib文件。 动态链接库和静态链接库的一大区别是DLL的函数实现在DLL文件中,lib文件只是一个存放函数入口地址的库,静态链接库将函数的实现直接放在lib里面。 另外,当需要在DLL中使用类以及导出类时,在声明类时在类名前使用_declspec(dllexport)即可,如class _declspec(dllexport) CMath  如果只想导出成员函数,在相应的函数定义前声明即可。 这样在使用时可以直接定义类的对象,使用所有类成员和函数。   使用: 将.h,.lib,.dll文件拷贝到要使用的工程目录下,在cpp文件里面包含.h并将.h添加到工程,如上设置.lib的路径即可直接在cpp文件当中将dll定义的函数当做全局函数使用。                
  • 热度 22
    2012-8-15 00:13
    7237 次阅读|
    1 个评论
    转 http://gongziya.com/1043/mfc%E7%9A%84serialize%E6%9C%BA%E5%88%B6%E5%8F%8A%E5%85%B6%E4%BD%BF%E7%94%A8/ MFC提供了非常方便的串行化函数Serialize()。利用这个机制可以很方便的对文档进行存取和读取。 Serialization就是面向对象世界里面的永久生存机制,对象必须能够永久生存,也就是他们必须能够在程序结束时存储到文件当中,并且能够在程序重新激活时在恢复过来,存储和恢复对象的过程在MFC称之为Serialization,负责这项重要任务的是MFC Object类中的一个名为Serialize()的虚函数,文件的读写操作均通过它来方便的完成。 一个类要支持Serializable,必须遵循以下步骤: 该类必须要继承自CObject 在该类的头文件中添加DECLARE_SERIAL宏 在该类的实现文件中添加 IMPLEMENT SERIAL宏 为该类添加一个缺省构造函数 在该类中重写Serialize( CArchive ar )函数 之后,该类就可以被Serializable。 如何使用 譬如我们新建一个MFC应用程序,为了方便处理数据,我们在程序中单独创建自己的类MyClass: 1 2 3 4 5 6 7 8 9 10 MyClass: public CObject { DECLARE_SERIAL(MyClass)     //很重要一定要加上   public :     virtual void Serialize(CArchive ar); public :     int m_iVal;     float m_fVal; }; 在实现文件中: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 IMPLEMENT_SERIAL(MyClass,CObject,1)   void MyClass::Serialize(CArchive ar) {     if (ar.IsLoading())     {        //从文件中读取数据到内存中        ar m_iVal;        ar m_fVal;     }     else if (ar.IsStoring())     {        ar m_iVal;        ar m_fVal;     } } 然后在MFC程序的C**Doc类中添加一个MyClass类型的对象myclass: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class C***Doc : public CDocument { public :    C***Doc();    DECLARE_DYNCREATE(C***Doc)   public :    MyClass myclass;   public :    virtual void Serialize(CArchive ar);   *******   } 并且在C***Doc类的Serialize()函数中调用我们的myclass对象的Serialize函数就可以永久保存myclass对象了: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 IMPLEMENT_DYNCREATE(C***Doc, CDocument)   BEGIN_MESSAGE_MAP(C***Doc, CDocument) END_MESSAGE_MAP()   IMPLEMENT_SERIAL(MyClass,CObject,1);   void C***Doc::Serialize(CArchive ar) {   if (ar.IsStoring())   {     myclass.Serialize(ar);   }   else   {     myclass.Serialize(ar);   } } 如何触发Serialize 当我们新建一个基于文档的MFC程序时,向导会自动为我们创建一些菜单,点击菜单的保存或者打开文件按钮时,内部机制自动触发Serialize函数调用,那么怎样在程序中自己触发Serialize呢? 剖开文件保存和打开内部机制(详见深入浅出MFC),对于读取文件,会得到类似这样的调用来触发Serialize加载机制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CFileException fe; CFile *pFile=GetFile( " d://file.txt " ,                CFile::modeRead | CFile::shareDenyWrite,                fe); DeleteContents(); SetModifiedFlag(); CArchive loadArchive(pFile,CArchive::load ); loadArchive.m_pDocument= this ; loadArchive.m_bForceFlat=FALSE; CWaitCursor wait; if (pFile-GetLength()!=0)     Serialize(loadArchive); loadArchive.Close(); ReleaseFile(pFile,FALSE); 类似的,可以使用下面的操作来触发Serialize保存机制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CFileException fe; CFile *pFile=GetFile( " d://file.txt " ,CFile::modeCreate|           CFile::modeWrite | CFile::shareDenyWrite,           fe); DeleteContents(); SetModifiedFlag(); CArchive saveArchive(pFile,CArchive::store ); saveArchive.m_pDocument= this ; saveArchive.m_bForceFlat=FALSE; CWaitCursor wait; if (pFile-GetLength()!=0) Serialize(saveArchive); saveArchive.Close(); ReleaseFile(pFile,FALSE); 创建MFC程序启动Logo 程序的目标是当打开建立的MFC程序时,首先会显示的是一幅位图logo,而后才显示程序界面。步骤如下:... 利用WinInet开发Internet程序      MS所提供的WinInet开发包是作为ActiveX技术中的一部分,后来MS对WinIne... CInternetSession对象... 在MFC窗口中使用OpenCV显示图像 OpenCV直接提供了函数可直接将图像写入MFC的窗口中,下面是操作的简单代码: ... VC实现对话框之间的数据通信的一种思路 在这里的两个对话框之间的通信现在只考虑从一个对话框中产生另一个对话框的这样的情况。 对于将要在... 在MFC中使用定时器 我们不使用集成开发环境提供的向导来添加定时器,而是手工在程序中添加定时器。 1、 添加WM_T... 怎样在MFC对话框上面的任意位置作画 在MFC中作画,需要将相应的绘图代码写入OnPaint() 函数里,如果在MFC对话框上有一个文本框...
相关资源