2011年5月30日

codeplex新增Example

新增了一个示例工程,包括打包皮肤资源的程序和可编译执行的示例程序。svn地址: 

https://guilib.svn.codeplex.com/svn/GUI/GDI(EasyUI)/Example

posted @ 2011-05-30 13:48 健忘猪 阅读(137) 评论(0) 编辑

窗口类的定义

接着上次的框架,肯定有疑问那两个窗口类是怎么来的

    g_pMainWnd = new CUMFCMainWindow(_T("UMFCMainWindow"));
    g_pLoginWnd 
= new CUMFCLoginWindow(_T("UMFCLoginWindow"));

 

 今天就接着讲解窗口类的来历。

#pragma once
#include 
"EasyUI.h"
#include 
"EasyDialog.h"
#include 
"EasyEventDelgate.h"
#include 
"EasyList.h"
#include 
"EasyStatic.h"
#include 
"EasyProgress.h"
#include 
"EasyTrayIcon.h"
#include 
"EasyRadioButton.h"
#include 
"EasyMenu.h"
using namespace easyui;

class CUMFCMainWindow 
public CEasyDialogWinWnd  //windows窗口基类
{
public:
    CUMFCMainWindow(LPCTSTR pszWndName);
//构造函数,需要传入窗口名称,这个名称就是xml里面配置的窗口名称,name属性的值
    LPCTSTR GetWindowClassName() const;//给窗口类指定一个名称
    UINT GetClassStyle() const;//窗口的style,不需要可以直接返回null
        
//上面三个方法是窗口类必须实现的

    
bool OnCreate();
    
void OnDestory();
        
//消息处理函数
    LRESULT OnWndMsg(UINT uMsg, WPARAM wParam,LPARAM lParam);
       
    
//事件处理函数(下面会详细讲解)
    DECLARE_EVENT_FUN(OnMenuOpen);
    DECLARE_EVENT_FUN(OnMenuQuit);
    ....
//若干个事件处理函数
    DECLARE_EASY_EVENT(CUMFCMainWindow);//这个是必须调用的,用来绑定事件处理函数的,参数就是窗口类名
    DECLARE_EASY_CONTROL_BIND();//这个也是必须调用的,用来绑定控件到成员变量,方便访问 
    
//注意:关于事件控件绑定,后面文章会详细讲解
   
public//控件变量
    CEasyStatic    *m_pStcUsrname;
    CEasyList    
*m_pListRun; 
        ...
//若干控件 

 

 大致的头文件就这样子了。(这里没有给出完整版本,如果需要完整版本的例子工程,可以联系我QQ发送,或者留下邮箱)

CPP文件也有一些必须的工作:

BEGIN_ULTRANT_EVENT_MAP(CUMFCMainWindow)//事件绑定开始的宏
    
//事件绑定,第一个参数是窗口类名称,第二个是控件名称,第三个是事件类型的宏
    /*
    支持的事件类型
    //控件事件
    enum EVENT_ID
    {
        EVENT_SKIN_BEFORE,
        EVENT_SKIN_AFTER,
        EVENT_TIMER,
        EVENT_BTN_LCLICK,
        EVENT_BTN_RCLICK,
        EVENT_BTN_LDBCLICK,
        EVENT_BTN_RDBCLICK,
        EVENT_CHK_SELECT,
        EVENT_RADIO_SELECT,
        EVENT_SLIDER_SCROLL,
        EVENT_LSTBOX_SELCHANGE,
        EVENT_LSTBOX_DBLCLICK,
        EVENT_LST_ROW_SELCHANGE,
        EVENT_LST_ITEM_SELCHANGE,
        EVENT_LST_DBLCLICK,
        EVENT_TREE_SEL_CHANGE,
        EVENT_TREE_DBCLICK,
        EVENT_MENU_SELECT,
        EVENT_COMBOX_SELCHANGE,
        EVENT_EDIT_TEXT_INPUT,
        EVENT_EDIT_TEXT_CHANGE,
        EVENT_STEP_NUM_CHANGE,
        EVENT_END,//扩展的event需要从这里开始
    };
    
*/
    ON_ULTRANT_EVENT(_T(
"UMFCMainWindow"),     _T("btnaddtask"),          EVENT_BTN_LCLICK,            &CUMFCMainWindow::OnAddTask);
    ON_ULTRANT_EVENT(_T(
"UMFCMainWindow"),     _T("btndeltask"),          EVENT_BTN_LCLICK,            &CUMFCMainWindow::OnDelTask);
    ....
//不同的事件绑定
    ON_ULTRANT_EVENT(_T("menutray"),         _T("start"),              EVENT_MENU_SELECT,            &CUMFCMainWindow::OnMenuStart);
    ON_ULTRANT_EVENT(_T(
"menutray"),         _T("stop"),              EVENT_MENU_SELECT,            &CUMFCMainWindow::OnMenuStop);
END_ULTRANT_EVENT_MAP()
//结束的宏

//控件绑定 CUMFCMainWindow类名,_T("UMFCMainWindow")窗口名
BEGIN_ULTRANT_CONTROL_BIND(CUMFCMainWindow, _T("UMFCMainWindow"))
    
//CUltrantList* 指针类型的成员变量, m_pListRun成员变量,_T("listrun")控件名 
    BIND_CONTROL(CUltrantList*,        m_pListRun,        _T("listrun"));
    BIND_CONTROL(CUltrantList
*,        m_pListDel,        _T("listdel"));
    ......
    BIND_CONTROL(CUltrantStatic
*,    m_pStcUsrname,    _T("stcaccount"));
    BIND_CONTROL(CUltrantRadioButton
*,    m_pBtnListDel,    _T("radiodel"));
END_ULTRANT_CONTROL_BIND()


CUMFCMainWindow::CUMFCMainWindow(LPCTSTR pszWndName) 
: CUltrantDialogWinWnd(pszWndName)
//基类初始化需要窗口名
{
}

LPCTSTR CUMFCMainWindow::GetWindowClassName() 
const 
{
    
return _T("UMFCMainWindow"); //注册一个窗口类名称
}

UINT CUMFCMainWindow::GetClassStyle() 
const
{
    
return CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; 
}

//事件处理函数 CUMFCMainWindow窗口类,OnSelectRunLst函数名
IMP_EVENT_FUN(CUMFCMainWindow, OnSelectRunLst)
{
    
//data是处理函数给的参数,具体事件类型不同给的数据不同
    _OnSwitchLst(EM_BTN_STATUS_TWO == data->lParam);
}

 

 

posted @ 2011-05-30 13:13 健忘猪 阅读(70) 评论(0) 编辑

2011年5月29日

程序框架

上面几篇文章大致介绍了下皮肤配置的情况,有个大概的了解,下面我会介绍下搭建程序的框架。

首先新建一个cpp文件,作为我们主程序的入口,里面必须的是入口函数:

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    
if (!InitSkin(hInstance))//初始化皮肤的函数,后面会讲解
        goto endapp;
    
//实例化两个窗口,这里的两个窗口类后面会讲解他们的来历
    g_pMainWnd = new CUMFCMainWindow(_T("UMFCMainWindow"));
    g_pLoginWnd 
= new CUMFCLoginWindow(_T("UMFCLoginWindow"));

    
//下面代码是创建windows窗口
    RECT rcMain = {0,0,800,600};
    HWND hWnd 
= g_pMainWnd->Create(NULL, ST_STR(11),  (WS_POPUP| WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_CLIPCHILDREN) , 0,  rcMain );
    
if (!hWnd || !IsWindow(hWnd)) 
        
goto endapp;
    g_pMainWnd
->CenterWindow();
    
if (!InitFtpClient(hWnd)) 
        
goto endapp;

    RECT rcLogin 
= {0,0,400,300};
    hWnd 
= g_pLoginWnd->Create(NULL, ST_STR(21),  (WS_POPUP|WS_VISIBLE|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_CLIPCHILDREN) , WS_EX_TOPMOST,  rcLogin );
    
if (!hWnd || !IsWindow(hWnd)) 
        
goto endapp;
    
//消息循环
    MSG msg = { 0 };
    
while( ::GetMessage(&msg, NULL, 00) ) 
    {
        ::TranslateMessage(
&msg);
        ::DispatchMessage(
&msg);
    }
    
//清理工作
endapp:
    SAFE_RELEASE_OBJ(g_pMainWnd);
    SAFE_RELEASE_OBJ(g_pLoginWnd);
    
return static_cast<int>(msg.wParam);

} 


