MsAgent 角色的包装器类






4.88/5 (8投票s)
2001年12月11日
5分钟阅读

237913

3668
一篇提供使用 msagent 字符的便捷方法的文章
什么是 Microsoft Agent?
Microsoft Agent 是一项出色的技术。它是一组支持交互式动画角色呈现的服务。它可用于各种场景,如介绍、引导、娱乐等。例如,当您编写地址簿程序时,如果能添加一些有趣的交互方式与用户交流,效果会非常棒。MsAgent 也可以放置在网页上,但这又是另一个话题了。
引言
本文将介绍我最近编写的一组包装类。其中包含一些我需要但尚未包含的功能。我决定自己编写它们。- 提示窗口 - 一个带有灯泡的小窗口。
- 输入气泡 - 一个带有控件的窗口。它用于从用户那里获取数据。这个气泡与 Office 助手中的气泡非常相似(参见图片)。
如何将其添加到项目中?
该库包含几个类。首先下载源代码文件并解压。然后将除 AgtErr.h, AGTSVR.H 和 AgtSvr_i.c 之外的所有文件添加到项目中。打开 Agent.h。您会在文件开头看到下面显示的常量。如果您不想使用提示/输入气泡,请将它们注释掉。
#define BALLOONINPUT // Input MFC balloon #define TIP // Tip MFC balloon
接下来,您应该添加用于气泡和提示窗口的适当位图 - 仅当您想使用这些功能时。它们显示在图 1 中。
![]() |
Picture 1 |
- IDB_BUTTON - 包含按钮三种状态的位图:正常/焦点/按下
- IDB_CHECKBOX - 包含复选框四种状态的位图:正常/焦点/按下/选中
- IDB_RADIO - 包含单选按钮四种状态的位图:正常/焦点/按下/选中
- IDB_TIP - 将在提示窗口中显示的位图。RGB (255, 0, 255) 是透明色。
我附带了示例位图,但单选按钮和复选框是相同的。
如何显示角色?
这很简单,但有几个重要的步骤。
- 首先,您必须初始化 COM 库。您可以通过在程序的非常开头添加以下行来实现,例如在
CWinApp::InitInstance
中。
CoInitialize( NULL );
CoUninitialize ();
try { m_pSink = new CSink(); // Create NotifySink m_cAgent.Init ( m_pSink ); // Init MsAgent // Load Merlin m_cAgent.LoadCharacter ( "merlin.acs", &m_cAgent.m_lDefaultCharID ); m_cAgent.SetLanguageID ( 0x0409 ); // Set language ID m_cAgent.Show (); // Show MsAgent } catch (int *pErr) { // An error MessageBox ("Init err"); PostQuitMessage( 0 ); delete pErr; }
什么是 NotifySink 类?如何编写它?
NotifySink
是一个类,它接收来自其他类的事件(在此示例中为 MsAgent)。当用户单击角色时,我们可以收到单击事件,例如显示弹出菜单。这非常有用。
如果您想利用这个类,请按照以下步骤操作:
- 从
CAgent::CNotifySink
派生一个类(如示例所示)。 - 覆盖您想要的函数(事件)。如果您想获得单击通知,该函数将是 Click。
注意:所有参数必须与基类中的相同。
注意:如果您希望提示/输入气泡正常工作,您应该调用基类中的函数。 - 处理完消息后,返回
NOERROR
值。
如何制作一个角色?
有人问我如何制作自己的角色。您应该从 Microsoft 下载角色编辑器。大约 1MB。如果您自己制作角色,可以发送给我 。我将非常高兴。
所需文件可从以下网址下载:
- MsAgent 核心 此文件安装主库,但您还必须下载至少 1 个角色(或自己制作,参见上一段)。
- 字符
Merlin 1.78MB Genie 1.55MB Peedy 3.24MB Robby 2.12MB 参见上面的示例。
有关更多信息,请访问 MsAgent 主页 或 MsAgent Ring,您可以从那里下载免费角色。其中一些相当不错。
历史
- 2002 年 8 月 25 日
现在包装类可以与 VC++ 7.0 正常工作。 - 2002 年 3 月 12 日
包装类是全新的。我重新编写了它。现在您可以同时加载多个角色。基本的语音支持现已存在。 - 2001 年 12 月 18 日
首次改进文章。 - 2001 年 12 月 5 日
创建了包装类。它包含了主要功能、Balloon(负责气泡选项)、NotifySink。
快速参考
这里我将只描述主要函数,因为其余的都非常简单。
CAgent
这是主类。它包含了主要功能。此类的某些函数应放在 try-catch 块中,否则如果发生错误,程序将崩溃。
void Init ( CNotifySink* pNotifySink = NULL);
throw ( int );
初始化 MsAgent。
pNotifySink - NotifySink 的指针。
void LoadCharacter ( CString strChar, long *pCharID );
throw ( int );
加载角色。
strChar - 角色文件。通常角色位于 [c:\windows]\msagnet\chars。此文件夹中的一个 .acs 文件就是一个角色。
pCharID - 加载的角色 ID。您必须在调用其他函数时使用它。您可以将其存储在 m_lDefaultCharID 成员中,然后将 -1 传递给函数而不是 ID。
void Play ( BSTR bstrAnimation, long lCharID = -1 );
void Play ( CString strAnimation, long lCharID = -1 );
throw ( int );
播放动画。
strAnimation, bstrAnimation - 动画名称。您可以使用 GetAnimationNames
函数获取它们。
pCharID - 角色 ID。如果想使用存储在 m_lDefaultCharID
中的 ID,则为 -1。
void SetLanguageID ( long lLangID, long lCharID = -1);
throw ( int );
设置语言 ID。
lLangID - 语言 ID // 注意:所有 ID 都在头文件开头进行了枚举。
如何配置输入气泡?
m_cAgent.GetInputBalloon()->SetUpControls( m_nButtons, m_nRadios, dwFlags ); /* dwFlags: - BI_CHECKBOX - check box visible - BI_CHECKBOXSEL - checkbox selected - BI_TEXTBOX - textbox visible - BI_SINGLELINE - textbox singleline */ m_cAgent.GetInputBalloon()->m_strTitle = m_strTitle; // Set title text m_cAgent.GetInputBalloon()->m_strText = m_strText; // Set text m_cAgent.GetInputBalloon()->SetPosition( ); // Calc contols position nReturn - m_cAgent.GetInputBalloon()->Show( m_hWnd, dwFlags ); // Show /* dwFlags: - BI_RADIORETURN - return after radio click - BI_CHECKRETURN - return after checkbox click nReturn: - -1 - cancelled - IDC_CHECKBOX - checbox - between IDC_BUTTONS and IDC_RADIOS - button - greater then IDC_RADIOS - radio For a sample code see demo project */
联系方式
如果您有任何疑问,可以联系我,将错误和意见发送至 GreenSequoia@wp.pl。