现在我们在菜单栏上设置4个按钮,点,线,矩形,椭圆。选择后,可以在View窗口中画相应的图形。
1、在菜单栏中增加4个菜单 点(IDM_DOT),线(IDM_LINE),矩形(IDM_RECTANGLE),椭圆(IDM_ELLIPSE)
2、分别为每个菜单项添加COMMAND消息响应函数
3、设置2个View类的成员变量 UINT m_nDrawType;CPoint m_ptOrigin;用来分别保存画图类型和起始点坐标。
4、生成View上的OnLButtonDown和OnLButtonUp消息相应函数;在OnLButtonDown函数中,记录下m_ptOrigin的原始鼠标地址。在OnLButtonUp函数中根据m_nDrawType中的值,进行绘图。插入一下代码:
CClientDC dc(this); /*产生一个window的子区域*/
switch (m_nDrawType) /*判断m_nDrawType的值*/
{
case 1:
dc.SetPixel(m_ptOrigin,RGB(255,0,0)); /*
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
5、如果我们要让画的图形为红色,内部不被白色重绘的话,在switch前加入一下代码:
CPen pen(PS_SOLID,2,RGB(255,0,0)); /*创建一个红色的实线CPen对象,宽度为2*/
dc.SelectObject(&pen); /*将画笔对象添加到dc的属性列表里*/
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); /*创建一个空的画刷*/
dc.SelectObject(pBrush); /*将画刷对象添加到dc的属性列表里*/
6、添加一个可以设置线宽和线型的对话框
首先,添加一个对话框,IDD_DLG_SETTING,并新建一个 CSettingDlg类。在对话框中添加一个Edit输入框,将id改为IDC_LINE_WIDTH,和属性为 public:UINT 的成员变量m_nLineWidth相关联。在View类中也添加一个 private: UINT m_nLineWidth 的成员变量。在添加一个Group Box,添加3个Radio Button,分别叫实线、虚线、点线。注意,将第一个“实线”的属性页中,把group选择。用类向导将IDC_RADIO1和m_nLineStyle相关联。在View类中建2个成员变量
public:
UINT m_nLineWidth;
int m_nLineStyle;
在CSettingDlg类的构造函数中,将以上两个变量初始化为0;
在View中新建一个IDD_DLG_SETTING窗体的ONSETTING窗体相应函数,加入代码:
CSettingDlg dlg;
dlg.m_nLineWidth=m_nLineWidth; /*将原先view类中保存的线宽参数取回。否则会因为每次打开对话框而令m_nLineWidth初始化为0*/
dlg.m_nLineStyle=m_nLineStyle; /*原因同上*/
if (IDOK==dlg.DoModal())
{
m_nLineWidth=dlg.m_nLineWidth;
m_nLineStyle=dlg.m_nLineStyle;
}
并在5中的代码 CPen pen(PS_SOLID,2,RGB(255,0,0)); 改为 CPen pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0));
7、通过一个颜色对话框来设置图形的颜色
可以在菜单栏中增加一栏,命令相应为弹出一个颜色对话框。在view中添加一个private: COLORREF m_clr;成员变量来保存颜色设置。在菜单的命令相应函数中代码如下:
void CGraphicView::OnColor()
{
CColorDialog c_dlg;
c_dlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT; /*这里注意要和Flags的初始值相或,否则因为覆盖了原来的初始值而产生错误。如果要对颜色进行初始化设置,则必须添加CC_RGBINIT参数,否则初始化无效,默认为黑色。CC_FULLOPEN参数为打开时默认全部展开颜色对话框。*/
c_dlg.m_cc.rgbResult=m_clr;
if (IDOK==c_dlg.DoModal())
{
m_clr=c_dlg.m_cc.rgbResult; /*rgbResult为返回的颜色*/
}
}
8、用用户所选择的字体样式将字体的名字在view中显示。
在view中添加两个成员变量
private:
CString m_strFontName;
CFont m_font;
在菜单中添加一个“字体”项,在菜单的消息相应函数中代码如下:
void CGraphicView::OnFont()
{
CFontDialog fdlg;
if (IDOK==fdlg.DoModal()) /*判断是否选择OK按钮*/
{
if (m_font.m_hObject) /*判断m_font对象是否已被创建*/
m_font.DeleteObject(); /*如果被创建就删除对象*/
m_font.CreateFontIndirect(fdlg.m_cf.lpLogFont); /*根据对话框中选择的字体创建*/
m_strFontName=fdlg.m_cf.lpLogFont->lfFaceName; /*将选择的字体名称复制给变量*/
Invalidate(); /*将客户区域View设置为无效*/
} /*直到窗口发生重绘*/
}
在窗口的OnDraw事件中,添加如下代码:
pDC->SelectObject(&m_font); /*先设置区域的字体对象*/
pDC->TextOut(0,0,m_strFontName); /*在view窗体左上角显示字体*/
9、在6中增加一个预览区域
添加一个Group Box区域ID改为IDC_SAMPLE,为EDIT添加一个OnChange消息响应函数,为三个Radio Button添加OnClick消息响应函数。都加上一下代码:
Invalidate(); //所有处理都交由OnPaint消息统一处理
增加一个OnPaint消息响应函数,代码如下:
void CSettingDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
UpdateData(); /*升级对话框。不写这句,将会发现预览不会变*/
CPen pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0)); /*首先创建一个画笔*/
dc.SelectObject(&pen); /*将画笔元素放到绘图设备中*/
CRect rect;
GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect); /*创建一个矩形,将预览区域的
值赋给矩形*/
ScreenToClient(&rect); /*此矩形是以屏幕左上角为原点
的,需要转化为对话框的坐标*/
dc.MoveTo(rect.left+20 , rect.top+rect.Height()/2); /*起点*/
dc.LineTo(rect.right-20 , rect.top+rect.Height()/2);/*画线*/
}
如果想预览是也能看到自定义的颜色,需要在对话框属性中添加一个 public: COLORREF m_clr,成员变量。在view类设置颜色对话框时,将view类中的m_clr复制给设置对话框下的m_clr,即可。