【c++】缺少streams.h的解决方法

这几天在学DirectShow的开发,一个streams.h头文件折腾了好几天才搞定。简单总结一下出现缺少streams.h的解决方法和DirectShow开发环境的搭建。

开发包方面,我用的是Microsoft DirectX 9.0 SDK。

streams.h这个头文件现在在%\DX9 SDK\Samples\C++\DirectShow\BaseClasses路径下,首先要把这个路径添加到VC的Include Directories下面。TOOL–option–directories下面框里添加上streams.h的目录)。

debug版的库 strmbasd.lib在安装包\DX9 SDK\Samples\C++\DirectShow\BaseClasses\Debug_Unicode目录下
retail版的库strmbase.lib在%\Program Files\Microsoft Visual Studio\VC98\Lib目录下

因为库有两个,分别对应Debug和Release,你可以把它拷到SDK的Lib目录下,然后在工程的Debug设置和Release设置里设好库的名字就可以了,当然也可以不拷,怎么用随便你。

安装完directx sdk后,要将directx sdk的include和lib目录配置到vc的系统目录中,并且放到标准的vc目录之前,以保证编译器能拿到最新版本的源文件。

配置方法为,打开vc,选择菜单项tool、options、directories,在弹出的对话框中的show directories for中选择include files,添加配置如下(假设directx sdk安装在D:\dxsdk目录下):
D:\dxsdk\include
D:\dxsdk\samples\c++\directshow\baseclasses
D:\dxsdk\samples\c++\common\include

再在show directories for中选择 library files,添加配置如下:
D:\dxsdk\lib
D:\dxsdk\samples\c++\directshow\baseclasses\debug
D:\dxsdk\samples\c++\directshow\baseclassed\release

Jhonse技术博客说明:

来源于:http://blog.sina.com.cn/s/blog_5866e3be0100affd.html

【c++】在DirectX 3D中使用CEGUI

一、CEGUI简介
    CEGUI,为Crazy Eddie's GUI的缩写,它是一个用C++开发的面向对象的免费界面库,针对游戏开发者,提供了3D环境中的窗口及其部件的图形API。CEGUI在0.4.1之前(包括0.4.1),使用LGPL授权协议,从0.5版本开始则采用了更为宽松的MIT协议。目前使用CEGUI的项目(摘自http://www.cegui.org.uk):

Project Xenocide

BlitzMax

Plant covered GUI

你可以从下面链接得到更多关于CEGUI的知识:
(1)    http://www.cegui.org.uk/wiki/index.php/Main_Page
(2)    http://sourceforge.net/projects/crayzedsgui/
(3)    http://www.cegui.org.uk/wiki/index.php/FAQ

二、CEGUI结构概览
    从上一小节中给出的链接,你可以下载CEGUI的SDK。该SDK以DLL的形式提供,下面简单介绍一下这些DLL的作用及分类:

三、在DirectX中使用CEGUI
    CEGUI是一个跨平台的图形界面库,其平台无关性是通过对平台的封装实现的。在上一节中我们分析了CEGUI的SDK结构,在其渲染子系统中提供了Windows平台上的DirectX8.1/9.0的支持,因此不难推断在自己写的程序中应该可以使用CEGUI。
3.1 CEGUI的资源组织
    CEGUI的资源目录为datafiles,其组织情况如下:

  • configs:资源配置文件
  • fonts:字体资源
  • imagesets:各种图片资源(如:皮肤图片等)
  • layouts:布局文件(可以利用CEGUILayout得到)
  • lookfeel:皮肤配置文件
  • lua_scripts:Lua脚本文件
  • schemes:xml配置文件的scheme

    我们主要关注的是layouts中的文件,这些xml文件可以由CEGUI的附带界面设计工具CEGUILayout得到。如下图所示:

3.2 程序中使用CEGUI
    在这一小节中,我将使用MFC+DirectX9.0c+CEGUI创建一个DEMO,下面仅列出一些关键代码,在文章最后给出了DEMO的源代码下载链接。如果你对在MFC或者Win32 SDK中使用DirectX 3D还不熟悉,可以参考Direct3D入门之框架的搭建一文。
(1)    创建DirectX 3D设备m_d3dDevice;
(2)    创建CEGUI::Render对象:
     

m_pCEGUIRender = new CEGUI::DirectX9Renderer(m_d3dDevice , 0);   

(3)    创建CEGUI::System对象:

    new CEGUI::System(m_pCEGUIRender);

