下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 vc

vc.doc

vc

Y_in_heart
2012-02-11 0人阅读 举报 0 0 暂无简介

简介:本文档为《vcdoc》,可适用于IT/计算机领域

CHAR转十六进制和十六进制转CHARPComm的主要命令码有以下几种:VC串口编程之基于控件串口基于控件编程:文件的读写WINDOWS程序设计中最常用的一些消息:各种DC的获取绘图菜单指针的获取及相关设置控件CByteArray类MFC中常用类、宏、函数介绍画笔和画刷使用点、刷子、笔进行绘图基本的画线函数有以下几种输出文字文本坐标的计算使用各种映射方式得到各种对象的指针:Tab属性页控件改变窗口状态位置等MBOKDDXTEXT()DDXControl()DoDataExchange(pDX)CHAR转十六进制和十六进制转CHARvoidCTCANDlg::DATAtoUCHAR(UCHARdata){if(data<)DATAtoUCHARresult=dataxelseDATAtoUCHARresult=dataxif(data<)DATAtoUCHARresult=dataxelseDATAtoUCHARresult=datax}UCHARCTCANDlg::UCHARtoDATA(UCHARdata,UCHARdata){if(data>='a'data<='f')data=data'a'if(data>='A'data<='F')data=data'A'if(data>=''data<='')data=data''if(data>='a'data<='f')data=data'a'if(data>='A'data<='F')data=data'A'if(data>=''data<='')data=data''return(data*data)}PComm的主要命令码有以下几种:()sioopen(port)用于设置并打开串口当返回值为时表示串口已经打开否则为串口打开出错。()sioclose(port)关闭串口当返回值为时,表示串口已经关闭否则为串口关闭出错。()sioioctl(portbaudmode)用于设置串口波特率、校验位、数据位、停止位等参数。()siogetch()从串口输入缓冲区读出一个字符返回值为表示已收到数据。()sioread(portbuflen)用于从串口输入缓冲区读出一串字符buf代表字符串数组len代表数组长度返回值为表示未收到字符大于代表收到字符的个数。()sioSetReadTimeoutsportTotalTimeouts(IntervalTimeouts)在设定的等待时间内连续读串口输入缓冲区TotalTimeouts代表设定的等待时间IntervalTimeouts代表每次读出的间隔时间。()sioflush(portfunc)用于清空缓冲区。当func为时清空输入缓冲区为时清空输出缓冲区为2时清空输入输出缓冲区。()sioputch(portterm)用于向串口缓冲区发送一个字符返回值为时表示发送正确否则表示发送错误。()siowrite(portbuflen)用于从串口缓冲区发送一串字符buf代表字符串数组,len代表数组长度。VC串口编程之基于控件voidSetPortOpen(BOOLbNewValue)打开或关闭串口TRUE:打开FALSE:关闭BOOLGetPortOpen()串口是否已打开TRUE:打开FALSE:关闭voidSetRThreshold(shortnNewValue)如果设置为表示一接收到字符就发送号事件shortGetRThreshold()voidSetRTSEnable(BOOLbNewValue)硬件握手使能?BOOLGetRTSEnable()voidSetSettings(LPCTSTRlpszNewValue)Settings由部分组成其格式为:"BBBB,P,D,S"即"波特率,是否奇偶校验,数据位个数,停止位"如设置为:",n,,"CStringGetSettings()voidSetSThreshold(shortnNewValue)如果保持缺省值不变则表示发送数据的过程中串口上不发生事件shortGetSThreshold()voidSetOutput(constVARIANTnewValue)一个非常重要的函数用于写串口注意其接收的输入参数为VARIANT类型对象我们需要将字符串转化为VARIANT类型对象VARIANTGetOutput()voidSetInput(constVARIANTnewValue)VARIANTGetInput()一个非常重要的函数用于读串口注意其返回的是VARIANT类型对象我们需要将其转化为字符串voidSetCommEvent(shortnNewValue)shortGetCommEvent()一个非常重要的函数获得串口上刚发生的事件("事件"可以理解为软件意义上的"消息"或硬件意义上的"中断")事件的发送会导致OnComm消息的诞生!基本上MSComm的诸多接口可以分为如下几类:()打开与设置串口接口函数()获得串口设置和串口状态接口函数()设置串口发送数据方式、缓冲区接口及发送数据接口函数()设置串口接收数据方式、缓冲区接口及接收数据接口函数()设置与获取串口上发生的事件接口函数。属性设定值属性说明CommPort串口号一般从到InBufferSize接收缓冲区大小为保持程序的稳定建议设得值足够大InputModeText接收数据的类型表示文本类型表示二进制类型InputLen从接收缓冲区读取的字节数表示全部读取OutBufferSize发送缓冲区大小Settings,n,,串口的参数设置,依次为波特率、奇偶校验(n无校验,e偶校验,o奇校验)、数据位数、停止位数RThreshold设定当接收几个字符时触发OnComm事件表示不产生事件表示每接收一个字符就产生一个事件SThreshold设定在触发OnComm事件前发送缓冲区内所允许的最少的字符数表示发送数据时不产生事件表示当发送缓冲区空时产生OnComm事件我们要求能在程序启动的同时就打开串口以便即时对从串口到达的数据进行接收、处理。一般来说可以将下面的打开端口的代码写在OnCreate()、OnInitialUpdate()、InitInstance()等程序入口函数中:……if(!mCommGetPortOpen())检测是否已经打开过端口mCommSetPortOpen(TRUE)如没有打开则将端口打开……串口基于控件编程:、将ActiveX控件MSComm添加入工程。单击主菜单project的子菜单AddToproject的ComponentsandControls选项在弹出的"ComponentsandControlsGallery"对话框中选择RegisteredActiveXControls文件夹中的"MicrosoftCommunicationsControl,version"选项、初始化函数中设置端口号输入输出缓冲区的大小打开串口设置输入模式波特率等参数mmscomSetCommPort()串口mmscomSetInBufferSize()设置输入缓冲区的大小mmscomSetOutBufferSize()设置输出缓冲区的大小Bytesif(!mmscomGetPortOpen()){mmscomSetPortOpen(TRUE)}mmscomSetInputMode()设置输入模式为二进制方式mmscomSetSettings(",n,,")设置波特率等参数mmscomSetRThreshold()为表示有一个字符即引发事件mmscomSetInputLen()、为控件添加成员变量mmscom其对应的变量类型为CMSComm为了处理接收事件我们需要为MScomm控件添加对应的消息处理函数。如下图我们通过"MFC类向导"添加了CSerialPortActivexDlg类的成员函数OnCommMscomm():文件的读写CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数构造函数原型如下:CFileDialog::CFileDialog(BOOLbOpenFileDialog,LPCTSTRlpszDefExt=,LPCTSTRlpszFileName=,DWORDdwFlags=OFNHIDEREADONLY|OFNOVERWRITEPROMPT,LPCTSTRlpszFilter=,CWnd*pParentWnd=);参数意义如下:bOpenFileDialog为TRUE则显示打开对话框为FALSE则显示保存对话文件对话框。lpszDefExt指定默认的文件扩展名。lpszFileName指定默认的文件名。dwFlags指明一些特定风格。lpszFilter是最重要的一个参数它指明可供选择的文件类型和相应的扩展名。参数格式如:"ChartFiles(*xlc)|*xlc|WorksheetFiles(*xls)|*xls|DataFiles(*xlc;*xls)|*xlc;*xls|AllFiles(**)|**||";文件类型说明和扩展名间用|分隔同种类型文件的扩展名间可以用;分割每种文件类型间用|分隔末尾用||指明。pParentWnd为父窗口指针。创建文件对话框可以使用DoModal()在返回后可以利用下面的函数得到用户选择:CStringCFileDialog::GetPathName()得到完整的文件名包括目录名和扩展名如:c:testtesttxtCStringCFileDialog::GetFileName()得到完整的文件名包括扩展名如:testtxtCStringCFileDialog::GetExtName()得到完整的文件扩展名如:txtCStringCFileDialog::GetFileTitle()得到完整的文件名不包括目录名和扩展名如:testPOSITIONCFileDialog::GetStartPosition()对于选择了多个文件的情况得到第一个文件位置。CStringCFileDialog::GetNextPathName(POSITIONpos)对于选择了多个文件的情况得到下一个文件位置并同时返回当前文件名。但必须已经调用过POSITIONCFileDialog::GetStartPosition()来得到最初的POSITION变量。CColorDialog颜色选择对话框的使用:首先通过CColorDialog::CColorDialog(COLORREFclrInit=,DWORDdwFlags=,CWnd*pParentWnd=)构造一个对象其中clrInit为初始颜色。通过调用DoModal()创建对话框在返回后调用COLORREFCColorDialog::GetColor()得到用户选择的颜色值。CFontDialog字体选择对话框的使用:首先构造一个对象并提供相应的参数构造函数原型如下:CFontDialog::CFontDialog(LPLOGFONTlplfInitial=,DWORDdwFlags=CFEFFECTS|CFSCREENFONTS,CDC*pdcPrinter=,CWnd*pParentWnd=);构造一个对象其中参数lplfInitial指向一个LOGFONG结构(该结构介绍请见在窗口中输出文字)如果该参数设置为表示不设置初始字体。pdcPrinter指向一个代表打印机设备环境的DC对象若设置该参数则选择的字体就为打印机所用。pParentWnd用于指定父窗口。通过调用DoModal()创建对话框在返回后通过调用以下函数来得到用户选择:voidCFontDialog::GetCurrentFont(LPLOGFONTlplf);用来获得所选字体的属性。该函数有一个参数该参数是指向LOGFONT结构的指针函数将所选字体的各种属性写入这个LOGFONT结构中。CStringCFontDialog::GetFaceName()得到所选字体名字。intCFontDialog::GetSize()得到所选字体的尺寸(以个象素为单位)。COLORREFCFontDialog::GetColor()得到所选字体的颜色。BOOLCFontDialog::IsStrikeOut()BOOLCFontDialog::IsUnderline()BOOLCFontDialog::IsBold()BOOLCFontDialog::IsItalic()得到所选字体的其他属性是否有删除线是否有下划线是否为粗体是否为斜体文件的保存CFileDialogdlgFilesave(FALSE,T("txt"),,OFNHIDEREADONLY|OFNOVERWRITEPROMPT,T("*txt|*txt"),)if(dlgFilesaveDoModal()==IDOK){FILE*fileCStringBUFBUF=dlgFilesaveGetPathName()file=fopen(BUF,"w")fprintf(file,"s",mvalue)fclose(file)文件的打开CFileDialogdlgFileOpen(TRUE,T("txt"),,OFNHIDEREADONLY|OFNOVERWRITEPROMPT,T("*txt|*txt|AllFiles(**)|**||"),)if(dlgFileOpenDoModal()==IDOK){FILE*fpCStringbbmvalue=""charbufbb=dlgFileOpenGetFileName()fp=fopen(bb,"r")while(!feof(fp)){fscanf(fp,"s",buf)mvalue=mvaluebufmvalue="rn"}UpdateData(FALSE)fclose(fp)}WINDOWS程序设计中最常用的一些消息:窗口消息:WMCREATEWMDESTROYWMCLOSE我们创建一个窗口对象的时候这个窗口对象在创建过程中收到的就是WMCREATE消息对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作如设置窗口的大小背景颜色等WMDESTROY消息指示窗口即将要被撤消在这个消息处理过程中我们就可以做窗口撤消前的一些工作。WMCLOSEwmclose消息发生在窗口将要被关闭之前在收到这个消息后一般性的操作是回收所有分配给这个窗口的各种资源。在windows系统中资源是很有限的所以回收资源的工作还是非常重要的。键盘消息:WMCHARWMKEYDOWNWMKEYUP这三个消息用来处理用户的键盘数据当用户在键盘上按下某个键的时候会产生WMKEYDOWN消息释放按键的时候又会产生WMKEYUP消息所以WMKEYDOWN与WMKEYUP消息一般总是成对出现的至于WMCHAR消息是在用户的键盘输入能产生有效的ASCII码时才会发生。这里特别提醒要注意前两个消息与WMCHAR消息在使用上是有区别的。在前两个消息中伴随消息传递的是按键的虚拟键码所以这两个消息可以处理非打印字符如方向键功能键等。而伴随WMCHAR消息的参数是所按的键的ASCII码ASCII码是可以区分字母的大小写的。而虚拟键码是不能区分大小写的。鼠标消息:WMMOUSEMOVEWMLBUTTONDOWNWMLBUTTONUPWMLBUTTONDBCLICKWMRBUTTONDOWNWMRBUTTONUPWMRBUTTONDBCLICK这组消息是与鼠标输入相关的WMMOUSEMOVE消息发生在鼠标移动的时候剩余的六个消息则分别对应于鼠标左右键的按下、释放、双击事件要指出的是WINDOWS系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE消息这一点要特别注意。另一组窗口消息:WMMOVE,WMSIZE,WMPAINT当窗口移动的时候产生WMMOVE消息窗口的大小改变的时候产生WMSIZE消息而当窗口工作区中的内容需要重画的时候就会产生WMPAINT消息。焦点消息WMSETFOCUSWMKILLFOCUS当一个窗口从非活动状态变为具有输入焦点的活动状态的时候它就会收到WMSETFOCUS消息而当窗口失去输入焦点的时候它就会收到WMKILLFOCUS消息。定时器消息:WMTIMER当我们为一个窗口设置了定时器资源之后系统就会按规定的时间间隔向窗口发送WMTIMER消息在这个消息中就可以处理一些需要定期处理的事情。最后要指出的一点是在WINDOWS环境下消息的来源是多方面的最常见的是用户的操作产生消息系统在必要的时候也会向程序发送系统消息其他在运行中的程序也可以向程序发送消息。此外在程序的内部也可以根据需要在适当的时候主动产生消息比如主动产生WMPAINT消息以实现需要的重画功能。消息映射例如对于消息WMLBUTTONDOWN在宏BEGINMESSAGEMAP()与ENDMESSAGEMAP()之间进行消息映射。宏ONWMLBUTTONDOWN()把消息WMLBUTTONDOWN与它的响应函数OnLButtonDown()相关联。这样一旦有消息的产生就会自动调用相关联的消息响应函数去处理。各种DC的获取使用SDK获取DC句柄:HDChdchdc=::GetDc(mhWnd)获取DC句柄MoveToEx(hdc,mptOriginx,mptOriginy,)LineTo(hdc,pointx,pointy)::ReleaseDC(mhWnd,hdc)释放DC利用CDC类指针和CWin类成员函数获取DC。CDC*pDC=GetDC()pDC>MoveTo(mptOrigin)pDC>LineTo(point)ReleaseDC(pDC)利用CClientDC对象。(CClientDC类从CDC类派生来的)CClientDCdc(this)dcMoveTo(mptOrigin)dcLineTo(point)利用CWindowDC对象。(CWindowDC类从CDC类派生来的)CWindowDCdc(this)dcMoveTo(mptOrigin)dcLineTo(point)父窗口(MainFrame框架)和屏幕指针。将上面的dc(this)分别改成GetParent()和GetDesktopWindow()就可以得到父窗口指针和屏幕窗口指针。绘图利用画笔改变线条颜色和类型:CPenpen(PSDOT,,RGB(,,))构造画笔对象CClientDCdc(this)CPen*pOldPen=dcSelectObject(pen)将画笔选入DCdcMoveTo(mptOrigin)dcLineTo(point)dcSelectObject(pOldPen)恢复先前的画笔使用画刷(通常利用画刷去填充矩形区域):使用单色画刷CBrushbrush(RGB(,,))构造画刷对象CClientDCdc(this)dcFillRect(CRect(mptOrigin,point),brush)用指定的画刷去填充矩形区域使用位图画刷CBitmapbitmap构造位图对象(使用前需要初试化)bitmapLoadBitmap(IDBBITMAP)初试化位图对象CBrushbrush(bitmap)构造位图画刷CClientDCdc(this)dcFillRect(CRect(mptOrigin,point),brush)用指定的位图画刷去填充矩形区域使用透明画刷CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(BRUSH))获取透明画刷对象指针CClientDCdc(this)CBrush*pOldBrush=dcSelectObject(pBrush)将透明画刷选入DCdcRectangle(CRect(mptOrigin,point))dcSelectObject(pOldBrush)释放透明画刷菜单指针的获取及相关设置在CMainFrame::OnCreate下可以直接实验以下操作几个相关和重要的函数CMenu*GetMenu()CWnd::GetMenu得到窗口菜单栏对象指针。CMenu*GetSubMenu()CMenu::GetSubMenu获得指向弹出菜单对象指针UINTCheckMenuItem()CMenu::CheckMenuItemAddscheckmarkstoorremovescheckmarksfrommenuitemsinthepopupmenuBOOLSetDefaultItem()CMenu::SetDefaultItemSetsthedefaultmenuitemforthespecifiedmenuBOOLSetMenuItemBitmaps()CMenu::SetMenuItemBitmaps设置位图标题菜单。UINTEnableMenuItem()CMenu::EnableMenuItem使菜单项有效无效或变灰。BOOLSetMenu(CMenu*pMenu)CWnd::SetMenu在当前窗口上设置新菜单或移除菜单。HMENUDetach()CMenu::DetachDetachesaWindowsmenufromaCMenuobjectandreturnsthehandle获取菜单的宽和高:GetSystemMetrics(SMCXMENUCHECK),GetSystemMetrics(SMCYMENUCHECK)例子:给菜单项打上标记GetMenu()>GetSubMenu()>CheckMenuItem(,MFBYPOSITION|MFCHECKED)GetMenu()>GetSubMenu()>CheckMenuItem(IDFILENEW,MFBYCOMMAND|MFCHECKED)设置缺省菜单项GetMenu()>GetSubMenu()>SetDefaultItem(,TRUE)GetMenu()>GetSubMenu()>SetDefaultItem(IDFILEOPEN)图形标记菜单先创建图形注意底色不要是白色mbitmapLoadBitmap(IDBBITMAP)GetMenu()>GetSubMenu()>SetMenuItemBitmaps(,MFBYPOSITION,mbitmap,mbitmap)屏蔽菜单使之不能用(需要在CMainFrame::CMainFrame()中设置mbAutoMenuEnable=FALSE)GetMenu()>GetSubMenu()>EnableMenuItem(,MFBYPOSITION|MFDISABLED|MFGRAYED)取消和加载菜单用此功能可以动态的修改菜单SetMenu()取消菜单项CMenumenumenuLoadMenu(IDRMAINFRAME)SetMenu(menu)menuDetach()菜单句柄和对象断开使对象析构时不销毁菜单控件、动态编辑static静态文本框CStringstrif(GetDlgItem(IDCNUMBER)>GetWindowText(str),str=="Number:")GetDlgItem(IDCNUMBER)>SetWindowText("数值:")elseGetDlgItem(IDCNUMBER)>SetWindowText("Number:")要让static静态文本框响应消息需要复选上notify选项、Edit文本框获取设置文本内容)方法charchGetDlgItem(IDCEDIT)>GetWindowText(ch,)GetDlgItem(IDCEDIT)>SetWindowText(itoa(atoi(ch),ch,)))方法GetDlgItemText(IDCEDIT,ch,)SetDlgItemText(IDCEDIT,itoa(atoi(ch),ch,))方法SetDlgItemInt(IDCEDIT,GetDlgItemInt(IDCEDIT))对整型数字的字符串有用)关联变量法对每个Edit控件关联一个变量设置后记得用UpdateData()对于显示数字类的文本框可以定义value和control两种类型变量清除Edit区中的内容:meditSetSel(,,TRUE)meditClear()meditReplaceSel("")meditSetSel()在::OnInitDialog()里面进行控件的初始化初始化列表框CListBox*pListB=(CListBox*)GetDlgItem(IDCLISTTEST);pListB>AddString("item");pListB>AddString("item");pListB>AddString("item");初始化组合框CComboBox*pCB=(CComboBox*)GetDlgItem(IDCCOMBOTEST);pCB>AddString("item");pCB>AddString("item");pCB>AddString("item");初始化TabCtrlCTabCtrl*pTab=(CTabCtrl*)GetDlgItem(IDCTABTEST);pTab>InsertItem(,"TabPage");pTab>InsertItem(,"TabPage");pTab>InsertItem(,"TabPage");初始化ListCtrlCListCtrl*pList=(CListCtrl*)GetDlgItem(IDCLISTCTRL);pList>InsertColumn(,"Column",LVCFMTLEFT,);pList>InsertItem(,"Item");pList>InsertItem(,"Item");pList>InsertItem(,"Item");初始化TreeCtrlCTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDCTREETEST);pTree>InsertItem("Node",,);HTREEITEMhNode=pTree>InsertItem("Node",,);pTree>InsertItem("Node",,,hNode);pTree>InsertItem("Node",,,hNode);pTree>Expand(hNode,TVEEXPAND);CByteArray类类CByteArray支持以字节为单位动态建立数组。在使用数组之前要调用SetSize设置它的大小并分配内存。如果没有使用SetSize在数组中增加元素会引起数组内存空间频繁的重新分配以及数据拷贝。内存频繁的重新分配和数据拷贝会影响性能并造成内存碎片。CByteArray类的成员构造函数CByteArray构造一个空的字节数组边界GetSize取数组中元素的个数(数组大小)GetUpperBound返回数组的最大有效下标SetSize设置数组元素的个数(数组大小)操作FreeExtra释放数组中当前已有数据的最大上界后所有未占用的内存RemoveAll删除数组中所有的元素元素存取GetAt返回指定下标处的数组元素的值SetAt给数组中指定下标的元素赋值但不能动态增长数组(指定的下标不能越界)ElementAt返回对数组中某个字节的临时参考GetData允许访问数组中的元素。可以为数组增长SetAtGrow给数组中指定下标的元素赋值在下标越界时动态增长数组Add在数组末尾增添一个元素必要时增长数组Append在数组末尾接上另一个数组必要时增长数组Copy把另一个数组的内容拷贝到本数组必要时增长数组插入删除InsertAt在指定的下标处插入元素(或另外一个数组的内容)RemoveAt删除指定下标处的一个元素操作符operator取指定下标处元素的值或者给其赋值MFC中常用类、宏、函数介绍常用类CRect:用来表示矩形的类拥有四个成员变量:topleftbottomright。分别表是左上角和右下角的坐标。可以通过以下的方法构造。●CRect(intl,intt,intr,intb);指明四个坐标●CRect(constRECTsrcRect);由RECT结构构造●CRect(LPCRECTlpSrcRect);由RECT结构构造●CRect(POINTpoint,SIZEsize);有左上角坐标和尺寸构造●CRect(POINTtopLeft,POINTbottomRight);有两点坐标构造下面介绍几个成员函数:●intWidth()const;得到宽度●intHeight()const;得到高度●CSizeSize()const;得到尺寸●CPointTopLeft();得到左上角坐标●CPointBottomRight();得到右下角坐标●CPointCenterPoint()const;得当中心坐标此外矩形可以和点(CPoint)相加进行位移和另一个矩形相加得到“并”操作后的矩形。●CPoint:用来表示一个点的坐标有两个成员变量:xy。可以和另一个点相加。●CString:用来表示可变长度的字符串。使用CString可不指明内存大小CString会根据需要自行分配。下面介绍几个成员函数:●GetLength得到字符串长度●GetAt得到指定位置处的字符●operator相当于strcat●voidFormat(LPCTSTRlpszFormat,);相当于sprintf●Find查找指定字符字符串●Compare比较●CompareNoCase不区分大小写比较●MakeUpper改为大写●MakeLower改为小写CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数:●Add增加CString●RemoveAt删除指定位置CString对象●RemoveAll删除数组中所有CString对象●GetAt得到指定位置的CString对象●SetAt修改指定位置的CString对象●InsertAt在某一位置插入CString对象常用宏:RGB、TRACE、ASSERT、VERIFY常用函数●CWindApp*AfxGetApp();●HINSTANCEAfxGetInstanceHandle()●HINSTANCEAfxGetResourceHandle()●intAfxMessageBox(LPCTSTRlpszText,UINTnType=MBOK,UINTnIDHelp=);用于弹出一个消息框画笔和画刷OnDraw(CDC*pDC){CPenpen,pen;penCreatePen(PSSOLID,,RGB(,,));创建对象penCreatePen(PSSOLID,,RGB(,,));创建对象CPen*pPenOld=(CPen*)pDC>SelectObject(pen);选择对象进DCdrawWithPen(CPen*)pDC>SelectObject(pen);选择对象进DCdrawWithPenpenDeleteObject();再次创建前先销毁penCreatePen(PSSOLID,,RGB(,,));再次创建对象(CPen*)pDC>SelectObject(pen);选择对象进DCdrawWithPenpDC>SelectObject(pOldPen);恢复}此外系统中还拥有一些库存GUI对象你可以利用CDC::SelectStockObject(SelectStockObject(intnIndex)选入这些对象它们包括一些固定颜色的刷子画笔和一些基本字体使用点、刷子、笔进行绘图在Windows中画点的方法很简单只需要调用COLORREFCDC::SetPixel(intx,inty,COLORREFcrColor)就可以在指定点画上指定颜色同时返回原来的颜色。COLORREFCDC::GetPixel(intx,inty)可以得到指定点的颜色。在Windows中应该少使用画点的函数因为这样做的执行效率比较低。在画点或画线时系统使用当前DC中的画笔所以在创建画笔后必须将其选入DC才会在绘图时产生效果。画笔可以通过CPen对象来产生通过调用CPen::CreatePen(intnPenStyle,intnWidth,COLORREFcrColor)来创建。其中nPenStyle指名画笔的风格可取如下值:●PSSOLID实线Createsasolidpen●PSDASH虚线宽度必须为一CreatesadashedpenValidonlywhenthepenwidthisorless,indeviceunits●PSDOT点线宽度必须为一CreatesadottedpenValidonlywhenthepenwidthisorless,indeviceunits●PSDASHDOT点划线宽度必须为一CreatesapenwithalternatingdashesanddotsValidonlywhenthepenwidthisorless,indeviceunits●PSDASHDOTDOT双点划线宽度必须为一CreatesapenwithalternatingdashesanddoubledotsValidonlywhenthepenwidthisorless,indeviceunits●PS空线使用时什么也不会产生Createsapen●PSENDCAPROUND结束处为圆形Endcapsareround●PSENDCAPSQUARE结束处为方形EndcapsaresquarenWidth和crColor为线的宽度和颜色。刷子是在画封闭曲线时用来填充的颜色例如当你画圆形或方形时系统会用当前的刷子对内部进行填充。刷子可利用CBrush对象产生。通过以下几种函数创建刷子:●BOOLCreateSolidBrush(COLORREFcrColor);创建一种固定颜色的刷子●BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);创建指定颜色和网格的刷子基本的画线函数有以下几种●CDC::MoveTo(intx,inty);改变当前点的位置●CDC::LineTo(intx,inty);画一条由当前点到参数指定点的线●CDC::BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);画弧线●CDC::BOOLPolyline(LPPOINTlpPoints,intnCount);将多条线依次序连接基本的作图函数有以下几种:●CDC::BOOLRectangle(LPCRECTlpRect);矩形●CDC::RoundRect(LPCRECTlpRect,POINTpoint);圆角矩形●CDC::DrawdRect(intx,inty,intcx,intcy,COLORREFclrTopLeft,COLORREFclrBottomRight);D边框●CDC::Chord(LPCRECTlpRect,POINTptStart,POINTptEnd);扇形●CDC::Ellipse(LPCRECTlpRect);椭圆形●CDC::Pie(LPCRECTlpRect,POINTptStart,POINTptEnd);●CDC::Polygon(LPPOINTlpPoints,intnCount);多边形对于矩形圆形或类似的封闭曲线系统会使用画笔绘制边缘使用刷子填充内部。如果你不希望填充或是画出边缘你可以选入空刷子(PEN)或是(BRUSH)空笔。下面的代码创建一条两象素宽的实线并选入DC。并进行简单的作图:{CPenpen;penCreatePen(PSSOLID,,RGB(,,));CPen*pOldPen=(CPen*)dcSelectObject(pen);dcSelectStockObject(BRUSH);选入空刷子dcRectangle(CRect(,,,));画矩形}输出文字一般使用CDC::BOOLTextOut(intx,inty,constCStringstr)和CDC::intDrawText(constCStringstr,LPRECTlpRect,UINTnFormat)两个函数对TextOut来讲只能输出单行的文字而DrawText可以指定在一个矩形中输出单行或多行文字并且可以规定对齐方式和使用何种风格。nFormat可以是多种标记的组合(利用位或操作)以达到选择输出风格的目的。在输出文字时如果希望改变文字的颜色你可以利用CDC::SetTextColor(COLORREFcrColor)进行设置如果你希望改变背景色就利用CDC::SetBkColor(COLORREFcrColor)很多时候你可能需要透明的背景色你可以利用CDC::SetBkMode(intnBkMode)设置文本坐标的计算利用CDC::GetTextExtent(constCStringstr)可以得到字符串的在输出时所占用的宽度和高度这样就可以在手工输出多行文字时使用正确的行距。另外如果需要更精确的对字体高度和宽度进行计算就需要使用CDC::GetTextMetrics(LPTEXTMETRIClpMetrics)该函数将会填充TEXTMETRIC结构该结构中的分量可以非常精确的描述字体的各种属性。使用各种映射方式所谓的映射方式简单点讲就是坐标的安排方式系统默认的映射方式为MMTEXT即X坐标向右增加Y坐标向下增加(,)在屏幕左上方DC中的每一点就是屏幕上的一个象素。也许你会认为这种方式下是最好理解的但是一个点和象素对应的关系在屏幕上看来是正常的但到了打印机上就会很不正常。因为我们作图是以点为单位并且打印机的分辨率远远比显示器高(DPI点每英寸)所以在打印机上图形看起来就会很小。这样就需要为打印另做一套代码而加大了工作量。如果每个点对应毫米那么在屏幕上的图形就会和打印出来的图形一样大小。通过intCDC::SetMapMode(intnMapMode)可以指定映射方式可用的有以下几种:·MMHIENGLISH每点对应英寸●MMHIMETRIC每点对应毫米●MMLOENGLISH每点对应英寸●MMLOMETRIC每点对应毫米●MMTEXT象素对应另外的一种映射方式为MMANISOTROPIC这种方式可以规定不同的长宽比例。在设置这中映射方式后必须调用CSizeCDC::SetWindowExt(SIZEsize)和CSizeCDC::SetViewportExt(SIZEsize)来设定长宽比例。系统会根据两次设定的长宽的比值来确定长宽比例。下面给出一段代码比较映射前后的长宽比例:OnDraw(CDC*pDC){CRectrcC(,,,);pDC>FillSolidRect(rcC,RGB(,,));pDC>SetMapMode(MMANISOTROPIC);CSizesizeO;sizeO=pDC>SetWindowExt(,);TRACE("winExtddn",sizeOcx,sizeOcy);sizeO=pDC>SetViewportExt(,);TRACE("ViewExtddn",sizeOcx,sizeOcy);CRectrcC(,,,);pDC>FillSolidRect(rcC,RGB(,,));}上面代码在映射后画出的图形将是一个长方形。你可以通过调用CPointCDC::SetViewportOrg(POINTpoint)重新设置原点的位置这就相对于对坐标进行了位移。例如你将原点设置在(,)那么原来的(,)就变成了(,)得到各种对象的指针:●全局函数AfxGetApp可以得到CWinApp应用类指针●AfxGetApp()>mpMainWnd为框架窗

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/26

vc

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利