65.9K
CodeProject 正在变化。 阅读更多。
Home

MsAgent 角色的包装器类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (8投票s)

2001年12月11日

5分钟阅读

viewsIcon

237913

downloadIcon

3668

一篇提供使用 msagent 字符的便捷方法的文章

Sample Image - screen.jpg

什么是 Microsoft Agent?

Microsoft Agent 是一项出色的技术。它是一组支持交互式动画角色呈现的服务。它可用于各种场景,如介绍、引导、娱乐等。例如,当您编写地址簿程序时,如果能添加一些有趣的交互方式与用户交流,效果会非常棒。MsAgent 也可以放置在网页上,但这又是另一个话题了。

引言

本文将介绍我最近编写的一组包装类。其中包含一些我需要但尚未包含的功能。我决定自己编写它们。
  • 提示窗口 - 一个带有灯泡的小窗口。
  • 输入气泡 - 一个带有控件的窗口。它用于从用户那里获取数据。这个气泡与 Office 助手中的气泡非常相似(参见图片)。

如何将其添加到项目中?

该库包含几个类。首先下载源代码文件并解压。然后将除 AgtErr.h, AGTSVR.HAgtSvr_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 ();
    
  • 创建一个新的 `CAgent` 类型变量。
  • 我们需要在这里停一会儿。还有一件事,如果您想使用提示/输入气泡。您必须创建一个 NotifySink(参见下一段)。没有它,气泡将无法正确移动。
  • 现在我们只需要初始化 MsAgent。下面的代码显示了如何执行此操作。
    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

© . All rights reserved.