赞
踩
哎,真是不容易,综合好人人的好多方法。如下是步骤:(测试用的啦!)
首先建立一个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的值看看是不是变化啦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。