VC界面编程入门余翔涉及的内容工具条(菜单不适合触摸屏)文本框、单选框、进度条、表格等控件串口通信窗口之间的信息交换模态/非模态对话框文件处理图形处理起步:建立工程文件MFC程序派生的类CWinApp应用程序类,初始化和运行程序。CFrameWnd框架类,搜寻和销售用户命令。CDocument文档类,装载、维护文档。CView视图类,视图显示。选择建立基于对话框的应用程序基于文档的应用程序不适合界面使用。因为界面一般不需要文档背景。仅有CxxApp和CxxDlg两个类。下一步选项关于DLL的选项SharedDLL小巧的exe文件。Staticallylinkedlibexe文件较大,可直接运行。建立的对话框基于MFC的程序VC已经搭建了程序的框架,无需加入任何代码就可以直接编译运行。和常规C语言不同,main/winmain函数已经封装,只需要在程序中加入自己的响应函数。1.如何退出程序DestroyWindow()在子窗口退出会报故障并退出程序。EndDialog(IDOK)/EndDialog(IDCANCEL)内置的响应对话框的确定/取消的函数。exit(0)故障退出函数。2.窗口的部分设置在OnInitDialog函数添加工具条初始化代码。主窗口已启用此函数,子窗口需要类模板(ctrl+w或View→ClassWizard→CxxDlg的消息里面选择WM_INITDIALOG,再添加函数)设置窗口顶部文本SetWindowText窗口大小、风格及位置SetWindowPos窗口图标AfxGetApp()-LoadIcon3.工具条Insert→Resource(或Ctrl+R)选择toolbar点击new按钮添加按钮,逐个修改按钮图案,设置按钮ID。初始化工具条在对话框类的头文件定义一个工具条CToolBarm_tool;//假定工具条ID为IDR_TOOLBAR1在初始化函数中m_tool.Create(this);//创建工具条m_tool.LoadToolBar(IDR_TOOLBAR1);//载入资源RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);//显示工具条工具条按钮的响应工具条按钮的ID在资源窗口双击工具条按钮,弹出窗口显示了按钮的ID,可以修改成有实际意义的名称,以免混淆。工具条按钮的响应函数进入类模板(ctrl+w或View→ClassWizard),弹出窗口提示为工具条建立新的类建立工具条的类(不建不影响使用)选择工具条按钮消息工具条按钮的响应函数选择消息后,选择增加函数后再选择编辑函数代码,如某工具条按钮ID_BUTTON_EXIT用于退出窗口。voidCMy1Dlg::OnButtonExit(){//TODO:AddyourcommandhandlercodehereEndDialog(IDOK);}常规工具条的缺陷使用VC自带的资源模板建立的常规工具条只支持16色(如Word的工具条),即使载入了真彩图标也会转为16色显示。真彩工具条的使用将工具条所需的真彩图标加入VC资源使用ImageList接收真彩图标创建工具条并载入资源窗口生成的工具条将ImageList设置给工具条,替代原有图标真彩工具条的实现(1)加入成员变量,在对话框的头文件直接加入,或者在类窗口右击窗口类添加CToolBarm_ToolBar;CImageListm_ImageList;在OnInitDialog函数初始化工具条m_ToolBar.Create(this);m_ToolBar.LoadToolBar(IDR_TOOLBAR1);初始化ImageList//创建真彩图集,ILC_COLOR32:32位色m_ImageList.Create(32,32,ILC_COLOR32,6,4);//载入图标m_ImageList.Add(AfxGetApp()-LoadIcon(IDI_ICON1));……m_ImageList.Add(AfxGetApp()-LoadIcon(IDI_ICON6));//设置为工具条图集m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);真彩工具条的实现(2)设置工具条按钮文本m_ToolBar.SetButtonText(0,系统图);设置工具条按钮大小CSizeTextButtonSize,ImageSize;ImageSize.cx=32;ImageSize.cy=32;m_ToolBar.SetSizes(TextButtonSize,ImageSize);显示工具条RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);载入不同的工具条由多个对话框构成的界面中,工具条按钮在每个对话框都是可见的。因为每个对话框都可能载入这个工具条。同一个对话框可能需要在不同的条件下分别载入不同的工具条。如何替换工具条定义CToolBarm_ToolBar;CToolBarm_ToolBar2;备用工具条初始化m_ToolBar2.Create(this);m_ToolBar2.LoadToolBar(IDR_TOOLBAR_WAVE);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);m_ToolBar2.ShowWindow(SW_HIDE);//隐藏备用工具条如何替换工具条(续)替换工具条m_ToolBar.ShowWindow(SW_HIDE);m_ToolBar2.ShowWindow(SW_SHOW);隐藏工具条按钮m_ToolBar.GetToolBarCtrl().HideButton(ID_BUTTON_TEST,bShow);//bShow=FALSE,隐藏按钮;bShow=TRUE,显示按钮4.串口通信串口通信在嵌入式系统的界面编程中占有着重要的地位。在WIN32中所有的设备都被看成是文件,串行口也不例外。串口通信编程方法大概可以分成三种a.CMSCOMM控件。简单可靠。b.WINAPI函数。难度最高,要求要掌握很多的API函数。c.网络流行的一些串口通讯控件,比如CSerial类,自建消息映射,对初学者来说难度较大。判断串口是否存在HANDLEm_hCom;m_hCom=CreateFile({COM1,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);//不存在则m_hCom=INVALID_HANDLE_VALUECloseHandle(m_hCom);CMSCOMM控件初始化m_MsComm1.SetCommPort(1);m_MsComm1.SetSettings(19200,n,8,1);m_MsComm1.SetInputMode(1);m_MsComm1.SetRThreshold(36);m_MsComm1.SetInputLen(36);//每次读36字节m_MsComm1.SetPortOpen(true);//打开串口串口事件响应(添加函数)串口事件响应(接收数据)VARIANTvar_input;COleSafeArrayarray_input;longi;if(m_MsComm1.GetCommEvent()==2)//仅响应接收数据事件{var_input=m_MsComm1.GetInput();//使用变量接收数据array_input=var_input;//VARIANT-COleSafeArrayfor(i=0;i36;i++){array_input.GetElement(&i,&rxData[0][i]);}DataProcess(0);//数据处理}串口发送SendOrder(BYTEByte1,BYTEByte2,BYTEByte3,BYTEByte4){CByteArrayTx;Tx.SetSize(8);//输出字节数组大小Tx.SetAt(0,0xab);//设置数组元素……Tx.SetAt(7,Byte4);if(bCommExist)//如果串口存在{m_MsComm1.SetInBufferCount(0);//清空接收缓冲m_MsComm1.SetOutput(COleVariant(Tx));//发送数据}5.控件简介常用控件包括静态文本、文本框、按钮、列表框创建方式静态创建:在对话框模板创建控件,并设置属性动态创建是指预先定义一个控件类的对象,再在程序中创建控件。常用函数创建控件CreateWindow/CreateWindowEx显示/隐藏控件ShowWindow(SW_SHOWSW_HIDE);激活/禁用控件EnableWindow(true/false)标准控件——单选框选择了Group选项的单选框ID将作为这一组选项的成员变量,在类窗口的类成员选项卡可以设置对应的类成员变量名。单选框变量命名设置/获取单选框设置单选框(数据→控件)m_Start=pWnd-nStart;UpdateData(FALSE);取得单选框的设置值(控件→数据)UpdateData(TRUE);pWnd-nStart=m_Start;标准控件——进度条CProgressCtrl*Progress=(CProgressCtrl*)GetDlgItem(IDC_RX);//指针指向进度条CenterWindow(this);//窗口居中SetWindowText(波形数据接收窗口);Progress-SetRange(0,100);//设置范围Progress-SetStep(1);//设置最小递增刻度Progress-SetPos(0);//设置初始位置6.表格表格是界面常用的控件之一,以文本框结合可以实现表格的编辑功能。在对话框添加表格控件MSFlexGrid,设置控件ID后右击控件,在属性框设置字体。添加CMSFlexGrid类,设置表格对应的成员变量名称。文本框不必在对话框上预置控件,可定义指针后在对话框初始化函数直接生成。edit=newCEdit;edit-Create(WS_CHILD,CRect(0,0,0,0),&m_FlexGrid,IDC_EDIT);//edit为头文件定义的文本框指针,必须作为表格的子窗口生成表格初始化CMSFlexGrid*para;//指向表格的指针para=(CMSFlexGrid*)GetDlgItem(IDC_SETTING_PARA);//根据ID获得表格地址,强制转为表格指针para-ShowWindow(SW_SHOW);//显示表格para-SetCols(4);//设置表格列数para-SetRows(3);//设置表格行数para-SetTextArray(0,“PID参数”);//设置表格内容……para-MoveWindow(70,100,407,97);//表格大小、位置表格编辑功能以文本框覆盖被点击的单元格CMSFlexGrid*para;para=(CMSFlexGrid*)GetDlgItem(IDC_SETTING_PARA);i=para-GetCol();//单元格所在列j=para-GetRow();//单元格所在行longy=para-GetRowPos(j)/pWnd-lTwipPerPixel;//左上角longx=para-GetColPos(i)/pWnd-lTwipPerPixel;//缇→像素k=para-GetCell