VC界面编程入门.ppt_第1页
VC界面编程入门.ppt_第2页
VC界面编程入门.ppt_第3页
VC界面编程入门.ppt_第4页
VC界面编程入门.ppt_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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或ViewClassWizardCxxDlg的消息里面选择WM_INITDIALOG,再添加函数)设置窗口顶部文本SetWindowText窗口大小、风格及位置SetWindowPos窗口图标AfxGetApp()-LoadIcon,3.工具条,InsertResource(或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或ViewClassWizard),弹出窗口提示为工具条建立新的类,建立工具条的类(不建不影响使用),选择工具条按钮消息,工具条按钮的响应函数,选择消息后,选择增加函数后再选择编辑函数代码,如某工具条按钮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(,真彩工具条的实现(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;inStart;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),/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-GetCellWidth()/pWnd-lTwipPerPixel+1;/单元格大小l=para-GetCellHeight()/pWnd-lTwipPerPixel+1;CRectrect(x,y,x+k,y+l);/单元格左上角坐标及大小,以文本框覆盖被点击的单元格(续),edit-SetWindowText(para-GetText();/显示表格内容edit-SetFocus();/获取焦点edit-MoveWindow(rect);/将文本框移到单元格上edit-ShowWindow(SW_SHOW);/显示文本框CDC*dc=edit-GetDC();dc-FillSolidRect(0,0,k,l,0 x7cfc00);/以醒目色块填充文本框底部ReleaseDC(dc);/释放DC对象,7.定时器,初始化SetTimer(1,1000,NULL);/1秒触发一次定时器响应voidCRX:OnTimer(UINTnIDEvent)switch(nIDEvent)case1:Progress-SetPos(nRx);break;,增加定时器响应函数,8.图形,在C、VB中作图,窗口就象黑板,可以任意涂写。VC中作图,就象放幻灯,可以先完成图形,再把完整的画面贴到画布上。,x,y,0,状态曲线,从状态曲线看两种作图方式的区别,第一种方式的状态刷新必须以背景色重画所有曲线,实现擦除(直接以背景色块覆盖太晃眼);再以新的数据重画曲线。第二种方式的状态刷新直接在内存中以新的数据画出框架和曲线,再将画面贴到窗口。因为无需擦除,而且在内存中作图速度远胜于直接在窗口作图,所以可以实现“无闪刷新”。,常用的图形函数画笔、画刷,画笔:设置线型、粗细、颜色CPenpen;pen.CreatePen(PS_SOLID,2,0 xffffff);CDC*dc=GetDC();/DeviceContext,API函数接口dc-SelectObject(强制刷新窗口RedrawWindow,起点、点、线、圆、多边形,设置起点:MoveTo(x,y)画点:SetPixel(x,y,color),SetPixelV画线:LineTo(x,y)弧线:Arc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)/矩形左上右下,弧线起点终点椭圆:Ellipse(intx1,inty1,intx2,inty2)矩形:Retangle(intx1,inty1,intx2,inty2)多边形:Polygon(Set_Font(24,lfont,system);OF=memDC.SelectObject(lfont);,voidCPIDDlg:Set_Font(intheight,CFont*font,char*name)LOGFONTlf;lf.lfHeight=20;lf.lfWidth=0;lf.lfEscapement=0;lf.lfOrientation=0;lf.lfWeight=400;lf.lfItalic=0;lf.lfUnderline=0;lf.lfStrikeOut=0;lf.lfCharSet=134;lf.lfOutPrecision=3;lf.lfClipPrecision=2;lf.lfQuality=1;lf.lfPitchAndFamily=2;lstrcpy(lf.lfFaceName,宋体);/songtilf.lfOutPrecision=OUT_TT_ONLY_PRECIS;lf.lfHeight=height;strcpy(lf.lfFaceName,name);/if(font!=NULL)font-DeleteObject();font-CreateFontIndirect(,设置窗口所有控件字体,CFont*f=newCFont;pWnd-Set_Font(12,f,“system”);/调用主窗口函数设置字体CWnd*pw=GetWindow(GW_CHILD);while(pw!=NULL)/遍历窗口控件pw-SetFont(f);pw=pw-GetWindow(GW_HWNDNEXT);,贴图函数BitBlt,CDCmemDC,*MyDC=GetDC();/获取窗口DCCBitmapbmp;bmp.CreateCompatibleBitmap(MyDC,497,480);memDC.CreateCompatibleDC(MyDC);memDC.SelectObject(/作图,贴图函数BitBlt(续),MyDC-BitBlt(10,20,497,480,生成位图文件,BITMAPbtm;bmp.GetBitmap(,生成位图文件(续),GetDIBits(dc-GetSafeHdc(),bmp,0,bih.biHeight,lpData,(BITMAPINFO*),9.模态对话框和非模态对话框,在主窗口打开预先设计完成的对话框有两种方式,一种是以模态对话框形式打开,另一种是以非模态对话框形式打开。其中进入模态对话框后不能响应其他窗口的事件,如点击主窗口的按钮。非模态对话框对于其他窗口的事件响应没有任何限制。,模态对话框的限制,连续接收波形数据时,在收到第一个数据后弹出带进度条的窗口。If(nRxNum=0)Rx.DoModal();/打开模态对话框/接收数据处理结果:对话框返回前无法处理数据。,打开、退出模态对话框,打开CAboutDlgdlgAbout;dlgAbout.DoModal();在对话框中响应退出命令EndDialog(IDOK);或者EndDialog(IDCANCEL);,打开非模态对话框,COption*option=newCOption;/建立窗口对象option-Create(IDD_OPTION,this);/创建窗口option-ShowWindow(SW_SHOW);/显示窗口,关闭非模态对话框,添加PostNcDestroy()函数删除窗口voidCOption:PostNcDestroy()/TODO:Addyourspecializedcodehereand/orcallthebaseclassCDialog:PostNcDestroy();deletethis;/删除窗口对象,释放内存,10.对话框之间的信息交换,子窗口获取父窗口数据父窗口向子窗口传递消息,子窗口获取父窗口的数据,在头文件定义父窗口类(CPIDDlg)的指针#includePIDDlg.h“public:CPIDDlg*pWnd;父窗口调用模态对话框时对指针赋值#include“DI.h”CDIDI;DI.pWnd=this;DI.DoModal();,调用非模态对话框时的赋值,#include“option.h”COption*option=newCOption;/分配子窗口内存option-Create(IDD_OPTION,this);/创建窗口option-pWnd=this;/内置指向父窗口的指针option-m_Start=nStart;/初始化子窗口数据option-ShowWindow(SW_SHOW);/显示窗口,子窗口中对父窗口数据和函数的访问,使用指针可以直接访问父窗口的公共变量和公用函数pWnd-Set_Font(24,lfont,system“);byteDI0i=pWnd-byteDI0i;,待交换的数据比较复杂,界面的串口通信由主窗口负责,主窗口接收到数据后子窗口需要根据数据的类型显示不同的表格和文字。,建立自己的消息响应循环,在父窗口的头文件定义消息#defineWM_SEND_DATAWM_USER+1在子窗口的头文件定义消息响应函数afx_msgvoidOnSendDataMsg(WPARAMwParam,LPARAMlParam);在子窗口CPP文件头部定义消息映射BEGIN_MESSAGE_MAP()ON_MESSAGE(WM_SEND_DATA,OnSendDataMsg)END_MESSAGE_MAP(),建立自己的消息响应循环(续1),在子窗口CPP文件实现消息响应函数voidCSETTING:OnSendDataMsg(WPARAMwParam,LPARAMlParam)switch(wParam),建立自己的消息响应循环(续2),在主窗口向子窗口发送消息win=FindWindow(NULL,“参数设置”);/查找子窗口if(win!=NULL)/如果窗口存在win-SendMessage(WM_SEND_DATA,3,(LPARAM)nChannel);/发送消息,3是消息ID,11.文本文件处理,文件是否存在(stdio方式处理)CStdioFilefIni;CFileStatusstatus;if(!fIni.GetStatus(d:landiaec2010.ini,status)/CantopenfileMessageBox(没有在d:land目录找到iaec2010.ini文件!,ini错误,MB_OK);exit(0);,文本文件处理(续1),打开文本文件fIni.Open(d:landiaec2010.ini,CFile:modeRead|CFile:typeText);读取一行、CStringstrF;fIni.ReadString(strF);关闭文件fIni.Close();,文本文件处理(续2),删除文件FILE*fp;strF=d:landtemp.ini;/临时文件名fp=fopen(strF,r);if(fp!=NULL)/如果存在则删除fclose(fp);/不关闭文件则无法删除

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论