RiCGEN_BY_X() 的作用与 CGEN_BY_X() 相同。这两个语句都可用于从全局函数中发送事件。
RiCGEN_BY_X() 使用 RiCReactive_genBySender() 框架例程来发送事件,这是因为,它将特定对象标识为事件的发送方。
例如,要将 fault() 事件发送到 Furnace[1] 实例并同时将该事件的发送方标识为 Room[2],请使用以下代码:
RiCGEN_BY_X(Furnace[1], fault(), Room[2], Room);
在本例中,最后一个自变量 Room 用于标识发送方的类型。
只有在知道哪个 AOMAnimationItem 正在发送消息的特殊情况下,才应使用 GEN_BY_X,这是因为 IBM® Rational® Rhapsody® 在没有帮助的情况下无法确定原因。例如,您可以创建包含一些 GUI 类(例如 GUI1 和 GUI2)以及一些用于执行操作的类(例如 Huey 和 Louey)的应用程序。请在 Rational Rhapsody 中创建所有这些类,以使动画显示全部这四个类的实例。
使一些 GUI 与 GUI1 和 GUI2 类相关联。由于使用 MFC 向导创建 GUI 比使用 Rational Rhapsody 创建 GUI 更为方便,因此请使用向导。GUI1 的构造函数将构造一个带有一些按钮的非模态对话框。
配置每个按钮以生成事件。例如:
void myDialog::OnButtonXPushed() {
myHuey->GEN(E);
}
此配置能够正常工作,只是动画无法确定事件的来源。您可以改为按以下方式使用 GEN_BY_GUI:
void myDialog::OnButtonXPushed() {
myHuey->GEN_BY_GUI
动画输出窗口将显示以下消息:
GUI 生成了事件 E
如果类 myDialog 包含指向其所属的 GUI1 实例的方法 GUI1 *myOwner,那么您可以编写以下代码:
void myDialog::OnButtonXPushed() {
myHuey->GEN_BY_X(E,myOwner);
}
在本例中,动画(输出窗口、事件队列和时序图)将显示 E 来自于正确的 GUI1 对象。在 GUI 及其对话框是用于创建一些尚未编写的实际类的测试装置时,此方法尤其有用。
RiCGEN_BY_X() 的定义如下所示:
#define RiCGEN_BY_X(INSTANCE,EVENT,SENDER,theClass) \
{ \
if ((INSTANCE) != NULL) { \
RiCReactive * reactive = &((INSTANCE)->ric_reactive);\
RiCEvent * event = &(RiC_Create_##EVENT->ric_event); \
RiCReactive_genBySender(reactive, event, \
aomX2Item(SENDER,aomc##theClass)); \
} \
}