首先我们定义窗口类,代码如下:
#pragma once
#include "DGModule.hpp"
class CTestDlg: public DG::ModalDialog
, public DG::CompoundItemObserver
, public DG::PanelObserver
{
public:
CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule);
~CTestDlg();
};
模态窗口需要继承DG::ModalDialog,另外如果需要在该类中响应窗口消息,则需要继承Observer相关类
#include "CTestDlg.h"
#include "API_Guid.hpp"
#include "ACAPinc.h"
CTestDlg::CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule)
:DG::ModalDialog(dialModule, resId, dialIconModule)
{
}
CTestDlg::~CTestDlg()
{
//
}
然后在grc文件中定义窗口资源
//Modal为窗口类型,如果是模态窗口则规定窗口类型为Modal、非模态窗口的窗口类型必须为Palette
//另外窗口的id也有区别非模态的窗口id值为32400 - 32499之间、模态窗口的id值为32500 - 32767之间
'GDLG' 32503 Modal 40 0 504 200 "Modal Test" {
}
'DLGH' 32503 DLG_32503_ModalTest {
}
GDLG为窗口描述,里边定义窗口的id、类型、位置信息、title以及窗口所包含控件的位置信息等数据
DLGH为窗口帮助,为窗口上的每个控件定义提示文本
窗口展示:
CTestDlg modelessdlg(ACAPI_GetOwnResModule(), 32503, ACAPI_GetOwnResModule());
modelessdlg.Invoke();
这样我们的窗口就展示出来了。
下边我们再介绍介绍如何在窗口上添加控件,以及控件事件的响应。
首先我们在grc文件中的我们定义的窗口中添加两个按钮“OK”、“Cancel”。grc文件定义如下:
'GDLG' 32503 Modal 0 0 504 200 "Modal Test" {
/* [ 1] */ Button 412 168 70 24 LargePlain "OK"
/* [ 2] */ Button 332 168 70 24 LargePlain "Cancel"
}
'DLGH' 32503 DLG_32503_ModalTest {
1 "ok" Button_0
2 "cancel" Button_1
}
运行程序我们会看到我们的窗口上会出现两个按钮,但是点击按钮没有任何反应,这是因为我们没为按钮添加响应。下边我们再去看看如何给按钮添加响应事件。
首先我们让我们的事件处理类继承按钮事件类,我这里是将事件处理跟窗口类放在一起了所以我们的窗口类继承按钮事件处理类。并且重写ButtonClicked函数。另外在类中也定义了按钮相关变量。代码如下:
class CTestDlg: public DG::ModalDialog
, public DG::CompoundItemObserver
, public DG::PanelObserver
, public DG::ButtonItemObserver
{
DG::Button okButton;
DG::Button cancelButton;
enum {
OkButtonId = 1,
CancelButtonId = 2
};
public:
virtual void ButtonClicked(const DG::ButtonClickEvent& ev) override;
public:
CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule);
~CTestDlg();
};
然后在构造函数中根据按钮id对按钮进行初始化
CTestDlg::CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule)
:DG::ModalDialog(dialModule, resId, dialIconModule),
okButton(GetReference(), OkButtonId),
cancelButton(GetReference(), CancelButtonId)
{
//需要调用该函数,不然事件无法触发
AttachToAllItems(*this);
this->Attach(*this);
}
然后我们重写按钮点击事件ButtonClicked函数
void CTestDlg::ButtonClicked(const DG::ButtonClickEvent& ev)
{
if (ev.GetSource() == &okButton)
{
PostCloseRequest(DG::ModalDialog::Accept);
}
else if (ev.GetSource() == &cancelButton)
{
PostCloseRequest(DG::ModalDialog::Cancel);
}
}
这样窗口中的OK跟Cancel按钮的事件将会被触发。

826

被折叠的 条评论
为什么被折叠?



