模态对话框用起来很方便,直接定义一个对话框对象,然后调用DoModal(); 即可
如:
void CYuanView::OnSet()
{
// TODO: Add your command handler code here
CSettingDlg dlg;
if(IDOK==dlg.DoModal())
{
m_x=dlg.m_dlgx;
m_y=dlg.m_dlgy;
m_r=dlg.m_dlgr;
}
Invalidate();//使得窗口无效 让系统自动调用ondraw()函数 默认参数是true 表示刷新背景 如果是false则不刷新背景
}
要改成非模态的一般在调用对话框的时候动态new一个对话框对象出来 然后依次调用create 和 showindow函数即可显示出来
如:
void CYuanView::OnSet()
{
// TODO: Add your command handler code here
if(dlg == NULL)
{
dlg = new CSettingDlg;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW);
}
else
{
dlg->SetActiveWindow();
}
}
为了点击onset对应的按钮时候 只实例化出来一个对话框
在对应的view类中添加一个 对话框对象的指针,并在view的构造函数中初始化其为NULL;
public:CSettingDlg * dlg;CYuanView::CYuanView()
{
// TODO: add construction code here
dlg = NULL;//初始化
}
如果dlg != NULL 则把对话框设置为当前的活动窗口
dlg->SetActiveWindow();
这样就能实现点击onset对应的按钮会出现一个对话框出来
接下来要实现的是在点击对话框中的确定按钮的时候 调用view类中ondraw函数来实现画圆的操作
用最简单的关联变量法,先把对话框中的三个edit控件分别关联三个变量,用来接受用户输入的数值,先来看一下,一直说的对话框的样子
当点击确定按钮的时候,要首先通过UpdateData(TRUE)函数获得用户的输入,然后再把用户的输入传给view类,并且调用view的ondraw函数,
我是这样做的 ,给对话框增加一个view类的指针成员变量
public:
CYuanView * m_pView;
然后通过类向导增加一个OnInitDialog函数(这是一个消息响应函数 WM_INITDIALOG),在这个函数中让m_pView指向当前的活动的view类
BOOL CSettingDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
//AfxMessageBox("aqwe");
m_pView = (CYuanView*)((CMainFrame*) AfxGetMainWnd())->GetActiveView();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
这样就可以通过m_pView来调用view类中的函数了,如果直接调用OnDraw函数 ,可以看到OnDraw函数有一个CDC *pDoc的指针,暂时不知道怎么获得这个参数。。。
还是通过view类的Invalidate函数来让系统自动调用OnDraw函数.
在调用之前当然要先把刚才获得的用户输入传给view类对应的变量(m_x , m_y ,m_r)
我们是要在点击确定的时候画圆,所以在对话框的确定函数中调用view类对应的函数
可以在view类中增加一个自定义的函数 My