(4)    渲染CEGUI:

	    if(m_d3dDevice) // Only use Device methods if we have a valid device.
    {
        //
        // Draw the Scene:
        //
        m_d3dDevice->BeginScene();
        m_d3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(50 , 0 , 50) , 1.0f, 0);
            /// Render Meshs
            DrawMesh();
            /// Render CEGUI
            CEGUI::System::getSingleton().renderGUI();

        m_d3dDevice->EndScene();
        m_d3dDevice->Present(0, 0, 0, 0);
    }
(5)    需要引入的头文件

	#include <CEGUI.h>
#include <CEGUIDefaultResourceProvider.h>

(6)    需要的引入库
CEGUIBase_d.lib(Debug版本)
DirectX9GUIRenderer_d.lib(Debug版本)
(7)    在程序中设置默认的资源及其路径
    必须设置资源(也就是datafiles)的路径,不然系统运行时就会出现找不到资源的异常。代码如下所示:

	    /// 初始化CEGUI的资源缺省路径
    CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
        (CEGUI::System::getSingleton().getResourceProvider());
    rp->setResourceGroupDirectory("schemes", "../datafiles/schemes/");
    rp->setResourceGroupDirectory("imagesets", "../datafiles/imagesets/");
    rp->setResourceGroupDirectory("fonts", "../datafiles/fonts/");
    rp->setResourceGroupDirectory("layouts", "../datafiles/layouts/");
    rp->setResourceGroupDirectory("looknfeels", "../datafiles/looknfeel/");
    rp->setResourceGroupDirectory("lua_scripts", "../datafiles/lua_scripts/");///< 如果没用Lua脚本就将该行注释掉
    /// 设置使用的缺省资源
    CEGUI::Imageset::setDefaultResourceGroup("imagesets");
    CEGUI::Font::setDefaultResourceGroup("fonts");
    CEGUI::Scheme::setDefaultResourceGroup("schemes");
    CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
    CEGUI::WindowManager::setDefaultResourceGroup("layouts");
    CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");///< 如果没用Lua脚本就将该行注释掉

    注意:这样设置的一个前提是datafiles存在于项目根目录下。
(8)    恢复CEGUI改变的渲染状态
    通过分析CEGUI的源代码得知,CEGUI在渲染时会改变某些渲染状态,特别是与深度有关的状态,所以必须在渲染三维物体之前打开这些状态:

	    m_d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    m_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

注意:
1、本项目是用vs2003开发,使用DirectX9.0c August版本,CEGUI SDK 0.5.0b-vc71。
2、将layout下的GameGUI.layout文件copy至CEGUI SDK的datafiles/layouts下
3、本项目只需要CEGUIBase_d.dll、CEGUIExpatParser_d.dll、CEGUIFalagardWRBase_d.dll、DirectX9GUIRender_d.dll(Debug版本)

【c++】fatal error C1083: Cannot open include file: ‘dxerr9.h’ 解决方法

fatal error C1083: Cannot open include file: 'dxerr9.h': No such file or directory

这个问题主要是头文件中“dxerr9.h”是D3DX9的版本,而你有可能用了比它更新的版本,比如D10或者D11。因为在后续版本汇总把err头文件改成了“DxErr.h”这个可以到DirectX的安装目录/Include下去确认。所以需要改的是将相应的头文件和附加项改掉。

1、将头文件include<dxerr9.h>改成include<DxErr.h> 无关大小写.

2、将附加项中的DxErr9.lib改成DxErr.lib

【c++】无法打开包括文件:“d3dx9.h”: No such file or directory 解决办法

今天用vc6.0试学DirectX知识,于是在官网下载最新的DirectX  SDK,然后解压之后,就开始调用sdk库,结果一编译就出现d3dx9.h找不到:【无法打开包括文件:“d3dx9.h”: No such file or directory】 ,于是只能上百度查查。解决方法如下:

1.  首先搜索:“d3dx9.h”所在的路径;

本文该文件在:D:\Program Files\Microsoft DirectX SDK (August 2007)\Include

2. 设置include路径:

   工程–属性—c/c++—常规—附加头文件(第一行就是)在这里输入你哪文件所在的目录,多个目录用分

号分割,即输入:D:\Program Files\Microsoft DirectX SDK (August 2007)\Include

3. 设置lib的路径:工程–属性—链接—常规—附加库目录(中间部分),在这里输入lib文件的目录,即:D:\Program Files\Microsoft DirectX SDK (August 2007)\Lib\x86

【c++】webBrowser强制在本窗口打开,禁止在新窗口打开

有时需要用WebBrowser加载URL,来实现某些功能。而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的WebBrowser,也就不能被你所控制了。

要解决这个问题,可以使用下面的方法:

假设WebBrowser的Name是 webBrowser