上面入口函数还是满简单的,下面我们来看一下 InitSkin初始化皮肤:

bool InitSkin(HINSTANCE hInstance)
{
    G_UIMAN.SetAppInstance(hInstance);
//设置应用程序实例句柄
    TCHAR pszCurDir[MAX_PATH] = {0};
    ::GetCurrentDirectory(MAX_PATH, pszCurDir);
    tstring strStrTable 
= pszCurDir;
    tstring strSkinPath 
= pszCurDir;
    tstring strXmlFile 
= pszCurDir;
    strStrTable 
+= _T("\\Language\\simplechinese.ch");//字符串数据表的文件路径,以后会讲如何更换语言
    strSkinPath += _T("\\Skin\\");  //皮肤文件(图片文件或者打包后的包文件)路径 
    strXmlFile += _T("\\Skin\\skin.xml");//皮肤配置文件路径
    if (!G_STRTABLE.Init(strStrTable.c_str()))//初始化字符串表
    {
        
return false;
    }
    
//皮肤初始化
G_UIMAN
 就是 
#define G_UIMAN g_ultrantUIManager

    
if (!G_UIMAN.Init(strSkinPath.c_str(), strXmlFile.c_str()))
    {
        
return false;
    }

    
return true;
}  

 

 这样主程序部分就ok了,是不是很简单,明天会接着讲解上面那两个窗口类的来历,等把基本程序框架讲解完(包括事件映射和处理)

 

 

