MFC实现简单画图形程序Word文件下载.docx
《MFC实现简单画图形程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《MFC实现简单画图形程序Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
COLORREFm_CurrentBrushColor;
//用于存放当前画刷的颜色。
COLORREFm_CurrentPenColor;
//用于存放当前画笔的颜色.
intnum;
//用于存放从"
Index。
txt"
文件中读取的数字。
intflag=0;
//用于标识:
当为1时,表示按下了"
画图”按钮;
当为2时,表示按下了"
撤消”按钮;
当为3时,表示按下了"
加载历史”按钮,则从文件中读取信息。
intmark;
//用于标识:
当为0时,表示刚画过矩形;
当为1时,表示刚画过圆角矩形;
当为2时,表示刚画过椭圆.
intindex;
//用于存放pta数组的容量。
intflag1=0;
//用于标识,和flag搭配,用来处理多种情况下的窗口重绘问题。
intButtonState=0;
//用于标识,是类CShow和类CMy0910200155Dlg的一个接口,通过其值在1和0之间转换,来处理弹出式对话框的初次绘制和移动时的重绘问题。
三、CMemoryNode类中变量的作用:
COLORREFBrushColor;
COLORREFPenColor;
intMark;
//以上三者为类CMemoryNode的成员变量,分别用来保存
绘图时画刷颜色,画笔颜色和形状。
四、与控件相关联的变量:
CComboBoxm_BrushColor;
//指示画刷颜色组合框.
CComboBoxm_PenColor;
//指示画笔颜色组合框。
CListBoxm_Shape;
//指示形状列表框.
五、应用程序功能的具体实现:
1)初始化过程:
this—〉m_Shape。
AddString(”矩形"
);
//给形状列表框添加一个项目.
this—>
m_PenColor.AddString("
红色"
);
//给画笔颜色框添加一个项目。
this-〉m_BrushColor.AddString(”白色”);
//给画刷颜色框添加一个项目。
(剩余项目的添加方法完全相同,就不再赘述了)
m_PenColor。
SetCurSel(0);
m_BrushColor.SetCurSel(4);
m_Shape。
SetCurSel
(2);
//设置光标初始定位.
m_CurrentBrushColor=RGB(0,0,255);
//画刷颜色设置默认初值为蓝色。
m_CurrentPenColor=RGB(255,0,0);
//画笔颜色设置默认初值为红色.
this->
SetWindowText(”简单画图形程序”);
//设置窗口标题。
RECTrect;
this—>
GetWindowRect(&
rect);
//得到窗体的大小。
CRgnrgn;
rgn.CreateRoundRectRgn(
rect.left+3,rect.top+5,rect.right—2,rect.bottom—2,40,40);
this—〉SetWindowRgn((HRGN)rgn。
GetSafeHandle(),TRUE);
//按要求绘制圆角矩形的窗体。
ifstreaminfile1(”Index.txt"
,ios:
:
nocreate);
if(!
infile1)this->
GetDlgItem(IDC_BUTTON_LOAD)-〉EnableWindow(FALSE);
//通过”Index。
txt”文件是否存在来决定”加载历史”按钮的状态,如果存在则可用,否则不可用。
2)窗口绘制过程:
此过程调用OnPaint()函数,涉及多种情况下的图形绘制和窗口重绘,是相对比较核心的部分,将在后面具体逐个分析.
六、从某一次程序运行的角度说明各个函数的功能:
首先打开应用程序,系统将自动创建窗体,在窗体弹出的一瞬间,你会发现窗体是圆角形的,其次感觉颜色比较柔和.这归功于初始化中的:
RECTrect;
this—〉GetWindowRect(&
rect);
rgn。
CreateRoundRectRgn(
rect.left+3,rect.top+5,rect。
right-2,rect。
bottom-2,40,40);
this-〉SetWindowRgn((HRGN)rgn.GetSafeHandle(),TRUE);
//绘制圆角矩形的窗体。
和应用类初始化中添加的:
SetDialogBkColor(RGB(80,80,180),RGB(0,0,0));
//设置窗体颜色。
如果是第一次使用该程序,那么你将看到"
加载历史”按钮是灰化的,不能使用,这是因为初始化中使用了该语句,
ifstreaminfile1(”Index。
,ios:
:
if(!
infile1)this—〉GetDlgItem(IDC_BUTTON_LOAD)—〉EnableWindow(FALSE);
没有创建过”Index.txt”文件,当然无法读取!
将已有的"
文件删除,然后重新启动系统,会有相同的效果.
你会看到窗口中”形状"
,”画笔颜色”,”填充颜色"
分别默认为”圆角矩形"
,"
红色”,"
蓝色”,这是因为在初始化过程中,已经对相应的变量赋值,而且设置了光标选择:
m_PenColor。
m_BrushColor。
SetCurSel(4);
SetCurSel
(2);
//设置光标初始定位。
m_CurrentBrushColor=RGB(0,0,255);
//画刷颜色设置默认初值为蓝色.
m_CurrentPenColor=RGB(255,0,0);
//画笔颜色设置默认初值为红色。
如果我们想画一个边框为洋红色,填充色为青色的圆角矩形,那么当鼠标点击”画笔颜色”下的"
洋红”时,将触发组合框IDC_COMBO_PEN_COLOR的CBN_SELENDOK消息,将调用,
voidCMy0910200155Dlg:
OnSelendokComboPenColor()
{
intn=m_PenColor。
GetCurSel();
switch(n)
{
case0:
m_CurrentPenColor=RGB(255,0,0);
break;
case1:
m_CurrentPenColor=RGB(0,255,0);
case2:
m_CurrentPenColor=RGB(0,0,255);
case3:
m_CurrentPenColor=RGB(255,255,0);
break;
case4:
m_CurrentPenColor=RGB(255,0,255);
case5:
m_CurrentPenColor=RGB(0,255,255);
default:
m_CurrentPenColor=RGB(0,0,0);
}
}
同理可知,当鼠标点击”填充颜色"
下的”青色”时,将触发组合框IDC_COMBO_BRUSH_COLOR的CBN_SELENDOK消息,将调用,
OnSelendokComboBrushColor()
intn=m_BrushColor。
GetCurSel();
case6:
m_CurrentBrushColor=RGB(255,0,0);
case5:
m_CurrentBrushColor=RGB(0,255,0);
case4:
m_CurrentBrushColor=RGB(0,0,255);
case3:
m_CurrentBrushColor=RGB(255,255,0);
case2:
m_CurrentBrushColor=RGB(255,0,255);
case1:
m_CurrentBrushColor=RGB(0,255,255);
default:
m_CurrentBrushColor=RGB(255,255,255);
}
这两个函数能将光标的选择转换为画笔或画刷的颜色。
不过,当然必须先给组合框添加过一个CBN_SELENDOK消息!
然后点击”形状”下的”圆角矩形”,这时this-〉m_Shape。
GetSel
(1)其值为TRUE,表明”圆角矩形”被选中了,当然,其它两个m_Shape.GetSel(0)和m_Shape.GetSel
(2)都为FALSE.
在画图前,如果你足够细心,你会注意到刚才在选颜色时,如果颜色还没有选定,它周围就会有一个当前颜色的色圈,而当颜色已选定时,色圈就会变为彩色背景,这是因为之前给类CMy0910200155Dlg添加了WM_CTLCOLOR消息,因此当触发该消息时,会调用,
HBRUSHCMy0910200155Dlg:
OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
HBRUSHhbr=CDialog:
OnCtlColor(pDC,pWnd,nCtlColor);
if(pWnd—>
GetDlgCtrlID()==IDC_COMBO_PEN_COLOR)
hbr=:
CreateSolidBrush(this—>
m_CurrentPenColor);
pDC->
SetBkColor(this-〉m_CurrentPenColor);
}
if(pWnd-〉GetDlgCtrlID()==IDC_COMBO_BRUSH_COLOR)
CreateSolidBrush(this—〉m_CurrentBrushColor);
pDC—>
SetBkColor(this—>
m_CurrentBrushColor);
}
returnhbr;
}
该方法可以实现控件颜色的改变,考虑到界面的简洁(不是简单)和色彩协调,其它控件的颜色就不必改变了。
做好了这些准备工作,现在我们开始绘图,点击”绘图”按钮,就触发了IDC_BUTTON_DRAW的BN_CLICKED消息,会调用,
voidCMy0910200155Dlg:
OnButtonDraw()
flag=1;
flag1=1;
OnPaint();
this-〉GetDlgItem(IDC_BUTTON_LOAD)->
EnableWindow(FALSE);
在这里,我们只将flag=1和flag1=1条件下的OnPaint()函数展开(系统自己生成的代码我们略去)