简单方法-利用加载完成事件将所有的链接和form的target值改为”_seft”:

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //将所有的链接的目标,指向本窗体
    foreach (HtmlElement archor in this.webBrowser.Document.Links)
    {
        archor.SetAttribute("target", "_self");
    }
    //将所有的FORM的提交目标,指向本窗体
    foreach (HtmlElement form in this.webBrowser.Document.Forms)
    {
        form.SetAttribute("target", "_self");
    }
}

取消新窗口事件

private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{
     e.Cancel = true;
}

将 WebBrowser 的 AllowWebBrowserDrop 设为 false(禁止拖放)

将 WebBrowser 的 WebBrowserShortcutsEnabled 设为 false(禁止使用快捷键)
将 WebBrowser 的 IsWebBrowserContextMenuEnabled 设为 false(禁止右键上下文菜单)

【c++】CHtmlView链接在本窗口中打开(类似于在另一个标签中打开)

代码实现:

void C*****View::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)
{
 // TODO: Add your specialized code here and/or call the base class
 CWinApp*   pApp   =   AfxGetApp();

      //   Get   the   correct   document   template.
    POSITION   pos   =   pApp-> GetFirstDocTemplatePosition();
   
 CDocTemplate*   pDocTemplate   =   pApp-> GetNextDocTemplate(   pos   );

      //   Create   a   new   frame.
    CFrameWnd*   pFrame   =   pDocTemplate-> CreateNewFrame(GetDocument(), (CFrameWnd*)AfxGetMainWnd());

      //   Activate   the   frame.
    pDocTemplate-> InitialUpdateFrame(   pFrame,   NULL   );
     
 C*****View*   pView   =   (C*****View*)pFrame-> GetActiveView();

      //   Pass   pointer   of   WebBrowser   object.
    pView-> SetRegisterAsBrowser(   TRUE   );
     
 *ppDisp   =   pView-> GetApplication();
 //CHtmlView::OnNewWindow2(ppDisp, Cancel);
}

【c++】CHtmlView屏蔽js脚本

实现代码:

void C******View::OnNavigateComplete2(LPCTSTR strURL)
{
 // TODO: Add your specialized code here and/or call the base class
 
 CComPtr<IDispatch>   spDisp   =   GetHtmlDocument();
    if(spDisp!=NULL) 
    {
        CComPtr<IHTMLDocument2> doc;
        spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
        if(doc != NULL)
        {  
            IHTMLWindow2 * pIhtmlwindow2 = NULL;
            doc->get_parentWindow(&pIhtmlwindow2);
            if(pIhtmlwindow2 != NULL)
            {//”function fnOnError(msg,url,lineno){alert(‘script error:\\n\\nURL:’+url+’\\n\\nMSG:’+msg +’\\n\\nLine:’+lineno);return true;}window.onerror=fnOnError;”;
                //屏蔽javascript脚本错误的javascript脚本
                CString strJavaScriptCode = “function fnOnError(){return true;}window.onerror=fnOnError;”;
                BSTR bstrScript = strJavaScriptCode.AllocSysString();
                CString strLanguage(“JavaScript”);
                BSTR bstrLanguage = strLanguage.AllocSysString();
                long lTime = 1 * 1000;
                long lTimeID = 0;
                VARIANT varLanguage;
                varLanguage.vt = VT_BSTR;
                varLanguage.bstrVal = bstrLanguage;
                VARIANT pRet;
                //把window.onerror函数插入入当前页面中去
                pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
                ::SysFreeString(bstrScript);
                ::SysFreeString(bstrLanguage);
                pIhtmlwindow2->Release();
            }
        }
    }
 CHtmlView::OnNavigateComplete2(strURL);
}

以及:

void C*******View::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
 // TODO: Add your specialized code here and/or call the base class
 
 SetSilent(true);

 CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}

【C++】CHtmlView屏蔽右键菜单以及选择功能实现

如下代码实现:

int nVirtKey;

 //屏蔽右键菜单
 if ((pMsg->message == WM_RBUTTONDOWN) || (pMsg->message == WM_RBUTTONDBLCLK))
          
  return TRUE;

 //禁止招标标显示I型指针
 HCURSOR curIbeam = LoadCursor( NULL, IDC_IBEAM );

 if ( GetCursor() == curIbeam )
 {
 HCURSOR curArrow = LoadCursor( NULL, IDC_ARROW );
 
 SetCursor( curArrow );

 }

 //禁止选择
 if ( pMsg->message == WM_MOUSEMOVE )
 {
 nVirtKey = GetKeyState( VK_LBUTTON );
 if ( nVirtKey & 0x8000 )
 {
  return TRUE;
 }
 }