posted @ 2011-05-29 22:48 健忘猪 阅读(72) 评论(0) 编辑

2011年5月28日

趁热讲讲skin.xml支持的标签和attributes

摘要: 上篇随笔讲解了skin.xml的大致结构,这次仔细的说说支持的标签和属性#defineNAME_WND_T("window") //窗口 #defineNAME_BTN_T("button") //按钮#defineNAME_CHECKBOX_T("checkbox") //复选框#defineNAME_RADIOBTN_T("radiobutton")//单选#defineNAME_STATIC_T("static") //静态文本框#defineNAME_PANEL_T("pane阅读全文

posted @ 2011-05-28 23:32 健忘猪 阅读(59) 评论(0) 编辑

skin.xml皮肤配置讲解

今天完成了影片上传审核和添加的功能,轻松一下,来讲讲GUI GDI版本的皮肤配置。

想要直接使用的朋友不要错过哦。

先来总体看一下xml的结构:

 

<root>
    
<tip></tip>
    
<messagebox></messagebox>
    
<menu></menu>
    
<window></window>
</root>

 

基本的结构如上,所有配置都在xml的root根节点中,紧跟着是一些固定配置项:

1.tip节点是配置tip窗口的,通过tip节点可以自己指定tip窗口的样式,可以和window窗口一样设置图片背景等。

例如可以这样用九宫格的方式设置背景:

    <tip name="tip" width="100" height="30" bgmode="nine" resize="0" caption="0" bgbmp="tiptl.bmp,tiptm.bmp,tiptr.bmp,tiplm.bmp,tipbg.bmp,tiprm.bmp,tipbl.bmp,tipbm.bmp,tipbr.bmp">
    
</tip>

 

2.messagebox节点是配置通用消息对话框的,这个配置可以按照自己的需要定制漂亮的消息对话框。配置的内容有固定要求,比如里面的按钮必须都要有。使用的时候只需要拷贝一份我给的示例修改相应需要修改的地方就可以了,范例如下:

 

<messagebox name="messagebox" width="350" height="200" minwidth="350" minheight="200" bgmode="nine" resize="0" bgbmp="wndtl.bmp,wndtm.bmp,wndtr.bmp,wndlm.bmp,wndbg.bmp,wndrm.bmp,wndbl.bmp,wndbm.bmp,wndbr.bmp" fontcolor="#003564">
        
<button name="yes" anchor="LBLB" pos="10,32,60,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:1"></button>
        
<button name="no" anchor="LBLB" pos="70,32,120,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:2"></button>
        
<button name="cancel" anchor="LBLB" pos="130,32,80,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:3"></button>
        
<button name="abort" anchor="LBLB" pos="190,32,240,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:4"></button>
        
<button name="retry" anchor="LBLB" pos="250,32,300,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:5"></button>
        
<button name="continue" anchor="LBLB" pos="310,32,360,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:6"></button>
        
