SDI文档模式下调用对话框实现在对话框上绘图操作,并且进行文档和对话框之间的数据传输

来源:互联网 发布:流星网络电视免费版 编辑:程序博客网 时间:2024/05/01 10:48

哎,真是不容易,综合好人人的好多方法。如下是步骤:(测试用的啦!)

首先建立一个SDI,然后在对话框选项处新建一个对话框,在新建的对话框加入如下的控件:picture,我们可以看到它的默认属性是IDC_STATIC,不用管它了,就用默认名字。

然后点击类向导,新建一个类,名字我取为:CPaintDlg。建好类之后为该类添加消息函数(注意啦,这个函数不是自己写的,是系统自带的WM_PAINT,就是messages下面的那个,很多人做了那个对话框没反应估计是这个原因;另外下面的这个函数一定要在CPaintDlg类下面写,不要去什么view底下写,那样会报错的),函数如下:

void CPaintDlg::OnPaint()
{
   CPaintDC dc(this); // device context for painting
 
 // TODO: Add your message handler code here
    CWnd *pWnd=GetDlgItem(IDC_STATIC); //获取控件窗口句柄
    CDC *pControlDC=pWnd->GetDC();          //取设备句柄
    pWnd->Invalidate();                                       //置窗口为无效状态
    pWnd->UpdateWindow();                              //更新窗口
    pControlDC->SelectStockObject(BLACK_BRUSH);
    pControlDC->Rectangle(0,0,m_nWidthEdit,m_nHeightEdit);
    pWnd->ReleaseDC(pControlDC);                  //释放动态设备对象

 // Do not call CDialog::OnPaint() for painting messages
}

这里有两个参数我还没有进行说明,在CPaintDlg类下面添加如下两个int类型的公有成员变量,目的是一会跟view类的数据交互用,初不初始化都行。

然后就跑到view那边进行操作了。首先我们给菜单栏添加新的菜单项我添加了“画图”ID就为ID_Paint,说不说明无所谓,然后去类向导里面添加画图菜单的COMMAND,程序如下:

void CPaintView::OnPaint()
{
   CPaintDlg dlg;
   dlg.m_nWidthEdit=m_nWidth;
   dlg.m_nHeightEdit=m_nHeight;
   if (dlg.DoModal()==IDOK)
   {
    m_nWidth=dlg.m_nWidthEdit;
    m_nHeight=dlg.m_nHeightEdit;
    Invalidate();
   }
}
注意啦:这里的OnPaint跟系统的OnPaint不是一码事,两者命名一样纯属巧合,如果觉得别扭在画图菜单的ID处修改即可。

还有这里有两个东西还没有定义的:m_nWidth,m_nHeight。这两个在view类里面进行下定义吧:int型,访问权限为Public,然后在view构造函数里给它们赋个初值。

上面的函数的作用就是实现view和CPaint类之间的一个参数的交互了。

然后我们在view里的OnDraw里面验证一下有没有反应,程序如下:

void CPaintView::OnDraw(CDC* pDC)
{
 CPaintDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 CString str;
 str.Format("w=%d,H=%d",m_nWidth,m_nHeight);
 pDC->TextOut(50,50,str);
 // TODO: add draw code for native data here
}

恩,注意啦,因为在view类里面调用了CPaint类,所以头文件要包含进来才能编译的通的说。

好了,可以去编译试试看啦,在view里面修改m_nWidth,m_nHeight的值,或者在CPaint里面修改m_nWidthEdit,m_nHeightEdit的值看看是不是变化啦!