VC++6.0使用MFC创建应用程序框架操作步骤示例
使用VC6编写一个计算器MFC
使用VC6编写一个计算器MFC回答如下:要使用VC6编写一个计算器MFC应用程序,首先需要创建一个新的MFC项目。
在VC6中,选择“创建一个新的工程”,然后选择“MFC应用程序”,并命名该项目为“Calculator”。
接下来,在“CalculatorDlg.h”文件中,可以编写计算器对话框类的代码。
在该类中,需要声明所有添加到对话框中的控件的成员变量。
例如,可以声明一个`CEdit`类型的指针变量来引用屏幕上的文本框控件。
此外,还可以声明其他成员变量来存储计算器的状态和当前操作数的值。
然后,在“CalculatorDlg.cpp”文件中,可以实现计算器对话框类的代码。
在该文件中,需要实现对话框的初始化、按钮单击事件的处理等功能。
例如,可以在对话框的`OnInitDialog`函数中初始化计算器的状态,并将其他控件的消息映射到对应的成员函数上。
然后,在对应的成员函数中,可以编写相应的代码来处理按钮单击事件,进行计算,并将结果显示在屏幕上。
在编写计算器的核心功能时,可以使用`+`、`-`、`*`和`/`等运算符来实现加法、减法、乘法和除法。
此外,还可以添加其他功能,如取余、开方等。
为了实现这些功能,可以在对话框类中添加成员函数,然后在相应的按钮单击事件中调用这些函数。
最后,在项目的构建选项中,将“字符集”设置为“使用Unicode字符集”,以支持使用中文。
然后,编译并运行该项目,就可以看到一个MFC计算器应用程序在屏幕上显示出来。
总结起来,在VC6中编写一个计算器MFC应用程序需要完成以下步骤:1.创建新的MFC项目,并添加所需的控件。
2.在对话框类中声明和实现计算器界面的成员变量和函数。
3.在对应的按钮单击事件处理函数中编写计算器的核心功能。
4. 在项目的构建选项中设置字符集为Unicode字符集。
5.编译并运行项目,测试计算器应用程序。
以上是一个简单的使用VC6编写一个计算器MFC的步骤。
当然,具体的实现还有很多细节需要注意和完成,如错误处理、界面美化等。
vc6.0使用教程详解
你首先要打开VC6.0界面,一般用得较多的是Win32控制台应用程序(源程序,扩展名.cpp),步骤是:(先工程—后文件—编译—连接---运行)1,建立一个工程,“文件”——“新建”,出现下面界面:选择“Win32 Console Application”(控制台应用程序,左边倒数第三个),命名工程名称,选择保存位置,点击“确定”,进入下一步,看到如下提示界面:建立一个空工程,对应其他需要的你一可以建立别的工程;点击“完成”,之后:显示你创建的工程的信息。
2,再在有一个的工程的条件下,我们再建立一个源文件;“文件”——“新建”(快捷键Ctri+N),出现:建立源文件,选择“C++ Source ”,一般都是建立这种文件的(适用在当文件中适用)如果要建立头文件的话,选择“C/C++ Header File”,(适用在多文件工程中使用)命名,文件名称,点击“确定”,之后:进入编辑区,在主界面编写代码:如下编写完之后呢:可以按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接),最后,点运行按钮,就可以运行了。
如果是您有代码如:cpp文件,或.h 文件,想添加都VC6.0里来测试的话,可以这样做:首先,要理解一下文件扩展名为:cpp和.h文件扩张名是.h,代表的是头文件,一般是书写一些函数原型,以及一些在整个程序中常用到的结构体,频繁使用的函数说明,定义等等;文件扩张名为,cpp的,是C++中的源文件,也是最常用到的文件,每建立一个工程都要至少一个源文件(至少要有一个函数入口——主函数main() ),包含了核心代码;建立与运行说明:(以VC 6.0编译器为例,其他编译器类似)首先,打开VC 6.0编译环境;在菜单栏——文件(的下拉菜单中选择“新建”),在弹出的选择窗口中,选择Win32 Console Application(控制台应用程序),在填写工程名称,选择一个程序保存路径,点击“完成”,查看工程信息。
VC++6.0使用方法
Visual C++ 6.0上机指南一、Visual C++ 6.0概述Visual C++6.0是微软公司推出的目前使用极为广泛的基于Windows平台的可视化集成开发环境,它和Visual Basic、Visual Foxpro、Visual J++等其它软件构成了Visual Studio(又名Developer Studio)程序设计软件包。
Developer Studio是一个通用的应用程序集成开发环境,包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。
使用Visual Studio,可以完成创建、调试、修改应用程序等的各种操作。
VC++6.0提供面向对象技术的支持,它能够帮助使用MFC库的用户自动生成一个具有图形界面的应用程序框架。
用户只需在该框架的适当部分添加、扩充代码就可以得到一个满意的应用程序。
VC++6.0除了包含文本编辑器,C/C++混合编译器,连接器和调试器外,还提供了功能强大的资源编辑器和图形编辑器,利用“所见即所得”的方式完成程序界面的设计,大大减轻程序设计的劳动强度,提高程序设计的效率。
VC++的功能强大,用途广泛,不仅可以编写普通的应用程序,还能很好地进行系统软件设计及通信软件的开发。
二、使用Visual C++ 6.0建立C语言应用程序利用VC++6.0提供的一种控制台操作方式,可以建立C语言应用程序,Win32控制台程序(Win32 Console Application)是一类Windows程序,它不使用复杂的图形用户界面,程序与用户交互是通过一个标准的正文窗口,下面我们将对使用Visual C++ 6.0编写简单的C语言应用程序作一个初步的介绍。
1.安装和启动运行Visual Studio软件中的setup.exe程序,选择安装Visual C++ 6.0,然后按照安装程序的指导完成安装过程。
安装完成后,在开始菜单的程序选单中有Microsoft Visual Studio 6.0图标,选择其中的Microsoft Visual C++ 6.0即可运行(也可在Window桌面上建立一个快捷方式,以后双击即可运行)。
VC++6.0-MFC编程实例
BOOL InitInstance(); }; BOOL CMyApp::InitInstance()
第九页,共137页。
第10章 Visual C++编程实例
{ CMyWnd *pFrame=new CMyWnd; pFrame->Create(0,_T("吹彩色泡泡")); pFrame->ShowWindow(m_nCmdShow); this->m_pMainWnd=pFrame; return TRUE;
第十六页,共137页。
第10章 Visual C++编程实例
用系统资源。 然而,动态链接到MFC时要求提供Mfcnn.dll库文件, 文 件 名 中 的 nn 代 表 MFC 的 版 本 号 。 该 文 件 通 常 在 Windows System或System32文件夹下。如果一个应用程 序动态链接到了MFC,但该应用程序通常用在那些可能 没有Mfcnn.dll库的计算机系统上,则应把这个库文件作 为应用程序包的一部分提供给用户。Microsoft允许程序 员自由地把这些库文件附在应用程序中。
第十四页,共137页。
第10章 Visual C++编程实例
OnPaint()函数根据数组m_rectBubble的内容画出一 个泡泡。其中语句。
dc.SelectStockObject(LTGRAY_BRUSH); 用于选择一个库存画刷,画刷决定了所画图形(如椭 圆、矩形和多边形等)内部的颜色。 在处理鼠标消息的ONLButtonDown()函数中,语句
第十一页,共137页。
VC++6.0定制窗口的方法+框架窗体、文档视图
//增加的语句 cs.lpszClass=AfxRegisterWndClass(cs-HREDRAW|CS-VREDRAW,0,(HBRUSH))::GetSto ckObject(WHITE-BRUSH),0); return CscrollView::PreCreateWindow(cs); } 其中,cs 的参数 pszClass 用于存放 Windows 窗口类名称。要想注册 Windows 窗口类,则 必须调用全局函数 AfxRegisterWndClass。该函数原型为: LPCTSTR AFXAPI AfxRegisterWndClass(UINTnClassStyle,HCURSOR hCursor=0,HBRUS H hbrBackground=0,HICON hIcon=0)
第7章 框架窗口、文档和视图
7.1 应用程序组成结构
1.单文档应用程序(Single Document Interface,SDI) 在单文档界面程序中,用户在同一时刻只能操一个文
档,如记事本程序。在这些应用程序中,打开文档时会自 动关闭当前打开的活动文档,若文档修改后尚未保存,会 提示是否保存所做的修改。因为一次只开一个窗口,因此 不像WORD那样需要一个窗口菜单。单文档应用程序一般 都提供一个“文件”菜单,在该菜单下有一组命令,用于新 建文档、打开已有文档、保存或另存为等。这类程序相对 比较简单,常见的应用程序有终端仿真程序和一些工具程 序。
(1)AssertValid 函数用来诊断CMainFrame对象的有效性。 (2)Dump 函数用来输出CMainFrame对象的状态信息。 (3)OnCreate 函数用来创建工具栏m_wndToolBar和状态
VC++6.0 VC++研华API函数使用说明
Visual c++ 6.0 中VC6.0 中的使用1、启动Visual c++ 6.0,新建一个MFC应用工程:
(1)文件—>新建—>项目,如下图:
(2)如下图中,输入工程名称及存储位置
(3)如下图中,将创建的应用程序设置为基本对话框,点击完成工程创建
2、从安装目录C:\Program Files\Advantech\Common Motion 下将ADVMOT.lib、AdvMotDev.h、AdvMotDrv.h、AdvMotApi.h复制至工程文件夹下
3、在工程设置中设置连接ADVMOT.lib库
4.在项目的中testDlg.h中包含第二步复制到工程文件夹下的头文件
5、完成对话框的设计,并设置相关空间之属性及接口函数
6、初始化参数并获取已连接的运动控制卡设备
7、打开设备并获取设备之属性
8、手动相对定位模式
9、按F5开始调试程序
(1)选择板卡并打开板卡
(2)选择板卡对应的轴并进行相对跑位
(3)在Common Motion Utility中监视是否正在跑位
1
2
3
4。
VC6.0编的“文件读写”的详细操作步骤(两种方式:MFC和基于对话框)
VC6.0编的“文件读写”的两种方式(MFC和基于对话框)软件实验三:基于对话框的MFC程序实现文件读写操作实例一:操作步骤:1、新建“MFC APPWIZARD(EXE)”,选择文件路径,输入文件名,选择应用程序类型为“基本对话框”,按上图添加各控件2、按下表修改各控件的ID号,添加成员函数和消息函数控件的ID号,选择mumber variables面板,单击add variable按钮,添加成员变量,并选择变量类型。
3、写入文件1)在“基于对话框的文件读写Dlg.h”文件中定义变量(粗体字为此处添加的代码)class CMyDlg : public CDialog{// Constructionpublic://定义变量CString strFileName;//文件名CString strFilePath;//文件路径BOOL IsTextFile(CString& rFile);//判断文件类型是否正确CMyDlg(CWnd* pParent = NULL); // standard constructor………}2)双击下压按钮“写入文件”,编写“写入文件”的消息处理函数void CMyDlg::OnButtonWrite() //单击“写入到文件”按钮{// TODO: Add your control notification handler code hereUpdateData(true);CFile file;CFileDialog filedlg(0,//1-文件打开,0-文件另存为".txt|*.*",NULL,OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);if(filedlg.DoModal()==IDOK)strFileName=filedlg.GetFileName();//获得文件名if(strFileName==""){AfxMessageBox("请输入文件名");return;}file.Open(strFileName,CFile::modeCreate|CFile::modeWrite);//将数据写入文件int length=m_WriteString.GetLength();//获取文件长度file.Write((LPCTSTR)m_WriteString,length);//获取有关文件的信息CString AfxMessageBox("已保存到文件:"+strFileName+"!");//保存结束提示strFilePath=file.GetFilePath();//获得文件的路径file.Close();//关闭文件}4、查看文件路径双击下压按钮“查看文件路径”,编写“查看文件路径”的消息处理函数void CMyDlg::OnButtonFilepath() //查看文件路径{// TODO: Add your control notification handler code herem_FilePath=strFilePath;UpdateData(false);}5、读入文件1)定义判断文件类型是否正确的函数(粗体字为此处添加的代码)class CMyDlg : public CDialog{// Constructionpublic://定义变量CString strFileName;//文件名CString strFilePath;//文件路径BOOL IsT extFile(CString& rFile);//判断文件类型是否正确CMyDlg(CWnd* pParent = NULL); // standard constructor………}2)编写IsTextFile函数BOOL CMyDlg::IsTextFile(CString &rFile)//判断文件类型是否正确{CStringList strList;CString str(rFile);strList.AddHead(".TXT");strList.AddHead(".SYS");strList.AddHead(".BA T");strList.AddHead(".DA T");str=str.Right(4);//文件名的右边四位字符str.MakeUpper();//转换成大写return(strList.Find(str))?TRUE:FALSE;}3)在“基于对话框的文件读写Dlg.cpp”文件开头添加头文件#include "fstream.h"//添加的头文件4)单击下压按钮“读入文件”,编写下压按钮“读入文件”的消息函数void CMyDlg::OnButtonRead(){// TODO: Add your control notification handler code herefstream f1;//定义文件流对象char s[200];CFileDialog filedlg(1,//1-文件打开,0-文件另存为".txt|*.*",NULL,OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);if(filedlg.DoModal()==IDOK){UpdateData(true);strFileName=filedlg.GetFileName();//获得文件名if(!IsTextFile(strFileName))//判断文件类型是否正确{AfxMessageBox("文件类型不正确");return;}f1.open(strFileName,ios::in|ios::nocreate);while(!f1.eof()){f1.getline(s,255);m_strRead=m_strRead+"\r\n"+s;//添加文件中的文本到编辑框UpdateData(false);}AfxMessageBox(strFileName+"文件读入完毕");//保存结束提示f1.close();//关闭文件流}}6、运行程序1)在写入文件的编辑框中输入内容,单击“写入文件”按钮,并可选择路径保存该文件。
VC-6.0-下MFC基于对话框-绘制图形
附录表一、具体步骤:1、选择菜单栏的“新建”,选择MFC项目名为DrawGraphics,并设置为基于对话框的项目,如图-1、图-2所示;图-1图-22、按下键盘上的Ctrl+W键,调出类向导,选择“Add Class”,并点击“New”添加一个颜色按钮类CColorButton,继承自CButton类,如图-3所示:图-33、在CColorButton中添加如下成员变量:COLORREF color; //按钮颜色CPoint arrays[4]; //按钮顶点坐标BOOL IsShow; //是否显示按钮BOOL IsPressed; //按钮是否被按下4、右击CColorButton类,选择Add Virtulfunction ,重写其DraItem函数,如图-4,图-5所示:图-4图-55、为其Drawitem函数中添加如下代码:CRect rect;GetClientRect(rect);CDC dc;dc.Attach(lpDrawItemStruct->hDC);arrays[0]=CPoint(rect.left,rect.top);arrays[1]=CPoint(rect.right,rect.top);arrays[2]=CPoint(rect.right,rect.bottom);arrays[3]=CPoint(rect.left,rect.bottom);//设置背景透明dc.SetBkMode(TRANSPARENT);if (IsShow){//创建一个位图画刷CBrush brush(color);dc.SelectObject(&brush);CPen pen(PS_NULL,1,color);dc.SelectObject(&pen);dc.Rectangle(rect);if(IsPressed){CPen pen(PS_DASHDOTDOT,3,RGB(0,0,0));dc.SelectObject(&pen);dc.MoveTo(arrays[0]);for(int i=1;i<4;i++){dc.LineTo(arrays[i]);}dc.LineTo(arrays[0]);}else{CPen pen(PS_DASHDOTDOT,2,color);dc.SelectObject(&pen);dc.MoveTo(arrays[0]);for(int i=1;i<4;i++){dc.LineTo(arrays[i]);}dc.LineTo(arrays[0]);}//绘制按钮文本CString str;GetWindowText(str);dc.SetTextColor(RGB(255-GetRValue(color),255-GetGValue(color),255-GetBValue(color)));dc.DrawText(str,CRect(0,0,rect.right,rect.bottom),DT_CENTER|DT_VCENTER|DT_SINGL ELINE);}6、为CColorButton添加属性设置函数:void CColorButton::SetDrawColor(COLORREF m_color,BOOL IsShow){this->color = m_color;this->IsShow=IsShow;}7、为CColorButton添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,其消息处理函数如下:void CColorButton::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultIsPressed = true;CButton::OnLButtonDown(nFlags, point);}void CColorButton::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultIsPressed = false;CButton::OnLButtonUp(nFlags, point);}8、为DrawGraphics项目的中的对话框资源拖拽如下控件,如图-6所示,并按表-1设置其相关ID;图-6ID 作用及类别IDC_RADIO_RECT 矩形单选按钮IDC_RADIO_ROUND 圆形单选按钮IDC_RADIO_LINE 直线单选按钮IDC_RADIO_SELF 涂鸦单选按钮IDC_RADIO_SLOIDLINE 实线单选按钮IDC_RADIO_DOTTEDLINE 虚线单选按钮IDC_COMBO_LINEVALUE 线条粗细下拉列表表-19、打开类向导,按图-7所示,为相关控件添加关联成员:10、在CDrawGraphicsDlg 类的OninitDialog 函数中添加初始化代码: BOOL CDrawGraphicsDlg:OnInitDialog() { /*.........省略无关代码...............................................................*/ // TODO: Add extra initialization hereCButton *cb; //设置相关按钮的默认选中状态 cb=(CButton *)GetDlgItem(IDC_RADIO_RECT); cb->SetCheck(1); cb=(CButton *)GetDlgItem(IDC_RADIO_SLOIDLINE); cb->SetCheck(1);IDC_STATIC_LINEEXAMPLE 显示线条粗细的Picture 控件 IDC_CHECK_BORDER 是否有边界复选框 IDC_RADIO_SOLID 填充单选按钮 IDC_RADIO_GRADIENT 渐变单选按钮 IDC_RADIO_NULL 无填充单选按钮 IDC_BUTTON_FORECOLOR 前景色按钮 IDC_BUTTON_BKCOLOR 背景色按钮 IDC_RADIO_PEN 画笔单选按钮 IDC_RADIO_CLEAR 清空画板单选按钮 IDC_STATIC_GRAPHICS 画板区(Picture 控件)cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);cb=(CButton *)GetDlgItem(IDC_RADIO_SOLID);cb->SetCheck(1);cb=(CButton *)GetDlgItem(IDC_RADIO_PEN);cb->SetCheck(1);m_ComboLineValue.SetCurSel(3);m_ForeColor=RGB(255,0,0);m_BkColor=RGB(0,0,255);m_ForeCButton.SetDrawColor(m_ForeColor,TRUE); //设置前背景色按钮的颜色m_BkCButton.SetDrawColor(m_BkColor,TRUE);m_IsPressed=FALSE;m_nWidth=4;m_nPenStyle=PS_SOLID;return TRUE; // return TRUE unless you set the focus to a control}10、为CDrawGraphicsDlg添加WM_LBUTTONDOWN和WM_LBUTTONUP,WM_MOUSEMOVE消息,其消息处理函数如下:void CDrawGraphicsDlg:OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_IsPressed=TRUE;SetCursor(m_Hcursor);if (IsDlgButtonChecked(IDC_RADIO_SELF)){m_pOld=point;}else if (IsDlgButtonChecked(IDC_RADIO_LINE)){m_pOld=point;m_PointOrigin=point;}else if (IsDlgButtonChecked(IDC_RADIO_RECT)){m_pOld=point;m_PointOrigin=point;}else if (IsDlgButtonChecked(IDC_RADIO_ROUND)){m_pOld=point;m_PointOrigin=point;}CDialog::OnLButtonDown(nFlags, point);}void CDrawGraphicsDlg:OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_IsPressed=FALSE;ClipCursor(NULL); //解除鼠标的限定CClientDC dc(this);CPen pen(m_nPenStyle,m_nWidth,m_ForeColor);dc.SelectObject(&pen);if (IsDlgButtonChecked(IDC_RADIO_LINE)) //选择的为画直线{dc.SetROP2(R2_NOT); //逆转当前屏幕颜色来画线的绘图方式dc.MoveTo(m_PointOrigin);dc.LineTo(m_pOld);//擦去上一次的临时线dc.SetROP2(R2_COPYPEN);//缺省绘图模式,像素为画笔颜色dc.MoveTo(m_PointOrigin);dc.LineTo(point);//绘制固定线}else if (IsDlgButtonChecked(IDC_RADIO_RECT)) //选择的为画矩形{dc.SelectObject(GetStockObject(NULL_BRUSH));//选择空话刷dc.SetROP2(R2_NOT);CRect Oldrect(m_PointOrigin,m_pOld);dc.Rectangle(&Oldrect); //清除之前的矩形绘图dc.SetROP2(R2_COPYPEN);CBrush brush(m_BkColor);dc.SelectObject(&brush); //画这次的矩形if (IsDlgButtonChecked(IDC_RADIO_NULL)) //如果选择无填充的话,使用空画刷dc.SelectObject(GetStockObject(NULL_BRUSH));CRect Nowrect(m_PointOrigin,point);dc.Rectangle(&Nowrect);if (IsDlgButtonChecked(IDC_RADIO_GRADIENT))//如果选择渐变的话,调用渐变函数DrawGradient(dc.GetSafeHdc(),Nowrect,m_ForeColor,m_BkColor,1);}else if(IsDlgButtonChecked(IDC_RADIO_ROUND))//如果选择绘制椭圆{dc.SelectObject(GetStockObject(NULL_BRUSH));dc.SetROP2(R2_NOT);CRect Oldrect(m_PointOrigin,m_pOld);dc.Ellipse(&Oldrect);dc.SetROP2(R2_COPYPEN);CBrush brush(m_BkColor);dc.SelectObject(&brush);if (IsDlgButtonChecked(IDC_RADIO_NULL))dc.SelectObject(GetStockObject(NULL_BRUSH));CRect Nowrect(m_PointOrigin,point);if (IsDlgButtonChecked(IDC_RADIO_GRADIENT))//如果选择渐变的话,调用渐变函数DrawGradient(dc.GetSafeHdc(),Nowrect,m_ForeColor,m_BkColor,1);dc.Ellipse(&Nowrect);}InvalidateMyRect();//刷新工具区CDialog::OnLButtonUp(nFlags, point);}void CDrawGraphicsDlg:OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultif (m_IsPressed&&point.x>205)//如果鼠标移动位置到达画板区{CRect rect;m_Graphics.GetClientRect(&rect);m_Graphics.ClientToScreen(&rect);ClipCursor(rect);//限定光标在指定矩形}CClientDC dc(this);if (m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_SELF))//如果选择了涂鸦{CPen pen(m_nPenStyle,m_nWidth,m_ForeColor); //创建画笔dc.SelectObject(&pen); //选入画笔dc.MoveTo(m_pOld);dc.LineTo(point);//绘制轨迹m_pOld=point;//将当前点设置为旧点}else if(m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_LINE))//如果选择了直线{dc.SetROP2(R2_NOT);//逆转当前屏幕颜色来画线的绘图方式dc.MoveTo(m_PointOrigin);dc.LineTo(m_pOld); //擦去上一次的线dc.MoveTo(m_PointOrigin);dc.LineTo(point);//绘制这一次的临时线m_pOld=point;}else if(m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_RECT))//如果选择了矩形{dc.SetROP2(R2_NOT);CPen pen(PS_DOT,1,m_ForeColor);dc.SelectObject(&pen);dc.SelectObject(GetStockObject(HOLLOW_BRUSH));CRect Oldrect(m_PointOrigin,m_pOld);dc.Rectangle(&Oldrect);CRect Nowrect(m_PointOrigin,point);dc.Rectangle(&Nowrect);m_pOld=point;pen.DeleteObject();}else if (m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_ROUND))//如果选择了圆{CClientDC dc(this);dc.SetROP2(R2_NOT);CPen pen(PS_DOT,1,m_ForeColor);dc.SelectObject(&pen);dc.SelectObject(GetStockObject(HOLLOW_BRUSH));CRect Oldrect(m_PointOrigin,m_pOld);dc.Ellipse(&Oldrect);CRect Nowrect(m_PointOrigin,point);dc.Ellipse(&Nowrect);m_pOld=point;pen.DeleteObject();}CDialog::OnMouseMove(nFlags, point);}11、为背景色、前景色、无填充、实线、虚线、边框、清空画板按钮添加按钮单击消息,响应函数如下:void CDrawGraphicsDlg:OnButtonBkcolor(){// TODO: Add your control notification handler code hereCColorDialog cdg;if (cdg.DoModal()==IDOK) //调用颜色对话框{m_BkColor=cdg.GetColor(); //更改背景色m_BkCButton.SetDrawColor(m_BkColor,TRUE);//更改背景色按钮颜色InvalidateMyRect(); //刷新工具区}}void CDrawGraphicsDlg:OnButtonForecolor(){// TODO: Add your control notification handler code hereCColorDialog cdg;if (cdg.DoModal()==IDOK){m_ForeColor=cdg.GetColor();m_ForeCButton.SetDrawColor(m_ForeColor,TRUE);InvalidateMyRect();}}void CDrawGraphicsDlg:OnRadioNull(){// TODO: Add your control notification handler code hereif (!IsDlgButtonChecked(IDC_CHECK_BORDER)) //无填充时不能也无边框{CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);}}void CDrawGraphicsDlg:OnRadioSloidline(){// TODO: Add your control notification handler code hereCString str[9]={"1px","2px","3px","4px","5px","6px","8px","10px","12px"};m_ComboLineValue.ResetContent();for (int i=0;i<9;i++)m_ComboLineValue.AddString(str[i]);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();}void CDrawGraphicsDlg:OnRadioDottedline(){// TODO: Add your control notification handler code herefor (int i=11;i>0;i--)m_ComboLineValue.DeleteString(i);m_ComboLineValue.SetCurSel(0);m_nWidth=1;m_nPenStyle=PS_DOT;InvalidateMyRect();}void CDrawGraphicsDlg:OnCheckBorder(){// TODO: Add your control notification handler code hereif (IsDlgButtonChecked(IDC_CHECK_BORDER))m_nPenStyle=PS_SOLID;else{m_nPenStyle=PS_NULL;if (IsDlgButtonChecked(IDC_RADIO_NULL)) //既不能无边框也不能无填充{CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);}}}void CDrawGraphicsDlg:OnRadioClear(){// TODO: Add your control notification handler code hereInvalidate(TRUE);}12、为选择画笔宽度的下拉列表添加CBN_SELCHAGE消息,消息处理函数如下:void CDrawGraphicsDlg:OnRadioSloidline(){// TODO: Add your control notification handler code hereCString str[9]={"1px","2px","3px","4px","5px","6px","8px","10px","12px"};m_ComboLineValue.ResetContent();for (int i=0;i<9;i++)m_ComboLineValue.AddString(str[i]);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();}13、为CDrawGraphicsDlg类添加如下的两个自定义函数InvalidateMyRect以及DrawGradient,分别用来刷新工具区和绘制渐变:void CDrawGraphicsDlg:InvalidateMyRect() //将工具区部分刷新{CRect invaRect;invaRect.top=0;invaRect.bottom=500;invaRect.left=0;invaRect.right=205;InvalidateRect(invaRect,TRUE);}void CDrawGraphicsDlg:DrawGradient(HDC pDc, const RECT &rect, COLORREF begin, COLORREF end, const int &width){RECT rcstep; //设置每次填充的矩形HBRUSH br; //创建画刷句柄int n,m;float step=0.0;int nred=0,ngreen=0,nblue=0;float red=0.0,green=0.0,blue=0.0;nred=(GetRValue(begin)-GetRValue(end));ngreen=(GetGV alue(begin)-GetGValue(end));nblue=(GetBValue(begin)-GetBValue(end));step=(float)abs(rect.top-rect.bottom)/(float)width;red=nred/(float)step;green=ngreen/(float)step;blue=nblue/(float)step;for (int start=0;start<=step;start++) //一块快绘制矩形{n=min((int)(rect.top+start*width),rect.bottom);m=min((int)(rect.top+(start+1)*width),rect.bottom);::SetRect(&rcstep,rect.left,n,rect.right+1,m);br=CreateSolidBrush(RGB(nred-red*start,ngreen-green*start,nblue-blue*start));//选择笔刷颜色HBRUSH oldbr=(HBRUSH)::SelectObject(pDc,br);FillRect(pDc,&rcstep,br);//用新颜色填充矩形区::SelectObject(pDc,oldbr);DeleteObject(br);}}二、运行结果:1、绘图效果:2、选择颜色对话框以及清空画图板功能:。
VC++6.0入门【第六章_创建和使用对话框】
第6章创建和使用对话框对话框是一种用户界面,几乎每一个Windows程序都使用对话框与用户进行交互。
对话框可能是一个简单的只含有OK按钮的消息框,也可以是一个复杂的数据输入表单。
对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。
在本章节我们主要讲述模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。
你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框的方法。
6.1 对话框的基本原理6.1.1 对话框的工作原理在创建一个对话框之前,我们先来了解一下对话框是如何工作的,对话框的数据来自三方面:对话框资源、对话框对象、和一个文档对象:1.对话框资源对话框资源是一个用户输入或取得数据的图形界面。
这个图形界面是使用Develop Studio的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。
当应用程序运行时,就可以得到一个对话框。
2.对话框对象MFC使用CDialog类来描述对话框,它是CWnd类的派生类。
在CWnd类的基础上增加了数据交换的功能。
当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。
对话框对象实现了对话框和应用程序之间的通信。
在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。
3.文档对象MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。
例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。
应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。
VC6.0中MFC生成.exe安装包步骤
最全版,亲测版VC6.0生成MFC可执行文件安装包步骤1、需要文件1、VC6.0MFC应用程序所使用的公用代码和库函数大都被包括在了7个DLL动态链接库中(在目录C:\Windows\System32下),生成安装文件后,同时将下列七个DLL文件一同发布给你的客户,就可以了。
2、你只需要发布一个release版本的应用程序abc.exe;3、IntallShield for VC6.0 安装包;2、安装 IntallShield按步骤安装完IntallShield后,再打开VC6.0;进行下列设置以便能在Visual C++6.0的"Tool"菜单中使用"InstallShield Wizard"菜单命令:(1) Visual C++6.0正确安装后,启动Visual C++6.0,并选择"Tools"菜单->"Customize"命令。
图1(2) 在弹出的"Customize"对话框中,切换到"Tools"页面,如图2所示。
图2(3) 将菜单列表项滚动到最后一个空行,并双击鼠标,键入"&InstallShield Wizard",并按Enter键。
(4) 选定刚才键入的菜单列表项,单击Browse按钮(有"..."符号的按钮)将InstallShield所在的Program文件夹下的IsVcWiz.exe调入。
(5) 将"Initial directory"的路径设为IsVcWiz.exe所在的路径,单机Close。
到此InstallShield Wizard安装完毕(特别注意exe所在路径不要包含有中文)。
(6)检查是否安装成功,如图点击Tools菜单下的InstallShield Wizard会弹出你要打包的exe的界面,说明InstallShield Wizard安装成功,接下来进行第下步。
VC++6.0使用方法
一、Visual C++ 6.0概述Visual C++6.0是微软公司推出的目前使用极为广泛的基于Windows平台的可视化集成开发环境,它和Visual Basic、Visual Foxpro、Visual J++等其它软件构成了Visual Studio(又名Developer Studio)程序设计软件包。
Developer Studio是一个通用的应用程序集成开发环境,包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。
使用Visual Studio,可以完成创建、调试、修改应用程序等的各种操作。
VC++6.0提供面向对象技术的支持,它能够帮助使用MFC库的用户自动生成一个具有图形界面的应用程序框架。
用户只需在该框架的适当部分添加、扩充代码就可以得到一个满意的应用程序。
VC++6.0除了包含文本编辑器,C/C++混合编译器,连接器和调试器外,还提供了功能强大的资源编辑器和图形编辑器,利用“所见即所得”的方式完成程序界面的设计,大大减轻程序设计的劳动强度,提高程序设计的效率。
VC++的功能强大,用途广泛,不仅可以编写普通的应用程序,还能很好地进行系统软件设计及通信软件的开发。
二、使用Visual C++ 6.0建立C语言应用程序利用VC++6.0提供的一种控制台操作方式,可以建立C语言应用程序,Win32控制台程序(Win32 Console Application)是一类Windows程序,它不使用复杂的图形用户界面,程序与用户交互是通过一个标准的正文窗口,下面我们将对使用Visual C++ 6.0编写简单的C语言应用程序作一个初步的介绍。
1.安装和启动运行Visual Studio软件中的setup.exe程序,选择安装Visual C++ 6.0,然后按照安装程序的指导完成安装过程。
安装完成后,在开始菜单的程序选单中有Microsoft Visual Studio 6.0图标,选择其中的Microsoft Visual C++ 6.0即可运行(也可在Window桌面上建立一个快捷方式,以后双击即可运行)。
VC++6.0使用MFC创建应用程序框架操作步骤示例
7.手工添加的代码 • 在 CTalkcDlg 对 话 框 类 的 talkcDlg.h 中 添 加 对 于 MySocket.h的包含命令,来获得对于套接字支持: #include “MySocket.h” • 在CTalkcDlg对话框类的talkcDlg.cpp中添加对于控件变量 的初始化代码: // TODO: Add extra initialization here //用户添加的控件变量的初始化代码 BOOL CTalkcDlg::OnInitDialog() { m_strServName=“127.0.0.1"; m_nServPort=1000; // 服务端口 = 1000 UpdateData(FALSE); // 更新用户界面 //设置套接字类的对话框指针成员变量 m_sConnectSocket.SetParent(this); }
图 增加控件成员 变量的对话框
表
客户端程序对话框中的控件对象对应的成员变量
变 量 名 称 Member Variable Name
m_btnConnect
控件ID Control IDs
IDC_BUTTON_CONNECT
变量类别 Category
Control
变量类型 Variable Type
在主对话框中添加控件
图 Talkc程序的主对话框
对话框中的控件属性按照下表修改控件属性。
表 Talkc程序主对话框中的控件属性
控件类型 静态文本 static text 静态文本 static text 静态文本 static text 静态文本 static text 控件ID IDC_STATIC_SERVNAME IDC_STATIC_SERVPORT IDC_STATIC_MSG IDC_STATIC_SENT Caption 服务器名称 服务器端口 消 息 发送的消息
VC6.0MFC串口通信编写全过程(推荐文档)
其于MFC 的串口调试助手编辑过程一、新建打开VC6.0 文件 新建 工程 MFC AppWiard(exe)位置(选择保存工程位置) 工程名称(输入工程名XXXX )确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg ) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图:二、往生成的基本框架中添加控件1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:菜单栏 工程 添加到工程 Components and controls … Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。
2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。
4、对以上四个控件编程步骤如下:a 、右击串口通信控件 建立类向导Member variables Control IDS 中选择IDC_MSCOMM1 add variable … Member variable name 中输入控件变量名m_ctrlComm (变量名可以随意选取,但程序中应与所取变量名一致) OK 确定b、右击编辑框、属性、常规、ID:中输入ID号,此编辑框用于接收显示数据的其ID 号为IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取ID号一致),再在此窗口的样式中勾选”多行”,同时将“自动水平滚动(T)”勾选去掉,再勾选“垂直滚动(V)”,此勾选操作是用于垂直多行显示的,按回车后即可输入;同理右击另一编辑框输入ID号为IDC_EDIT_TXDATA此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;再为按钮控件添加ID号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送”,功能是按一次就把发送编辑框中的内容发送一次。
使用VC6编写一个计算器MFC
使用VC6.0编写一个简易的计算器效果图第一步:启动Visual C++6.0第二步:新建一个工程第三步:选择MFC AppWizard[exe],给工程命名,点击确定。
第四步:点选“基本对话框”,然后点击“完成”。
切记:不要点“下一步”第五步:点击“确定”,就完成工程建立了!第六步:看到这个页面后,就进入了面板的设计。
通过旁边的“控件”在面板中放置相应的按钮,编辑框,文本框等内容。
(这里讲的简易计算器需要按钮,编辑框这两个控件。
一般如果有需要的话还可以加入文本框用于说明。
)第七步:对每个对象建立类向导,但编写计算器只限于编辑框。
点击进入类向导后,点击横向按钮中的第二个按钮,在“Control IDs”中找到编辑框对应的名字,没有前期改动过的,一般都是IDC_EDIT1,点击“IDC_EDIT1”出现的对话框中,Variable type中选择CString,命名。
点击“OK”。
最后编写代码了:将面板上面的所有按钮和编辑框全部双击一遍,就会在“计算器Dlg.CPP”文件中生成控制其功能的空函数。
你需要在这些空函数中写入相应的代码以实现按钮的功能。
(请着重看红色加粗部分的代码,那才是真正的精髓)以下是“计算器Dlg.CPP”文件全部程序代码// 计算器Dlg.cpp : implementation file//#include "stdafx.h"#include "计算器.h"#include "计算器Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUALprotected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CMyDlg::CMyDlg(CWnd* pParent): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)num = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)DDX_Text(pDX, IDC_EDIT1, num);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_BN_CLICKED(IDC_BUTTON5, OnButton5)ON_BN_CLICKED(IDC_BUTTON6, OnButton6)ON_BN_CLICKED(IDC_BUTTON7, OnButton7)ON_BN_CLICKED(IDC_BUTTON8, OnButton8)ON_BN_CLICKED(IDC_BUTTON9, OnButton9)ON_BN_CLICKED(IDC_BUTTON10, OnButton10)ON_BN_CLICKED(IDC_BUTTON11, OnButton11)ON_BN_CLICKED(IDC_BUTTON12, OnButton12)ON_BN_CLICKED(IDC_BUTTON13, OnButton13)ON_BN_CLICKED(IDC_BUTTON14, OnButton14)ON_BN_CLICKED(IDC_BUTTON15, OnButton15)ON_BN_CLICKED(IDC_BUTTON16, OnButton16)ON_BN_CLICKED(IDC_BUTTON17, OnButton17)ON_BN_CLICKED(IDC_BUTTON18, OnButton18)ON_BN_CLICKED(IDC_BUTTON20, OnButton20)ON_BN_CLICKED(IDC_BUTTON19, OnButton19)ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)//}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);return TRUE;}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this);SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::OnChangeEdit1() {}double num1,num2;char sys;void CMyDlg::OnButton1() {UpdateData(true);num+='1';UpdateData(false);}void CMyDlg::OnButton2() {UpdateData(true);num+='2';UpdateData(false);}void CMyDlg::OnButton3() {UpdateData(true);num+='3';UpdateData(false);}void CMyDlg::OnButton4() {UpdateData(true);num+='4';UpdateData(false);}void CMyDlg::OnButton5() {UpdateData(true);num+='5';UpdateData(false);}void CMyDlg::OnButton6() {UpdateData(true);num+='6';UpdateData(false);}void CMyDlg::OnButton7() {UpdateData(true);num+='7';UpdateData(false);}void CMyDlg::OnButton8() {UpdateData(true);num+='8';UpdateData(false);}void CMyDlg::OnButton9() {UpdateData(true);num+='9';UpdateData(false);}void CMyDlg::OnButton10() {UpdateData(true);num+='0';UpdateData(false);}void CMyDlg::OnButton11() {if(-1==num.Find('.')){UpdateData(true);num+='.';}UpdateData(false);}void CMyDlg::OnButton12() {UpdateData(true);num2=-num2;char rs[20];sprintf(rs,"%g",num2);num=rs;UpdateData(false);}void CMyDlg::OnButton13() {UpdateData(true);num1=atof(num);num='\0';sys='+';UpdateData(false);}void CMyDlg::OnButton14() {UpdateData(true);num1=atof(num);num='\0';sys='-';UpdateData(false);}void CMyDlg::OnButton15() {UpdateData(true);num1=atof(num);num='\0';sys='*';UpdateData(false);}void CMyDlg::OnButton16() {UpdateData(true);num1=atof(num);num='\0';sys='/';UpdateData(false);}void CMyDlg::OnButton17() {if(!num.IsEmpty()){UpdateData(true);num=num.Left(num.GetLength()-1);}UpdateData(false);}void CMyDlg::OnButton18() {UpdateData(true);num='\0';UpdateData(false);}void CMyDlg::OnButton20() {UpdateData(true);num1=atof(num);num='\0';sys='^';UpdateData(false);}void CMyDlg::OnButton19(){UpdateData(true);char rs[50];memset(rs,0,50);switch(sys){case'+':num2=num1+atof(num);sprintf(rs,"%g",num2);num=rs;break;case'-':num2=num1-atof(num);sprintf(rs,"%g",num2);num=rs;break;case'*':num2=num1*atof(num);sprintf(rs,"%g",num2);num=rs;break;case'/':num2=num1/atof(num);sprintf(rs,"%g",num2);num=rs;break;case'^':num2=1;for(inti=0;i<atof(num);i++)num2=num1*num2;sprintf(rs,"%g",num2);num=rs;break;}; UpdateData(false);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.手工添加的代码 • 在 CTalkcDlg 对 话 框 类 的 talkcDlg.h 中 添 加 对 于 MySocket.h的包含命令,来获得对于套接字支持: #include “MySocket.h” • 在CTalkcDlg对话框类的talkcDlg.cpp中添加对于控件变量 的初始化代码: // TODO: Add extra initialization here //用户添加的控件变量的初始化代码 BOOL CTalkcDlg::OnInitDialog() { m_strServName=“127.0.0.1"; m_nServPort=1000; // 服务端口 = 1000 UpdateData(FALSE); // 更新用户界面 //设置套接字类的对话框指针成员变量 m_sConnectSocket.SetParent(this); }
6.为CTalkcDlg对话框类添加其它的成员函数和成员变量 成员变量:CMySocket 务器端连接的套接字。 m_sConnectSocket; //用来与服
成员函数:void OnClose(); 信。 void OnConnect(); void OnReceive();
// 用来处理与服务器端的通
4.创建从CAsyncSocket类继承的派生类
(1)为了能够捕获并响应socket事件,应创建用户自己的套接字类,它应 当从CAsyncSocket类派生,还能将套接字事件传递给对话框,以便执行用 户自己的事件处理函数。选择菜单“插入/类…”,进入“New Class”对话框, 如图所示。
图 添加自己的套 接字类
•选择或输入以下信息: Class Type:选择MFC Class Class Infoumation下的Name: 输入CMySocket Class Infoumation 下 的 Base CAsyncSocket class : 选 择
•点击“OK”按钮,系统会自动生成CMySocket类对 应的包含文件MySocket.h和MySocket.cpp文件。 •在VC界面的Class View中就可以看到这个类。
① 应在文件开头,添加包含文件说明。这是因为此套接字类用 到了对话框类的变量。 #include “TalkcDlg.h” ② 在构造函数中,添加对于对话框指针成员变量的初始化代码: CMySocket::CMySocket() { m_pDlg = NULL; } ③ 在析构函数中,添加对于对话框指针成员变量的终止处理代 码: CMySocket::~CMySocket() { m_pDlg = NULL; } ④ 为成员函数setParent和事件处理函数OnConnect, OnClose和OnReceive添加代码。详见后面的程序清单。
•选择成员变量卡(Member Variables),用类向导为对话框 中的控件对象定义相应的成员变量。确认Class Name是 CTalkcDlg,在左边的列表框中选择一个控件,然后点“Add Variable”按钮,会弹出”Add Member Variable”对话框, 如图所示,然后按照表输入即可。
命令按钮 button
命令按钮 button 列表框 列表框 listbox listbox
IDC_BUTTON_CLOSE
IDOK IDC_LIST_SENT IDC_LIST_RECEIVED
断开
发送
3.为对话框中的控件对象定义相应的成员变量 •在窗口菜单中点查看/建立类向导,进入类向导(Class Wizard) 对话框,如图。
图 增加控件成员 变量的对话框
表
客户端程序对话框中的控件对象对应的成员变量
变 量 名 称 Member Variable Name
m_btnConnect
控件ID Control IDs
IDC_BUTTON_CONNECT
变量类别 Category
Control
变量类型 Variable Type
类CMySocket的定义
CMySocket的构造函数 CMySocket的析构函数
(2)利用类向导ClassWizard为这个套接字类添加 响应消息的事件处理成员函数。
•点菜单View/ClassWizard...,进入类向导对话框, 选择Message Maps(消息映射)卡,确认Class name是CMySocket,从Messages(消息)栏中选 择事件消息,然后点击Add Function按钮,就会看 到在Member Function栏中添加了相应的事件处理 函数。 •如图所示,此程序中需要添加OnConnect, OnClose和OnReceive三个函数。这一步会在 CMySocket类的MySocket.h中自动生成这些函数的 声明,在MySocket.cpp中生成这些函数的框架,以 及消息映射的相关代码。可参看后面的程序清单。
图 为套接字类添加响应消息的事件处理成员函数
(3)为套接字类添加一般的成员函数和成员变量 •在VC++的界面中,在工作区窗口选择ClassView卡,用右键 单 击 CMySocket 类 , 会 弹 出 快 捷 菜 单 , 选 择 其 中 的 Add Member Function 可 以 为 该 类 添 加 成 员 函 数 ; 选 择 Add Member Variable可以为该类添加成员变量。
在主对话框中添加控件
图 Talkc程序的主对话框
对话框中的控件属性按照下表修改控件属性。
表 Talkc程序主对话框中的控件属性
控件类型 静态文本 static text 静态文本 static text 静态文本 static text 静态文本 static text 控件ID IDC_STATIC_SERVNAME IDC_STATIC_SERVPORT IDC_STATIC_MSG IDC_STATIC_SENT Caption 服务器名称 服务器端口 消 息 发送的消息
CButton
IDC_EDIT_SERVNAME
IDC_EDIT_SERVPORT IDC_EDIT_MSG IDC_LIST_SENT IDC_LIST_RECEIVED
m_strServName
m_nServPort m_strMsg m_listSent m_listRecetved
Value
(4)手工添加其他代码 •在VC++ 的界面中,在工作区窗口选择 FileView卡,双击要 编辑的文件,在右面的窗口中就会展示该文件的代码,可以编 辑添加。 •对于 MySocket.h ,应在文件开头,添加对于此应用程序对 话框类的声明。
class CTalkcDlg;
对于MySocket.cpp,有四处添加:
(4)出现新工程信息对话框(New Project Information),说明了所创建 的骨架工程的有关信息。如图所示。
所创建的程序是一个基于对话框的Win32 应用程序,将自动创建两个类: 应用程序类CTalkcApp,对应的文件是 talkc.h和talkc.cpp; 对话框类CTalkcDlg,对应的文件是 talkcDlg.h和talkcDlg.cpp。 支持Windows Socket 使用共享的DLL实现MFC42.DLL。
•创建客户端应用程序,采用对话框架构
1.使用MFC AppWizard创建客户端应用程序框架。 (1)在New对话框中,选择Projects卡,如图所示。选MFC AppWizard(exe) ,在Project Name处填入工程名Talkc, 在Location处选定存放此工程的目录。然后点击OK按钮。
对这个套接字类,添加一个私有的成员变量:对话框类的指针。 private: CTalkcDlg * m_pDlg;
图 为套接字类添加一般的成员变量
再添加一个成员函数:void SetParent(CTalkcDlg * pDlg);
这一步同样会在MySocket.h中生成变量或函数的声明,在 MySocket.cpp中生成函数的框架代码。如果熟悉的话,这 一步的代码也可以直接手工添加。
静态文本 static text
编辑框 edit box
IDC_STATIC_RECEIVED
IDC_EDIT_SERVNAME
接收的消息
编辑框 编辑框
edit box edit box
IDC_EDIT_SERVPORT IDC_EDIT_MSG
IDC_BUTTON_CONNECT 连接
命令按钮 button
(2)出现MFC AppWizard设置的第一步对话框(MFC AppWizard – Step 1),如图所示。从中选择Dialog based的应用程序类型,语言支持 选择中文(中国),使此工程能够正确地进行中文的输入、输出、显示及处 理。然后点击NEXT按钮。
(3)出现MFC AppWizard设置的第二步对话框(MFC AppWizards – Step 2 of 4),如图所示,在Windows Sockets复选框上打上选择标记, 表示应用程序将支持WinSock套接字。接受其它的默认设置。跳过后面的步 骤,直接点击Finsh按钮。
5.为对话框类添加控件对象事件的响应函数 按照表,用类向导(Class Wizard ) 为对话框中的控件对象添加 事件响应函数。主要是对于三个按钮的单击事件的处理函数,如 图所示。其他函数是原有的。
表
为对话框中的控件对象添加事件响应函数
对象标识 Object IDs 消息 Messages 函数Member functions
•实例简单,但能说明网络编程的许多问题。 下面结合它详细说明MFC编程的细节。
创建客户端程序
1.使用MFC AppWizard创建服务器端应用程序框 架。 2.为对话框界面添加控件对象 3.为对话框中的控件对象定义相应的成员变量 4.创建从CAsyncSocket类继承的派生类 5.为CAsyncSocket类继承的派生类添加控件对象 事件的响应函数 6.为对话框类添加控件对象事件的响应函数 7.为 CTalkcDlg 对话框类添加其它的成员函数和成 员变量 8.手工添加代码