<button name="ignore" anchor="LBLB" pos="250,32,300,10" bgmode="one" bgbmp="btn.png" visible="1" text="ST:7"></button>
        
<button name="ok" anchor="LBLB" pos="310,32,360,10" bgmode="one" bgbmp="btn.png" visible="1" text="OK"></button>
    
</messagebox>

 

 需要注意一点,为了方便多语言版切换语言,按钮的文字配置使用的是stringtable的索引,text="ST:7"这里直接使用的就是stringTable的索引号。

3.menu节点可以有多个,表示多个菜单项。(上面的tip和messagebox都是单一实例的)

menu的item项由menuitem 来配置,目前菜单没有做动态插入item的功能,主要是目前我做的项目没遇到,也就没做这些动态创建控件的功能,不过在我现有代码的基础上修改下应该是可以的,需要看广大朋友的了。放出一个menu的配置范例(系统tray的菜单):

 

<menu name="menutray" width="140" height="86" bgmode="nine" resize="0" caption="0" bgbmp="menutl.bmp,menutm.bmp,menutr.bmp,menulm.bmp,menubg.bmp,menurm.bmp,menubl.bmp,menubm.bmp,menubr.bmp"  fontname="宋体"  fontcolor="#003564">
        
<menuitem name="open" text="ST:72"></menuitem>
        
<menuitem name="start" text="ST:73"></menuitem>
        
<menuitem name="stop" text="ST:74"></menuitem>
        
<menuitem name="quit" text="ST:75"></menuitem>
    
</menu>

 

 4.window节点就是我们程序中的各种窗口了。这块后面会详细介绍,这里先放出一个登录窗的范例:

<!--登录窗-->
    
<window name="UMFCLoginWindow" fontname="Verdana" resize="0" width="300" height="220"  fontcolor="#003564" bgmode="nine">
        
<button name="sys_close" hsl="0" anchor="RTRT" pos="48,0,0,21" bgmode="one" bgbmp="btn_close.png"></button>
        
<button name="sys_min" hsl="0" anchor="RTRT" pos="76,0,48,21" bgmode="one" bgbmp="btn_min.png"></button>
        
<static anchor="LTLT" pos="20,55,80,70" text="ST:22"></static>
        
<editor    name="editusr" anchor="LTRT" pos="75,50,25,72" line="single" fontsize="10" bgcolor="#e7fefd" borderclr="#8ebbff" borderclrh="#aeceff" tab="1"></editor>
        
<static anchor="LTLT" pos="20,95,80,110" text="ST:23"></static>
        
<editor    name="editpwd" anchor="LTRT" pos="75,90,25,112" line="single" fontsize="10" password="1" bgcolor="#e7fefd" borderclr="#8ebbff" borderclrh="#aeceff" tab="2"></editor>
        
<button name="btnlogin" anchor="LTLT" pos="40,150,140,182" bgmode="one" bgbmp="bigbtn.png" text="ST:24"></button>
        
<button name="btncancel" anchor="LTLT" pos="160,150,260,182" bgmode="one" bgbmp="bigbtn.png" text="ST:25"></button>

    </window>  

 今天先写到这里,下篇我想讲下xml配置有那些标签和attributes,敬请期待 HOHO~~~

posted @ 2011-05-28 16:24 健忘猪 阅读(144) 评论(0) 编辑

2011年5月25日

重回博客园继续我的 GUI库

GDI版本的开发就先告一段落,在此发布一个基本可以使用的版本。

顺便发两张已经成功使用的程序截图,后面我会慢慢的整理使用方法,详细的介绍技术细节。欢迎转发关注~~~~

有了GDI版本的锻炼,现在开始写 D3D版本的,因为是构想了很久了,手很痒趁着热度写一下把,以后我会经常来博客园更新进度。

GID版本的维护暂时搁置,需要源码的可以到codeplex去下,稍后我会公布svn连接。先说明因为也是第一次写,设计不是很好,不过作为学习和简单应用应该问题不大,我还简单的实现了一下扩展办法,方便大家自己扩展自己的控件,这块也会在稍后的文章流出。

事先说明下这套GDI的UI库的大致实现,就是参照现在流行的无窗口设计,全程序只有几个窗口,控件都是自己绘制的,也就是directui的设计。关于控件布局,我实现的不是特别好,一般应用可以,特例的布局暂不支持。皮肤采用xml配置,支持换肤,更新色调,皮肤资源打包。

