SDI实现多视图并切换视图

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

 

 

 

 

    Visual Studio 2010的新特性里面Ribbon界面是一个很重要的东西,Ribbon界面非常易用和高效,也不去强调和证明它将成为未来应用程序界面的一种趋势。为了让我们的应用程序“Ready for Windows 7”,我们有必要根据实际的情况需要,为我们的应用程序添加Ribbon界面。

 为了推广Ribbon界面,为了讨好程序员们,让程序员可以轻松地为各种应用程序创建Ribbon界面,微软真是不遗余力,不断地推出新的Ribbon界面接口。为了可以让所有基于C++的普通Windows应用程序都可以添加Ribbon界面,微软在Windows 7 SDK中,又推出了基于COM的接口——Scenic Ribbon API。

  利用Scenic Ribbon API,我们可以更加灵活方便地为各种Windows应用程序添加Ribbon界面,改善应用程序的用户体验。在接下来的文章中,我们就介绍一下如何利用这种新的方式为普通Windows应用程序添加Ribbon界面。

  我们都知道,Ribbon界面是随着Office 2007一同发布的。在过去的几年中,微软不断地吸取用户对Ribbon界面的反馈,不断地对其进行改进,到了Windows 7,微软正式加入了命名为Scenic Ribbon的第二代Ribbon界面,即取代第一代Ribbon的升级版本。随着Scenic Ribbon成为Windows 7的一部分以及微软所提供的Scenic Ribbon API,这意味着今后第三方程序开发者能在自己开发的应用程序中免费用上这种界面形式。Scenic Ribbon作为第二代Ribbon界面,所适用的是所有的Windows应用程序,和前代有所不同是理所当然的。例如,由于最初Ribbon界面是Office专用,因此使用Ribbon界面的Office 2007程序窗口左上角都有一个比较显眼的Office图标按钮。当应用到其他程序之后,这个图标显然不能继续存在,因此在Scenic Ribbon中,这个位置就被相应应用程序自身的图标所取代。另外,为了满足各种应用程序的需要,Scenic Ribbon还添加了部分Ribbon控件,使得Ribbon界面的控件更加丰富,能够应对各种应用程序对Ribbon界面控件的需要。值得一提的是,Office作为Ribbon界面的开山鼻祖,到了Office的下一个版本Office 2010,也全面使用了Scenic Ribbon以替代第一代Ribbon界面。

   同时微软在VisualC++2010也提供了Ribbon资源设计器,使Ribbon开发更加简单快捷。

 Scenic Ribbon API是一套基于COM的非托管API。通过这套API,我们可以为所有基于Windows的非托管应用程序创建Ribbon界面面板,添加Ribbon控件,处理Ribbon控件的各种动作,执行某种业务逻辑等等。而至于Ribbon界面的布局,各个控件的位置和属性等,则是通过基于XAML的xml文件来进行定义和描述的。编译器会将这个XML文件编译成相应的资源文件,头文件和二进制的BML文件。而Scenic Ribbon API最终会读取这些描述控件信息的文件并创建Ribbon界面。在业务逻辑层,Scenic Ribbon API提供了相应的Execute函数来处理所有控件的消息,在其中我们可以完成相应的业务逻辑。

在Windows 7中,微软还为我们提供了用于为非托管代码(Native)应用程序创建Ribbon界面的Scenic Ribbon API的解决方案。另外,针对基于WPF的托管代码应用程序,微软还将提供另外的基于WPF的Ribbon界面解决方案。

Firefox 3.7已经采用Windows7的Ribbon界面。

   下面我们亲自来动手构建一个基于VisualC++2010开发windows7的tabelt pc应用的WindowsRibbon范例

    1.帅气的VS2010启动画面,启动VS2010

    2.创建inkdoc的MFC工程

 

3.MFC向导1

4.MFC向导2,选择中文界面,多文档程序,以及windows7风格

5.MFC向导3,跳过

 

6.MFC向导4,创建文档格式,文件名

7.MFC向导5。跳过

8.MFC向导6,选择Ribbon

9.MFC向导7,设置高级选项

10.MFC设置8,设置CFORMVIEW,

 

11.打印提示,不理睬,直接跳过

 

 

 

