为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

vc

2012-02-11 26页 doc 191KB 48阅读

用户头像

is_612712

暂无简介

举报
vc2CHAR转十六进制和十六进制转CHAR 3PComm的主要命令码有以下几种[15]: 3VC++串口编程之基于控件 6串口基于控件编程: 7文件的读写 10WINDOWS程序设计中最常用的一些消息: 11各种DC 的获取 12绘图 13菜单指针的获取,及相关设置 14控件 16CByteArray类 17MFC 中常用类、宏、函数介绍 18画笔和画刷 19使用点、刷子、笔进行绘图 20基本的画线函数有以下几种 21输出文字 21文本坐标的计算 21使用各种映...
vc
2CHAR转十六进制和十六进制转CHAR 3PComm的主要命令码有以下几种[15]: 3VC++串口编程之基于控件 6串口基于控件编程: 7文件的读写 10WINDOWS程序中最常用的一些消息: 11各种DC 的获取 12绘图 13菜单指针的获取,及相关设置 14控件 16CByteArray类 17MFC 中常用类、宏、函数介绍 18画笔和画刷 19使用点、刷子、笔进行绘图 20基本的画线函数有以下几种 21输出文字 21文本坐标的计算 21使用各种映射方式 22得到各种对象的指针: 23Tab 属性页控件 25改变窗口状态,位置等 26MB_OK 26DDX_TEXT() DDX_Control() DoDataExchange(pDX) CHAR转十六进制和十六进制转CHAR void CT1_CANDlg::DATA_to_UCHAR(UCHAR data) { if (data/16<10) DATA_to_UCHAR_result[0]=data/16+0x30; else DATA_to_UCHAR_result[0]=data/16+0x37; if (data%16<10) DATA_to_UCHAR_result[1]=data%16+0x30; else DATA_to_UCHAR_result[1]=data%16+0x37; } UCHAR CT1_CANDlg::UCHAR_to_DATA(UCHAR data0, UCHAR data1) { if ( data0>='a' && data0<='f' ) data0 = data0 - 'a' + 10; if ( data0>='A' && data0<='F' ) data0 = data0 - 'A' + 10; if ( data0>='0' && data0<='9' ) data0 = data0 - '0'; if ( data1>='a' && data1<='f' ) data1 = data1 - 'a' + 10; if ( data1>='A' && data1<='F' ) data1 = data1 - 'A' + 10; if ( data1>='0' && data1<='9' ) data1 = data1 - '0'; return( data0*16 + data1 ); } PComm的主要命令码有以下几种[15]: (1) sioopen(port); 用于设置并打开串口,当返回值为0时,表示串口已经打开,否则为串口打开出错。 (2) sio close(port); 关闭串口,当返回值为0时,表示串口已经关闭,否则为串口关闭出错。 (3) sio ioctl (port baud mode ); 用于设置串口波特率、校验位、数据位、停止位等参数。 (4) sio getch(); 从串口输入缓冲区读出一个字符,返回值为0表示已收到数据。 (5) sio-read(port buf len); 用于从串口输入缓冲区读出一串字符,buf代表字符串数组len代表数组长度,返回值为0表示未收到字符,大于0代表收到字符的个数。 (6) sio-SetReadTimeouts port TotalTimeouts(Inter-valTimeouts); 在设定的等待时间内连续读串口输入缓冲区,TotalTimeouts代表设定的等待时间,Inter-valTimeouts代表每次读出的间隔时间。 (7) sio-flush(port func); 用于清空缓冲区。当func为0时清空输入缓冲区,为1时清空输出缓冲区,为2时清空输入输出缓冲区。 (8) sio-putch (port term); 用于向串口缓冲区发送一个字符,返回值为0时表示发送正确,否则表示发送错误。 (9) sio -write(port buf len); 用于从串口缓冲区发送一串字符,buf代表字符串数组,len代表数组长度。 VC++串口编程之基于控件 void SetPortOpen(BOOL bNewValue); //打开或关闭串口,TRUE:打开,FALSE:关闭 BOOL GetPortOpen(); //串口是否已打开,TRUE:打开,FALSE:关闭 void SetRThreshold(short nNewValue); //如果设置为1,表示一接收到字符就发送2 号事件 short GetRThreshold(); void SetRTSEnable(BOOL bNewValue); //硬件握手使能? BOOL GetRTSEnable(); void SetSettings(LPCTSTR lpszNewValue); //Settings 由4 部分组成,其为:"BBBB,P,D,S",即"波特率,是否奇偶校验,数据位 //个 数,停止位",如设置为:"9600,n,8,1" CString GetSettings(); void SetSThreshold(short nNewValue); //如果保持缺省值0 不变,则表示发送数据的过程中串口上不发生事件 short GetSThreshold(); void SetOutput(const VARIANT& newValue); //一个非常重要的函数,用于写串口,注意其接收的输入参数为VARIANT 类型对象, //我们需要将字符串转化为VARIANT 类型对象 VARIANT GetOutput(); void SetInput(const VARIANT& newValue); VARIANT GetInput(); //一个非常重要的函数,用于读串口,注意其返回的是VARIANT 类型对象,我们需要 //将其转化为字符串 void SetCommEvent(short nNewValue); short GetCommEvent(); //一个非常重要的函数,获得串口上刚发生的事件("事件"可以理解为软件意义上的 //"消息"或硬件意义上的"中断"),事件的发送会导致OnComm 消息的诞生! 基本上,MSComm 的诸多接口可以分为如下几类: (1)打开与设置串口接口函数; (2)获得串口设置和串口状态接口函数; (3)设置串口发送数据方式、缓冲区接口及发送数据接口函数; (4)设置串口接收数据方式、缓冲区接口及接收数据接口函数; (5)设置与获取串口上发生的事件接口函数。 属性 设定值 属性说明 CommPort 1 串口号,一般从1 到4 InBufferSize 30720 接收缓冲区大小,为保持程序的稳定,建议设得值足够大 InputMode 0-Text 接收数据的类型,0 表示文本类型,1 表示二进制类型 InputLen 0 从接收缓冲区读取的字节数,0 表示全部读取 OutBufferSize 512 发送缓冲区大小 Settings 4800,n,8,1 串口的参数设置,依次为波特率、奇偶校验(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数 RThreshold 1 设定当接收几个字符时触发OnComm 事件,0 表示不产生事件, 1 表示每接收一个字符就产生一个事件 SThreshold 0 设定在触发OnComm 事件前,发送缓冲区内所允许的最少的字符数, 0 表示发送数据时不产生事件,1 表示当发送缓冲区空时产生OnComm 事件 我们要求能在程序启动的同时就打开串口以便即时对从串口到达的数据进行接收、处理。一般来说可以将下面的打开端口的代码写在OnCreate()、OnInitialUpdate()、InitInstance ()等程序入口函数中: …… if(!m_Comm.GetPortOpen()) //检测是否已经打开过端口 m_Comm.SetPortOpen(TRUE); //如没有打开则将端口打开 …… 串口基于控件编程: 1、将ActiveX 控件MSComm添加入工程。单击主菜单project 的子菜单Add To project 的Components and Controls 选项,在弹出的"Components and Controls Gallery"对话框中选择Registered ActiveX Controls 文件夹中的"Microsoft Communications Control,version 6.0"选项 2、初始化函数中设置端口号,输入输出缓冲区的大小,打开串口,设置输入模式,波特率等参数 m_mscom.SetCommPort(1);//串口1 m_mscom.SetInBufferSize(1024);//设置输入缓冲区的大小 m_mscom.SetOutBufferSize(512);//设置输出缓冲区的大小,Bytes if (!m_mscom.GetPortOpen()) { m_mscom.SetPortOpen(TRUE); } m_mscom.SetInputMode(1);//设置输入模式为二进制方式 m_mscom.SetSettings("9600,n,8,1");//设置波特率等参数 m_mscom.SetRThreshold(1);//为1表示有一个字符即引发事件 m_mscom.SetInputLen(0);// 3、为控件添加成员变量,m_mscom,其对应的变量类型为CMSComm,为了处理接收事件,我们需要为MScomm 控件添加对应的消息处理函数。如下图,我们通过"MFC 类向导"添加了CSerialPortActivexDlg 类的成员函数OnCommMscomm1(): 文件的读写 CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型 如下: CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, D dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); 参数意义如下: bOpenFileDialog 为TRUE 则显示打开对话框,为FALSE 则显示保存对话文件对话框。 lpszDefExt 指定默认的文件扩展名。 lpszFileName 指定默认的文件名。 dwFlags 指明一些特定风格。 lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如: "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用| 分隔,同种类型文件的扩展名间可以用; 分割,每 种文件类型间用| 分隔,末尾用|| 指明。 pParentWnd 为父窗口指针。 创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择: CString CFileDialog::GetPathName( ) 得到完整的文件名, 包括目录名和扩展名如:c:\test\test1.txt CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1 POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。 CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置, 并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION 变量。 CColorDialog 颜色选择对话框的使用:首先通过CColorDialog::CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL )构造一个对象,其中clrInit 为初始颜色。通过调用DoModal() 创建对话框, 在返回后调用COLORREF CColorDialog::GetColor( )得到用户选择的颜色值。 CFontDialog 字体选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFontDialog::CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL);构造一个对象,其中参数lplfInitial 指向一个LOGFONG 结构(该结构介绍请见2.2 在窗口中输出文字),如果该参数设置为NULL 表示不设置初始字体。pdcPrinter 指向一个代表打印机设备环境的DC 对象,若设置该参数则选择的字体就为打印机所用。pParentWnd 用于指定父窗口。通过调用DoModal()创建对话框,在返回后通过调用以下函数来得到用户选择: void CFontDialog::GetCurrentFont( LPLOGFONT lplf );用来获得所选字体的属性。该函数有一个参数,该参数是指向LOGFONT 结构的指针,函数将所选字体的各种属性写入这个LOGFONT 结构中。 CString CFontDialog::GetFaceName( ) 得到所选字体名字。 int CFontDialog::GetSize( ) 得到所选字体的尺寸(以10 个象素为单位)。 COLORREF CFontDialog::GetColor( ) 得到所选字体的颜色。 BOOL CFontDialog::IsStrikeOut( ) BOOL CFontDialog::IsUnderline( ) BOOL CFontDialog::IsBold( ) BOOL CFontDialog::IsItalic( ) 得到所选字体的其他属性,是否有删除线,是否有下划线,是否为粗体,是否为斜体 文件的保存 CFileDialog dlgFilesave(FALSE,_T("txt"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.txt|*.txt"),NULL); if(dlgFilesave.DoModal()==IDOK) { FILE *file; CString BUF; BUF=dlgFilesave.GetPathName(); file = fopen(BUF,"w"); fprintf(file,"%s",m_value); fclose(file); 文件的打开 CFileDialog dlgFileOpen(TRUE,_T("txt"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T(" *.txt|*.txt|All Files (*.*)|*.*||"),NULL); if(dlgFileOpen.DoModal()==IDOK) { FILE *fp; CString bb; m_value=""; char buf[100]; bb=dlgFileOpen.GetFileName(); fp = fopen(bb,"r"); while(!feof(fp)) { fscanf(fp,"%s",buf); m_value=m_value+buf; m_value+="\r\n"; } UpdateData(FALSE); fclose(fp); } WINDOWS程序设计中最常用的一些消息: 1 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE 我们创建一个窗口对象的时候,这个窗口对象在创建过程中收到的就是WM_CREATE消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作,如设置窗口的大小,背景颜色等,WM_DESTROY消息指示窗口即将要被撤消,在这个消息处理过程中,我们就可以做窗口撤消前的一些工作。WM_CLOSE wm_close消息发生在窗口将要被关闭之前,在收到这个消息后,一般性的操作是回收所有分配给这个窗口的各种资源。在windows系统中资源是很有限的,所以回收资源的工作还是非常重要的。 2 键盘消息:WM_CHAR,WM_KEYDOWN,WM_KEYUP 这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生WM_KEYDOWN消息,释放按键的时候又会产生WM_KEYUP消息,所以WM_KEYDOWN与WM_KEYUP消息一般总是成对出现的,至于WM_CHAR消息是在用户的键盘输入能产生有效的ASCII码时才会发生。这里特别提醒要注意前两个消息与WM_CHAR消息在使用上是有区别的。在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。而伴随WM_CHAR消息的参数是所按的键的ASCII码,ASCII码是可以区分字母的大小写的。而虚拟键码是不能区分大小写的。 3 鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBCLICK,WM_RBUTTONDOWN, WM_RBUTTONUP,WM_RBUTTONDBCLICK 这组消息是与鼠标输入相关的,WM_MOUSEMOVE消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左右键的按下、释放、双击事件,要指出的是WINDOWS系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE消息,这一点要特别注意。 4 另一组窗口消息:WM_MOVE , WM_SIZE , WM_PAINT 当窗口移动的时候产生WM_MOVE 消息,窗口的大小改变的时候产生WM_SIZE消息,而当窗口工作区中的内容需要重画的时候就会产生WM_PAINT消息。 5 焦点消息WM_SETFOCUS,WM_KILLFOCUS 当一个窗口从非活动状态变为具有输入焦点的活动状态的时候,它就会收到WM_SETFOCUS消息,而当窗口失去输入焦点的时候它就会收到WM_KILLFOCUS消息。 6 定时器消息:WM_TIMER 当我们为一个窗口设置了定时器资源之后,系统就会按规定的时间间隔向窗口发送WM_TIMER消息,在这个消息中就可以处理一些需要定期处理的事情。 最后要指出的一点是,在WINDOWS环境下,消息的来源是多方面的,最常见的是用户的操作产生消息,系统在必要的时候也会向程序发送系统消息,其他在运行中的程序也可以向程序发送消息。此外,在程序的内部,也可以根据需要在适当的时候主动产生消息,比如主动产生WM_PAINT消息以实现需要的重画功能。 消息映射 例如对于消息WM_LBUTTONDOWN 在宏BEGIN_MESSAGE_MAP()与END_MESSAGE_MAP()之间进行消息映射。 宏ON_WM_LBUTTONDOWN() 把消息WM_LBUTTONDOWN 与它的响应函数OnLButtonDown()相关联。这样一旦有消息的产生,就会自动调用相关联的消息响应函数 去处理。 各种DC 的获取 1,使用SDK 获取DC 句柄: HDC hdc; hdc=::GetDc(m_hWnd);//获取DC 句柄 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); LineTo(hdc,point.x,point.y); ::ReleaseDC(m_hWnd,hdc);//释放DC 2,利用CDC 类指针和CWin 类成员函数获取DC。 CDC *pDC=GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); 3,利用CClientDC 对象。(CClientDC 类从CDC 类派生来的) CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); 4,利用CWindowDC 对象。(CWindowDC 类从CDC 类派生来的) CWindowDC dc(this);// dc.MoveTo(m_ptOrigin); dc.LineTo(point); 5,父窗口(MainFrame 框架)和屏幕指针。 将上面的dc(this)分别改成GetParent()和GetDesktopWindow(),就可以得到父窗口指针和屏 幕窗口指针。 绘图 利用画笔改变线条颜色和类型: CPen pen(PS_DOT,1,RGB(0,255,0));//构造画笔对象 CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);//将画笔选入DC dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.SelectObject(pOldPen);//恢复先前的画笔 使用画刷(通常利用画刷去填充矩形区域): 使用单色画刷 CBrush brush(RGB(255,0,0));//构造画刷对象 CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的画刷去填充矩形区域使用 位图画刷 CBitmap bitmap;//构造位图对象(使用前需要初试化) bitmap.LoadBitmap(IDB_ BITMAP1);//初试化位图对象 CBrush brush(&bitmap);//构造位图画刷 CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的位图画刷去填充矩形区域 使用透明画刷 CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));// 获取透明画刷对象指针 CClientDC dc(this); CBrush *pOldBrush=dc.SelectObject(pBrush);//将透明画刷选入DC dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBrush);//释放透明画刷 菜单指针的获取,及相关设置 在CMainFrame::OnCreate 下可以直接实验以下操作 几个相关和重要的函数 CMenu* GetMenu( ) ;//CWnd::GetMenu 得到窗口菜单栏对象指针。 CMenu* GetSubMenu( ) ;//CMenu::GetSubMenu 获得指向弹出菜单对象指针 UINT CheckMenuItem( );//CMenu::CheckMenuItem Adds check marks to or removes checkmarks from menu items in the pop-up menu. BOOL SetDefaultItem();//CMenu::SetDefaultItem Sets the default menu item for the specifiedmenu. BOOL SetMenuItemBitmaps( );//CMenu::SetMenuItemBitmaps 设置位图标题菜单。 UINT EnableMenuItem();//CMenu::EnableMenuItem 使菜单项有效,无效,或变灰。 BOOL SetMenu( CMenu* pMenu );//CWnd::SetMenu 在当前窗口上设置新菜单或移除菜单。 HMENU Detach( );//CMenu::Detach Detaches a Windows menu from a CMenu object and returnsthe handle. 获取菜单的宽和高: GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK) 例子: 1, 给菜单项打上标记 GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED); GetMenu()->GetSubMenu(0)- >CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND | MF_CHECKED); 2, 设置缺省菜单项 GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE); GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN); 3, 图形标记菜单 先创建图形,注意底色不要是白色 m_bitmap.LoadBitmap(IDB_ BITMAP1); GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap); 4, 屏蔽菜单,使之不能用 (需要在CMainFrame::CMainFrame()中设置m_bAutoMenuEnable=FALSE;) GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION| MF_DISABLED |MF_GRAYED); 5, 取消和加载菜单 用此功能,可以动态的修改菜单 SetMenu(NULL);//取消菜单项 CMenu menu; menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu); menu.Detach();//菜单句柄和对象断开,使对象析构时不销毁菜单 控件 1、动态编辑static 静态文本框 CString str; if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:") GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:"); else GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:"); 要让static 静态文本框响应消息,需要复选上notify 选项 2、Edit 文本框 获取/设置文本内容 1)方法1 char ch[10]; GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10); GetDlgItem(IDC_EDIT3)->SetWindowText(itoa(atoi(ch1),ch1,10)); 2)方法2 GetDlgItemText(IDC_EDIT1,ch1,10); SetDlgItemText(IDC_EDIT3,itoa(atoi(ch1),ch1,10)); 方法3 SetDlgItemInt(IDC_EDIT3,GetDlgItemInt(IDC_EDIT1));//对整型数字的字符串有用 4)关联变量法 对每个Edit 控件关联一个变量,设置后记得用UpdateData() 对于显示数字类的文本框,可以定义value 和control 两种类型变量 清除Edit区中的内容: m_edit.SetSel(0,-1,TRUE); // m_edit.Clear (); m_edit.ReplaceSel(""); m_edit.SetSel(0); 在::OnInitDialog()里面进行控件的初始化 //初始化列表框 CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST); pListB->AddString("item 1"); pListB->AddString("item 2"); pListB->AddString("item 3"); //初始化组合框 CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST); pCB->AddString("item 1"); pCB->AddString("item 2"); pCB->AddString("item 3"); //初始化Tab Ctrl CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST); pTab->InsertItem(0,"TabPage1"); pTab->InsertItem(1,"TabPage2"); pTab->InsertItem(2,"TabPage3"); //初始化ListCtrl CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL); pList->InsertColumn(0,"Column 1",LVCFMT_LEFT,100); pList->InsertItem(0,"Item1"); pList->InsertItem(1,"Item2"); pList->InsertItem(2,"Item3"); //初始化TreeCtrl CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST); pTree> InsertItem("Node1",0,0); HTREEITEMhNode=pTree> InsertItem("Node2",0,0); pTree> InsertItem("Node21", 0,0,hNode); pTree> InsertItem("Node22", 0,0,hNode); pTree> Expand(hNode,TVE_EXPAND); CByteArray类 类CByteArray支持以字节为单位动态建立数组。 在使用数组之前,要调用SetSize设置它的大小并分配内存。如果没有使用SetSize,在数组中增加元素会引起数组内存空间频繁的重新分配以及数据拷贝。内存频繁的重新分配和数据拷贝会影响性能并造成内存碎片。 CByteArray类的成员 构造函数 CByteArray 构造一个空的字节数组 边界 GetSize 取数组中元素的个数(数组大小) GetUpperBound 返回数组的最大有效下标 SetSize 设置数组元素的个数(数组大小) 操作 FreeExtra 释放数组中当前已有数据的最大上界后所有未占用的内存 RemoveAll 删除数组中所有的元素 元素存取 GetAt 返回指定下标处的数组元素的值 SetAt 给数组中指定下标的元素赋值,但不能动态增长数组(指定的下标不能越界) ElementAt 返回对数组中某个字节的临时参考 GetData 允许访问数组中的元素。可以为NULL 数组增长 SetAtGrow 给数组中指定下标的元素赋值,在下标越界时动态增长数组 Add 在数组末尾增添一个元素,必要时增长数组 Append 在数组末尾接上另一个数组,必要时增长数组 Copy 把另一个数组的内容拷贝到本数组,必要时增长数组 插入/删除 InsertAt 在指定的下标处插入元素(或另外一个数组的内容) RemoveAt 删除指定下标处的一个元素 操作符 operator [] 取指定下标处元素的值,或者给其赋值 MFC 中常用类、宏、函数介绍 常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right。分别表是左上角和右 下角的坐标。可以通过以下的方法构造。 ● CRect( int l, int t, int r, int b ); 指明四个坐标 ● CRect( const RECT& srcRect ); 由RECT 结构构造 ● CRect( LPCRECT lpSrcRect ); 由RECT 结构构造 ● CRect( POINT point, SIZE size ); 有左上角坐标和尺寸构造 ● CRect( POINT topLeft, POINT bottomRight ); 有两点坐标构造 下面介绍几个成员函数: ● int Width( ) const; 得到宽度 ● int Height( ) const; 得到高度 ● CSize Size( ) const; 得到尺寸 ● CPoint& TopLeft( ); 得到左上角坐标 ● CPoint& BottomRight( ); 得到右下角坐标 ● CPoint CenterPoint( ) const; 得当中心坐标 此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。 ● CPoint:用来表示一个点的坐标,有两个成员变量:x y。可以和另一个点相加。 ● CString:用来表示可变长度的字符串。使用CString 可不指明内存大小,CString 会根据需要自行分配。下面介绍几个成员函数: ● GetLength 得到字符串长度 ● GetAt 得到指定位置处的字符 ● operator + 相当于strcat ● void Format( LPCTSTR lpszFormat, ... ); 相当于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(); ● HINSTANCE AfxGetInstanceHandle( ) ● HINSTANCE AfxGetResourceHandle( ) ● int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );用于弹出一个消息框 画笔和画刷 OnDraw(CDC* pDC) { CPen pen1,pen2; pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建对象 pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建对象 CPen* pPenOld=(CPen*)pDC> SelectObject(&pen1);//选择对象进DC drawWithPen1... (CPen*)pDC> SelectObject(&pen2);//选择对象进DC drawWithPen2... pen1.DeleteObject();//再次创建前先销毁 pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象 (CPen*)pDC> SelectObject(&pen1);//选择对象进DC drawWithPen1... pDC> SelectObject(pOldPen);//恢复 } 此外系统中还拥有一些库存GUI 对象,你可以利用 CDC::SelectStockObject(SelectStockObject( int nIndex ) 选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体. 使用点、刷子、笔进行绘图 在Windows 中画点的方法很简单, 只需要调用COLORREF CDC::SetPixel( int x, int y,COLORREF crColor )就可以在指定点画上指定颜色,同时返回原来的颜色。COLORREF CDC::GetPixel( int x, int y)可以得到指定点的颜色。在Windows 中应该少使用画点的函数,因为这样做的执行效率比较低。 在画点或画线时系统使用当前DC 中的画笔,所以在创建画笔后必须将其选入DC 才会在绘图时产生效果。画笔可以通过CPen 对象来产生,通过调用CPen::CreatePen( int nPenStyle, int nWidth, COLORREF crColor )来创建。其中nPenStyle 指名画笔的风格,可取如下值: ● PS_SOLID 实线Creates a solid pen. ● PS_DASH 虚线,宽度必须为一Creates a dashed pen. Valid only when the pen width is 1 or less, in device units. ● PS_DOT 点线,宽度必须为一Creates a dotted pen. Valid only when the pen width is 1 or less, in device units. ● PS_DASHDOT 点划线,宽度必须为一Creates a pen with alternating dashes and dots. Valid only when the pen width is 1 or less, in device units. ● PS_DASHDOTDOT 双点划线,宽度必须为一Creates a pen with alternating dashes and double dots. Valid only when the pen width is 1 or less, in device units. ● PS_NULL 空线,使用时什么也不会产生Creates a null pen. ● PS_ENDCAP_ROUND 结束处为圆形End caps are round. ● PS_ENDCAP_SQUARE 结束处为方形End caps are square. nWidth 和crColor 为线的宽度和颜色。 刷子是在画封闭曲线时用来填充的颜色,例如当你画圆形或方形时系统会用当前的刷子对内 部进行填充。刷子可利用CBrush 对象产生。通过以下几种函数创建刷子: ● BOOL CreateSolidBrush( COLORREF crColor ); 创建一种固定颜色的刷子 ● BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); 创建指定颜色和网格的刷子, 基本的画线函数有以下几种 ● CDC::MoveTo( int x, int y ); 改变当前点的位置 ● CDC::LineTo( int x, int y ); 画一条由当前点到参数指定点的线 ● CDC::BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 画弧线 ● CDC::BOOL Polyline( LPPOINT lpPoints, int nCount ); 将多条线依次序连接 基本的作图函数有以下几种: ● CDC::BOOL Rectangle( LPCRECT lpRect ); 矩形 ● CDC::RoundRect( LPCRECT lpRect, POINT point ); 圆角矩形 ● CDC::Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight ); 3D 边框 ● CDC::Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 扇形 ● CDC::Ellipse( LPCRECT lpRect ); 椭圆形 ● CDC::Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); ● CDC::Polygon( LPPOINT lpPoints, int nCount ); 多边形 对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,你可以选入空刷子(NULL_PEN)或是(NULL_BRUSH)空笔。 下面的代码创建一条两象素宽的实线并选入DC。并进行简单的作图: { ... CPen pen; pen.CreatePen(PS_SOLID,2,RGB(128,128,128)); CPen* pOldPen=(CPen*)dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH);//选入空刷子 dc.Rectangle(CRect(0,0,20,20));//画矩形 ... } 输出文字 一般使用CDC::BOOL TextOut( int x, int y, const CString& str )和CDC::int DrawText( const CString& str, LPRECT lpRect, UINT nFormat )两个函数,对TextOut 来讲只能输出单行的文字,而DrawText 可以指定在一个矩形中输出单行或多行文字,并且可以规定对齐方式和使用何种风格。nFormat 可以是多种标记的组合(利用位或操作)以达到选择输出风格的目的。 在输出文字时如果希望改变文字的颜色,你可以利用CDC::SetTextColor( COLORREF crColor )进行设置,如果你希望改变背景色就利用CDC::SetBkColor( COLORREF crColor ),很多时候你可能需要透明的背景色你可以利用CDC::SetBkMode( int nBkMode )设置 文本坐标的计算 利用CDC::GetTextExtent( const CString& str )可以得到字符 串的在输出时所占用的宽度和高度,这样就可以在手工输出多行文字时使用正确的行距。另外如果需要更精确的对字体高度和宽度进行计算就需要使用CDC::GetTextMetrics( LPTEXTMETRIC lpMetrics ) 该函数将会填充TEXTMETRIC结构,该结构中的分量可以非常精确的描述字体的各种属性。 使用各种映射方式 所谓的映射方式简单点讲就是坐标的安排方式,系统默认的映射方式为MM_TEXT 即X 坐标向右增加,Y 坐标向下增加,(0,0)在屏幕左上方,DC 中的每一点就是屏幕上的一个象素。也许你会认为这种方式下是最好理解的,但是一个点和象素对应的关系在屏幕上看来是正常的,但到了打印机上就会很不正常。因为我们作图是以点为单位并且打印机的分辨率远远比显示器高(800DPI 800 点每英寸)所以在打印机上图形看起来就会很小。这样就需要为打印另做一套代码而加大了工作量。如果每个点对应0.1 毫米那么在屏幕上的图形就会和打印出来的图形一样大小。通过int CDC::SetMapMode( int nMapMode )可以指定映射方式,可用的有以下几种: · MM_HIENGLISH 每点对应0.001 英寸 ● MM_HIMETRIC 每点对应0.001 毫米 ● MM_LOENGLISH 每点对应0.01 英寸 ● MM_LOMETRIC 每点对应0.001 毫米 ● MM_TEXT 象素对应 另外的一种映射方式为MM_ANISOTROPIC,这种方式可以规定不同的长宽比例。在设置这中映射方式后必须调用CSize CDC::SetWindowExt( SIZE size ) 和CSize CDC::SetViewportExt( SIZE size )来设定长宽比例。系统会根据两次设定的长宽的比值来确定长宽比例。下面给出一段代码比较映射前后的长宽比例: OnDraw(CDC* pDC) { CRect rcC1(200,0,400,200); pDC> FillSolidRect(rcC1,RGB(0,0,255)); pDC> SetMapMode(MM_ANISOTROPIC ); CSize sizeO; sizeO=pDC> SetWindowExt(5,5); TRACE("winExt %d %d\n",sizeO.cx,sizeO.cy); sizeO=pDC> SetViewportExt(5,10); TRACE("ViewExt %d %d\n",sizeO.cx,sizeO.cy); CRect rcC(0,0,200,200); pDC> FillSolidRect(rcC,RGB(0,128,0)); } 上面代码在映射后画出的图形将是一个长方形。 你可以通过调用CPoint CDC::SetViewportOrg( POINT point )重新设置原点的位置,这就相对于对坐标进行了位移。例如你将原点设置在(20,20),那么原来的(0,0)就变成了(-20,-20) 得到各种对象的指针: ● 全局函数AfxGetApp 可以得到CWinApp 应用类指针 ● AfxGetApp()>m_pMainWnd 为框架窗
/
本文档为【vc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索