支持语言切换,语言采用单独的文件编辑,这点很是方便啊。 

另外外一个值得一提的就是方便开发我实现了flash的封装,闪屏窗口,tip窗口,菜单的封装。

目前只支持unicode版本,以后看看找个时间编译下非unicode的看能编译过去不。 

暂时先写这么多,上几个图过过瘾。 

 

一个登录框

视频采集程序的客户端

采集客户端的设计页面,有意思的是那个metedata的设置界面,是可编辑的list

文件上传客户端的界面,中间list支持icon进度条

 

trayicon和自定义的菜单

 

 

带透明的闪屏 

posted @ 2011-05-25 19:31 健忘猪 阅读(495) 评论(7) 编辑

2010年5月18日

关于OGRE基础教程6中CEGUI的layout文件can not locate的问题

教程是针对以前版本的OGRE和CEGUI的。所以还是.xml格式后缀,现在CEGUI7.1使用的是.layout后缀,并且在配置Resource.cfg的时候需要把layout文件的路径设置在[general]配置节下面。这个问题需要再仔细看看resourcemanager模块是怎么处理这些配置的,我再写个详细说明。

接上面问题:

  经过查看CEGUI和OGRE的源代码,发现:在CEGUI7.1版本中使用         mGUIRenderer=&CEGUI::OgreRenderer::bootstrapSystem();

类似的代码来初始化,在OgreRenderer::bootstrapSystem();

中具体的初始化代码如下:

    OgreRenderer& renderer = OgreRenderer::create(target);
      OgreResourceProvider& rp = createOgreResourceProvider();
      OgreImageCodec& ic = createOgreImageCodec();

其中重要的是OgreResourceProvider,在CEGUI中有默认的resourceprovider,在OGRE 中我们调用了bootstrapSystem,自然使用的就是OgreResourceProvider,自然资源的查找遵循OGRE的配置规则。

再深入会发现:在WindowManager::loadWindowLayout该方法中会有

System::getSingleton().getXMLParser()->parseXMLFile(handler,   filename, GUILayoutSchemaName, resourceGroup.empty() ? d_defaultResourceGroup : resourceGroup);这行,我们查找parseXMLFile方法在类

ExpatParser : public XMLParser中,而在ExpatParser::parseXMLFile中很快发现秘密所在:CEGUI::System::getSingleton().getResourceProvider()->loadRawDataContainer(filename, rawXMLData, resourceGroup);问题很明了具体调用关系如下:

CEGUI->初始化(包括OgreResourceProvider)->loadWindowLayout->parseXMLFile->getResourceProvider()->loadRawDataContainer

自然报错误是在OGRE的ResourceManager模块当中

 

至于为何一定要在general下,我想应该是我们没有在loadWindowLayout的时候提供资源组的名称,所以使用了默认的general组。

 

posted @ 2010-05-18 12:57 健忘猪 阅读(372) 评论(0) 编辑

如何配置和编译ogre 1.7.0 + cegui 0.7.1

ogre 1.7.0的下载、配置和编译指南

----------------------------------------------- 

1.  ogre 1.7.0的下载地址:https://sourceforge.net/projects/ogre/files/ogre/1.7/ogre-v1-7-0.zip/download

2.  ogre 1.7.0依赖库的下载地址(不定期更新,请关注该贴):http://www.ogre3d.org/forums/viewtopic.php?f=1&t=54533

3.  将ogre解压,建议将解压后生成的ogre目录改名为对应的版本号,例如:F:\SDK\ogre-v1-7-0,以区分各个版本

4.  将依赖库解压到ogre的目录中,例如:F:\SDK\ogre-v1-7-0\Dependencies

5.  根据自己的VC版本打开F:\SDK\ogre-v1-7-0\Dependencies\src目录中对应的工程VS20XX.sln

6.  编译出依赖库的debug和release

7.  下载最新版本的cmake:http://www.cmake.org/cmake/resources/software.html

8.  解压cmake到任意目录,例如:F:\Tools\cmake-2.8.0-win32-x86

9.  运行F:\Tools\cmake-2.8.0-win32-x86\bin\cmake-gui.exe