12.VisualC++2010自带的Ribbon编辑器

 

 

 

 13.操作与工具箱控件一样操作,设置按钮属性

 

 

 

 

 14.设置按钮

 

15.设置按钮属性,

 

16.为按钮添加事件

 

 

 

 

17.类似菜单的操作

 

 

18.在Formview,选择对话框,插入flash控件,然后为flash添加MFC   activeX  类向导

 

 

19.插入flash控件类

 

 

 

帅的惊动了CSDN的windows7的tabelt pc应用的WindowsRibbon范例的效果图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tablet PC的轨迹核心代码如下

  1. #include <windows.h>     
  2. #include <comdef.h>     
  3. #include <msinkaut.h>     
  4. #include <msinkaut_i.c>  //包含windows SDK  for windows7的核心tabletpc头文件     
  5. #include "resource.h"     
  6.     
  7.     
  8. const TCHAR*    gc_szAppName = TEXT("Basic Recognition");     
  9.     
  10. // 建立轨迹指针,识别指针,轨迹画板指针     
  11. IInkCollector *     g_pIInkCollector    = NULL;     
  12. IInkDisp *          g_pIInkDisp         = NULL;     
  13. IInkRecognizerContext *   g_pIInkRecoContext  = NULL;     
  14.       
  15. //定义初始化变量     
  16. const LPOLESTR gc_pwsInputScopes[] = {     
  17.     L"(!IS_DEFAULT)",     
  18.     L"(!IS_URL)",     
  19.     L"(!IS_FILE_FULLFILEPATH)",     
  20.     L"(!IS_FILE_FILENAME)",     
  21.     L"(!IS_EMAIL_USERNAME)",     
  22.     L"(!IS_EMAIL_SMTPEMAILADDRESS)",     
  23.     L"(!IS_LOGINNAME)",     
  24.     L"(!IS_PERSONALNAME_FULLNAME)",     
  25.     L"(!IS_PERSONALNAME_PREFIX)",     
  26.     L"(!IS_PERSONALNAME_GIVENNAME)",     
  27.     L"(!IS_PERSONALNAME_MIDDLENAME)",     
  28.     L"(!IS_PERSONALNAME_SURNAME)",     
  29.     L"(!IS_PERSONALNAME_SUFFIX)",     
  30.     L"(!IS_ADDRESS_FULLPOSTALADDRESS)",     
  31.     L"(!IS_ADDRESS_POSTALCODE)",     
  32.     L"(!IS_ADDRESS_STREET)",     
  33.     L"(!IS_ADDRESS_STATEORPROVINCE)",     
  34.     L"(!IS_ADDRESS_CITY)",     
  35.     L"(!IS_ADDRESS_COUNTRYNAME)",     
  36.     L"(!IS_ADDRESS_COUNTRYSHORTNAME)",     
  37.     L"(!IS_CURRENCY_AMOUNTANDSYMBOL)",     
  38.     L"(!IS_CURRENCY_AMOUNT)",     
  39.     L"(!IS_DATE_FULLDATE)",     
  40.     L"(!IS_DATE_MONTH)",     
  41.     L"(!IS_DATE_DAY)",     
  42.     L"(!IS_DATE_YEAR)",     
  43.     L"(!IS_DATE_MONTHNAME)",     
  44.     L"(!IS_DATE_DAYNAME)",     
  45.     L"(!IS_DIGITS)",     
  46.     L"(!IS_NUMBER)",     
  47.     L"(!IS_ONECHAR)",     
  48.     L"(!IS_TELEPHONE_FULLTELEPHONENUMBER)",     
  49.     L"(!IS_TELEPHONE_COUNTRYCODE)",     
  50.     L"(!IS_TELEPHONE_AREACODE)",     
  51.     L"(!IS_TELEPHONE_LOCALNUMBER)",     
  52.     L"(!IS_TIME_FULLTIME)",     
  53.     L"(!IS_TIME_HOUR)",     
  54.     L"(!IS_TIME_MINORSEC)",     
  55.     L"((0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9) ?-? ?)?(0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9) ?-? ?(0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9) ?(0|1|2|3|4|5|6|7|8|9)",     
  56.     L"(!IS_PERSONALNAME_FULLNAME)|((!IS_PERSONALNAME_PREFIX)? +(!IS_PERSONALNAME_GIVENNAME)+ +(!IS_PERSONALNAME_MIDDLENAME)* +(!IS_PERSONALNAME_SURNAME)+)",     
  57.     L"MN(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(A|B)(!IS_DIGITS)(X|Y)((0|1)*)"    
  58. };     
  59.     
  60.     
  61. const LONG gc_lMaxInputScopeMenuItemLength = 40;     
  62.     
  63. // 定义笔势常量     
  64. const InkApplicationGesture gc_igtSingleStrokeGestures[] = {     
  65.     IAG_Scratchout, IAG_Triangle, IAG_Square, IAG_Star, IAG_Check,     
  66.     IAG_Circle, IAG_DoubleCircle, IAG_Curlicue, IAG_DoubleCurlicue,     
  67.     IAG_SemiCircleLeft, IAG_SemiCircleRight,     
  68.     IAG_ChevronUp, IAG_ChevronDown, IAG_ChevronLeft,     
  69.     IAG_ChevronRight, IAG_Up, IAG_Down, IAG_Left, IAG_Right, IAG_UpDown, IAG_DownUp,     
  70.     IAG_LeftRight, IAG_RightLeft, IAG_UpLeftLong, IAG_UpRightLong, IAG_DownLeftLong,     
  71.     IAG_DownRightLong, IAG_UpLeft, IAG_UpRight, IAG_DownLeft, IAG_DownRight, IAG_LeftUp,     
  72.     IAG_LeftDown, IAG_RightUp, IAG_RightDown, IAG_Tap     
  73. };     
  74.     
  75. const UINT gc_nRecommendedForMixedMode[] = {     
  76.         0 /*Scratchout*/, 3/*Star*/, 6/*Double Circle*/,     
  77.         7 /*Curlicue*/, 8 /*Double Curlicue*/, 25 /*Down-Left Long*/ };     
  78.     
  79. const InkApplicationGesture gc_igtMultiStrokeGestures[] = {     
  80.     IAG_ArrowUp, IAG_ArrowDown, IAG_ArrowLeft,     
  81.     IAG_ArrowRight, IAG_Exclamation, IAG_DoubleTap     
  82. };     
  83.     
  84.     
  85. const _ATL_FUNC_INFO IInkRecognitionEventsImpl<CAdvRecoApp>::mc_AtlFuncInfo =     
  86.         {CC_STDCALL, VT_EMPTY, 3, {VT_UNKNOWN, VT_VARIANT, VT_I4}};     
  87.     
  88. const _ATL_FUNC_INFO IInkCollectorEventsImpl<CAdvRecoApp>::mc_AtlFuncInfo[2] = {     
  89.         {CC_STDCALL, VT_EMPTY, 3, {VT_UNKNOWN, VT_UNKNOWN, VT_BOOL|VT_BYREF}},     
  90.         {CC_STDCALL, VT_EMPTY, 4, {VT_UNKNOWN, VT_UNKNOWN, VT_VARIANT, VT_BOOL|VT_BYREF}}     
  91. };     
  92.     
  93. const TCHAR gc_szAppName[] = TEXT("CSDN专家尹成的程序,http://blog.csdn.net/yincheng01");     
  94. /     
  95. //     
  96.     
  97. //清除Com指针     
  98. /     
  99. void Cinkdoc::CleanUp()  // Release all objects     
  100. {     
  101.     if (g_pIInkRecoContext != NULL)     
  102.     {     
  103.         g_pIInkRecoContext->Release();     
  104.         g_pIInkRecoContext = NULL;     
  105.     }     
  106.     
  107.     if (g_pIInkDisp != NULL)     
  108.     {     
  109.         g_pIInkDisp->Release();     
  110.         g_pIInkDisp = NULL;     
  111.     }     
  112.     
  113.     if (g_pIInkCollector != NULL)     
  114.     {     
  115.         g_pIInkCollector->Release();     
  116.         g_pIInkCollector = NULL;     
  117.     }     
  118. }     
  119. void Cinkdoc::Reco()  //识别  
  120. {     
  121.   //获取识别结果,并显示最优化识别结果     
  122.                    
  123.                 HCURSOR hCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));     
  124.                //获取轨迹指针用于识别     
  125.                 IInkStrokes* pIInkStrokes = NULL;     
  126.                 HRESULT hr = g_pIInkDisp->get_Strokes(&pIInkStrokes);     
  127.                 if (SUCCEEDED(hr))     
  128.                 {     
  129.                      
  130.                     hr = g_pIInkRecoContext->putref_Strokes(pIInkStrokes);     
  131.                     if (SUCCEEDED(hr))     
  132.                     {    //利用识别指针获取识别结果     
  133.                     
  134.                         IInkRecognitionResult* pIInkRecoResult = NULL;     
  135.                         InkRecognitionStatus RecognitionStatus;     
  136.                         hr = g_pIInkRecoContext->Recognize(&RecognitionStatus, &pIInkRecoResult);     
  137.                         if (SUCCEEDED(hr) && (pIInkRecoResult!= NULL))     
  138.                         {     
  139.                            
  140.                             BSTR bstrBestResult = NULL;     
  141.                             hr = pIInkRecoResult->get_TopString(&bstrBestResult);     
  142.                             pIInkRecoResult->Release();     
  143.                             pIInkRecoResult = NULL;     
  144.     
  145.                          
  146.                             if (SUCCEEDED(hr) && bstrBestResult)     
  147.                             {     
  148.                                 MessageBoxW(hwnd, bstrBestResult,     
  149.                                             L"识别结果", MB_OK);     
  150.                                 SysFreeString(bstrBestResult);     
  151.                             }     
  152.                         }     
  153.                       
  154.                         g_pIInkRecoContext->putref_Strokes(NULL);     
  155.                     }     
  156.                     pIInkStrokes->Release();     
  157.                 }     
  158.             
  159.                 ::SetCursor(hCursor);     
  160. }     
  161.   
  162. void Cinkdoc::start()  // 开始创建    
  163. {     
  164.      
  165.            //并创建com指针接口     
  166.             HRESULT hr;     
  167.     
  168.               
  169.                 
  170.             hr = CoCreateInstance(CLSID_InkRecognizerContext,     
  171.                                   NULL, CLSCTX_INPROC_SERVER,     
  172.                                   IID_IInkRecognizerContext,     
  173.                                   (void **) &g_pIInkRecoContext);     
  174.             if (FAILED(hr))     
  175.             {     
  176.                     
  177.                 return -1;     
  178.             }     
  179.     
  180.                
  181.             hr = CoCreateInstance(CLSID_InkCollector,     
  182.                                   NULL, CLSCTX_INPROC_SERVER,     
  183.                                   IID_IInkCollector,     
  184.                                   (void **) &g_pIInkCollector);     
  185.             if (FAILED(hr))     
  186.                 return -1;     
  187.     
  188.                 
  189.             hr = g_pIInkCollector->get_Ink(&g_pIInkDisp);     
  190.             if (FAILED(hr))     
  191.                 return -1;     
  192.     
  193.                
  194.             hr = g_pIInkCollector->put_hWnd((long)this->hwnd);     
  195.             if (FAILED(hr))     
  196.                 return -1;     
  197.     
  198.             hr = g_pIInkCollector->put_Enabled(VARIANT_TRUE);     
  199.             if (FAILED(hr))     
  200.                 return -1;     
  201.      
  202. }    
  203.   
  204.   
  205.   
  206.   
  207.   
  208.   
  209.   
  210. //笔势事件     
  211. HRESULT Cinkdoc::OnGesture(     
  212.         IInkCursor* /*pIInkCursor*/,     
  213.         IInkStrokes* pInkStrokes,     
  214.         VARIANT vGestures,     
  215.         VARIANT_BOOL* pbCancel     
  216.         )     
  217. {     
  218.     if (((VT_ARRAY | VT_DISPATCH) != vGestures.vt) || (NULL == vGestures.parray))     
  219.         return E_INVALIDARG;     
  220.     if (0 == vGestures.parray->rgsabound->cElements)     
  221.         return E_INVALIDARG;     
  222.     
  223.    / /数组中的手势应该是排序的承认     
  224.     / /置信水平。此示例拿起最高之一。     
  225.     / /注意:当在InkAndGesture收集模式,除了预期的手势     
  226.     / /应用程序也有可能是带着身份证IAG_NoGesture手势对象     
  227.     / /此应用程序时,如果取消与ISG_NoGesture对象     
  228.     / /最高水平的信心数组(第一项)。     
  229.     InkApplicationGesture idGesture = IAG_NoGesture;     
  230.     IDispatch** ppIDispatch;     
  231.     HRESULT hr = ::SafeArrayAccessData(vGestures.parray, (void HUGEP**)&ppIDispatch);     
  232.     if (SUCCEEDED(hr))     
  233.     {     
  234.         CComQIPtr<IInkGesture> spIInkGesture(ppIDispatch[0]);     
  235.         if (spIInkGesture != NULL)     
  236.         {     
  237.             hr = spIInkGesture->get_Id(&idGesture);     
  238.         }     
  239.         ::SafeArrayUnaccessData(vGestures.parray);     
  240.     }     
  241.     
  242.   / /加载资源字符串表的姿态名称     
  243.     UINT idGestureName;     
  244.     bool bAccepted;     // will be true, if the gesture is known to this application     
  245.     if (IAG_NoGesture != idGesture)     
  246.     {     
  247.         bAccepted = GetGestureName(idGesture, idGestureName);     
  248.     }     
  249.     else         
  250.     {     
  251.         bAccepted = false;     
  252.         idGestureName = 0;     
  253.     }     
  254.     
  255.   //如果当前的收集模式ICM_GestureOnly或者如果我们接受     
  256.     //的姿态,手势的中风将被删除从墨迹对象,     
  257.     //因此,窗口需要在招'区更新。     
  258.     if (ID_MODE_GESTURES == m_nCmdMode || true == bAccepted)     
  259.     {     
  260.         // Get the rectangle to update.     
  261.         RECT rc;     
  262.         CComPtr<IInkRectangle> spIInkRect;     
  263.         if (m_spIInkRenderer != NULL     
  264.             && pInkStrokes != NULL     
  265.             && SUCCEEDED(pInkStrokes->GetBoundingBox(IBBM_Default, &spIInkRect))     
  266.             && SUCCEEDED(spIInkRect->GetRectangle(&rc.top, &rc.left,     
  267.                                                   &rc.bottom, &rc.right)))     
  268.         {     
  269.                
  270.             HDC hdc = m_wndInput.GetDC();     
  271.             if (NULL != hdc)     
  272.             {     
  273.                 if (FAILED(m_spIInkRenderer->InkSpaceToPixel((long)hdc, &rc.left, &rc.top))     
  274.                     || FAILED(m_spIInkRenderer->InkSpaceToPixel((long)hdc,
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA是一种可编程逻辑器件,可以通过编程配置实现各种功能。SDI(Serial Digital Interface)是一种数字串行接口,通常用于视频信号的传输。 要实现SDI接口,首先需要了解SDI的工作原理和信号格式。SDI接口通常采用基于SMPTE标准的串行传输技术,通过使用LVDS(Low-Voltage Differential Signaling)电平来传输数字视频信号。 在FPGA中实现SDI接口可以通过以下步骤完成: 1. 选择适当的FPGA芯片:选择带有高速串行接口和可编程逻辑的FPGA芯片,以满足SDI信号传输的要求。 2. 设计接口电路:根据SDI接口的电气特性和传输协议,设计适当的电路来实现信号的接收和发送。这包括差分信号接收器和发射器电路,以及时钟和同步信号的生成和恢复电路。 3. 实现信号处理和调整:根据SDI信号的特点,设计逻辑电路来处理和调整视频信号,例如提取图像数据、进行时钟恢复、进行错误检测和纠正等。 4. 编程和配置:使用FPGA开发工具,将设计好的逻辑电路编程到FPGA芯片中,同时进行相关的时序和引脚约束配置。 5. 验证和测试:将FPGA芯片连接到SDI信号源和目标设备,进行测试和验证。测试可以包括传输稳定性、视频质量和信号完整性等方面。 通过以上步骤,我们可以在FPGA中实现SDI接口的功能。FPGA的可编程性使得SDI接口可以根据实际应用场景的需求进行灵活的配置和优化,同时便于后续的升级和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值