10. 在"Where is the source code"和"Where to build the binaries"中分别设置ogre的解压路径,例如:F:\SDK\ogre-v1-7-0

11. 点击configure,选择好VC的版本

12. 点击Generate后将生成OGRE.sln

13. 编译出ogre的debug和release

14. 如果不需要运行samples,那么只需要编译OgreMain、RenderSystem_Direct3D9(或其他)和所需的Plugin即可 

 

cegui 0.7.1的下载、配置和编译指南

----------------------------------------------- 

1.  cegui 0.7.1的下载地址:http://prdownloads.sourceforge.net/crayzedsgui/CEGUI-0.7.1.zip?download

2.  cegui 0.7.1依赖库的下载地址:http://prdownloads.sourceforge.net/crayzedsgui/CEGUI-DEPS-0.7.x-r1-vc9.zip?download

3.  将cegui解压,建议将解压后生成的cegui目录改名为对应的版本号,例如:F:\SDK\cegui-v0-7-1,以区分各个版本

4.  将依赖库解压到cegui的目录中,例如:F:\SDK\cegui-v0-7-1\Dependencies

5.  进入目录F:\SDK\cegui-v0-7-1\projects\premake

6.  用记事本打开目录下的config.lua,找到两个变量:OGRE_PATHS和OIS_PATHS

7.  将其修改成对应的ogre和ois的路径,例如:

    OGRE_PATHS = { "F:\SDK\ogre-v1-7-0", "OgreMain/include", "lib" }

    OIS_PATHS = { "F:\SDK\ogre-v1-7-0/Dependencies/include/OIS/", "", "lib" }

8.  找到CEGUI_OLD_OIS_API变量,设置为false

9.  找到OGRE_RENDERER变量,设置为true

10. 找到SAMPLES_OGRE变量,设置为true

11. 进入目录F:\SDK\cegui-v0-7-1\projects\premake,运行build_vs2008.bat(或对应的其他版本),你将看到CEGUI.sln

12. 继续运行build_samples_vs2008.bat(或对应的其他版本),你将看到CEGUISamples.sln

13. 在编译CEGUI.sln和CEGUISamples.sln时,如果依然存在找不到h或是link错误,请打开工程属性,修改Additional Include Directories和Additional Library Directories中对应的ogre和ois相关的路径

14.  请注意ogre 1.7.0的lib是生成在debug和release子目录中,记得修改为正确的link路径

15. 运行sample前,记得先复制F:\SDK\cegui-v0-7-1\dependencies\bin下的所有dll到F:\SDK\cegui-v0-7-1\bin下面,这样就不会报错提示缺少dll了

 

 

各种开源库的配置建议

----------------------------------------------- 

1.  右键点击我的电脑 -> 属性 -> 高级 -> 环境变量

2.  根据不同开源库的名称,新建出对应的变量名和路径值,例如:变量OGRE,值为F:\SDK\ogre-v1-7-0

3.  将VC的Additional Include Directories和Additional Library Directories中将之前的死路径修改为类似:$(OGRE)/OgreMain/include

4.  未来当ogre或cegui再有升级时,则不需要手动一个个修改路径,只用一次性修改对应的环境变量的值(路径)即可

5.  请注意,当环境变量发生变化,VC必须重启才能识别

posted @ 2010-05-18 12:51 健忘猪 阅读(185) 评论(0) 编辑

2007年12月20日

OCX控件注册相关(检查是否注册,注册,反注册)

摘要: 1BOOLRegisterOcx(LPCTSTROcxFileName)2{3LPCTSTRpszDllName=OcxFileName;//ActiveX控件的路径及文件名4HINSTANCEhLib=LoadLibrary(pszDllName);//装载ActiveX控件5if(hLib<(HINSTANCE)HINSTANCE_ERROR)6{7returnFALSE;8}9FARP...阅读全文

posted @ 2007-12-20 16:01 健忘猪 阅读(640) 评论(0) 编辑

2007年11月12日

vc中调用Com组件的方法详解

摘要: --------------------------------------------------------------------------------Requirement:1.创建myCom.dll,该COM只有一个组件,两个接口IGetRes--方法Hello(), IGetResEx--方法HelloEx()2.在工程中导入组件或类型库 #import "组件所在目录myCom.d...阅读全文

posted @ 2007-11-12 19:25 健忘猪 阅读(7345) 评论(1) 编辑