2022年VC编程技巧 .pdf
MFC 技巧 90例-总结篇 (三) 2007-03-07 14:00 21. 介绍函数过程中一种任意键退出同时能处理消息的实现方法1. 设置定时器 ,用于使 :GetMessage(.) 函数总能快速取到消息. 2. 在函数处理中加入: 函数每执行完一步后执行下面的代码. if (:GetMessage(&msg, 0, 0, 0) if (msg.message = WM_KEYFIRST & msg.message GetDescendantWindow(AFX_IDW_TOOLBAR); pToolBar-SetWindowText (_T(Standdard); 不要在 TooBar 悬浮时做OnMyToolBar() 会出错的 . 顺便提一下如何获得状态条的指针: CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_STATUS_BAR); 24. 在状态条中显示鼠标的设备坐标与逻辑坐标显示器的设备坐标系的原点在客户区的左上角,x 轴向右增长, y 轴向下增长。我们要设置的逻辑坐标系的原点则在客户区的中心,x 轴向右增长,y 轴向上增长,如一个笛卡尔坐标系一般。为 CChildView添加一个成员函数void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo = NULL); void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo) CRect rect; / 设置映射模式为LOMETRIC (0.1mm),右上为增长方向pDC-SetMapMode (MM_LOMETRIC); / 将坐标原点定在客户区的中心GetClientRect(rect); pDC-SetViewportOrg(rect.Width()/2, rect.Height()/2); 为 CChildView响应鼠标移动消息,并在状态条中显示鼠标的坐标值。m_ptMouse 数据成员是原打算做十字交叉线用的,在此使用没有实际意义。void CChildView:OnMouseMove(UINT nFlags, CPoint point) CClientDC dc(this); CString str; OnPrepareDC(&dc); /要访问类CMainFrame ,需要将mainfrm.h 文件引入名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 30 页 - - - - - - - - - CMainFrame * pFrame = (CMainFrame *) AfxGetApp()-m_pMainWnd; /要访问CMainFrame 的数据成员m_wndStatusBar ,需要手工修改mainfrm.h ,public 这个数据成员CStatusBar * pStatus = (CStatusBar *) &pFrame-m_wndStatusBar; m_ptMouse = point; str.Format ( 设备坐标X=%i pixel, Y=%i pixel, m_ptMouse.x, m_ptMouse.y); pStatus-SetPaneText(1, str); dc.DPtoLP(&m_ptMouse); str.Format ( 逻辑坐标X=%i * 0.1mm, Y=%i * 0.1mm, m_ptMouse.x, m_ptMouse.y); pStatus-SetPaneText(2, str); 25. 如何用 VC+ 动态修改应用程序菜单 问题提出 本文将介绍一些使用CMenu 的方法 ,如查找指定菜单,在指定选项前添加菜单项. 解决方法 使用 CWnd:GetMenu( ) 访问主菜单, GetMenu( ) 返回指向CMenu 对象的指针,它有一些成员函数,允许我们修改一个菜单。1) 如何实现找到一个菜单项: 步骤如下 : /动态修改菜单: / Get the Main Menu CMenu* pMainMenu = AfxGetMainWnd()-GetMenu(); CMenu* pSubMenu = NULL; int i; for (i=0; iGetMenuItemCount(); i+) pSubMenu = pMainMenu-GetSubMenu(i); if (pSubMenu & pSubMenu-GetMenuItemID(0) = ID_FILE_NEW) break; CString s; s.Format(%d,i);/菜单项的位数 . AfxMessageBox(s); ASSERT(pSubMenu); 2) 动态编辑菜单 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 30 页 - - - - - - - - - 步骤如下 (可以用上例的pSubMenu, 要加的菜单你自己定义.): 1) 添加一个称为Wzd2,命令 ID 为 IDC_NAME_NEW1的菜单命令到该菜单中,可以用: pSubMenu-AppendMenu(0,IDC_NAME_NEW1,New&1); 2) 在 New1 前插入 New2 ,可以用 : pSubMenu-InsertMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW2, New&2); 3) 把 New1 改变成 New3 ,可以用 : pSubMenu-ModifyMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW3, New&3); 4) 删除该菜单中第二项,可以用: pSubMenu-RemoveMenu(1,MF_BYPOSITION); 26. VC+ 中的 3D 按钮的编程运行 AppWizard 生成一个基于对话框的test 工程, 在对话框中加入一个CButton 控件。 在 CButton控件的 General 属性页将控件的ID 改为 IDC_3DTEXTBTN, Caption 改为 “ 谁与争疯 ” , 在控件 Styles属性页选中OwnerDraw ,其余设置保持默认。用 classwizard 创建一个新类:C3dTextButton ,基类为 CButton 。为 C3dTextButton 类添加一个protected 的函数 void Draw(CDC* pDC, const CRect& rect, UINT state)。如下所示编写代码:void C3dTextButton:Draw(CDC *pDC, const CRect &rect, UINT state) CString text; GetWindowText(text); int l=text.GetLength(); CRect rectClient=rect; /获得控件的字体CFont* pFont=GetFont(); /确定所选字体有效高度和宽度LOGFONT logfont; pFont-GetObject(sizeof(LOGFONT),&logfont); if(logfont.lfHeight=0)logfont.lfHeight=20; logfont.lfWidth=0;/宽度设为 0,宽度值由高度确定logfont.lfWeight=1000; logfont.lfEscapement=logfont.lfOrientation=0; CFont tryfont; VERIFY(tryfont.CreateFontIndirect(&logfont); CFont* pFontOld=pDC-SelectObject(&tryfont); /根据控件大小,调整字体的高度,使文本与控件协调CSize textSizeClient=pDC-GetTextExtent(text,l); if(rectClient.Width()*textSizeClient.cyrectClient.Height()*textSizeClient.cx) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 30 页 - - - - - - - - - logfont.lfHeight=:MulDiv(logfont.lfHeight,rectClient.Height(),textSizeClient.cy); else logfont.lfHeight = :MulDiv(logfont.lfHeight,rectClient.Width(),textSizeClient.cx); /创建并选择协调后的字体CFont font; font.CreateFontIndirect(&logfont); pDC-SelectObject(&font); textSizeClient=pDC-GetTextExtent(text,l); /确定文本与控件边界的距离minx,miny int minx=rectClient.left+(rectClient.Width()-textSizeClient.cx)/2; int miny=rectClient.top+(rectClient.Height()-textSizeClient.cy)/2; int oldBkMode=pDC-SetBkMode(TRANSPARENT); COLORREF textcol=:GetSysColor(COLOR_BTNTEXT); COLORREF oldTextColor=pDC-SetTextColor(textcol); int cx = minx; int cy = miny; int s=(state&ODS_SELECTED)?-1:+1; cx+= 3; cy+= 3; /实现 3D 效果pDC-SetTextColor(:GetSysColor(COLOR_3DDKSHADOW); pDC-TextOut(cx-s*2,cy+s*2,text); pDC-TextOut(cx+s*2,cy-s*2,text); pDC-TextOut(cx+s*2,cy+s*2,text); pDC-SetTextColor(:GetSysColor(COLOR_3DHILIGHT); pDC-TextOut(cx+s*1,cy-s*2,text); pDC-TextOut(cx-s*2,cy+s*1,text); pDC-TextOut(cx-s*2,cy-s*2,text); pDC-SetTextColor(:GetSysColor(COLOR_3DSHADOW); pDC-TextOut(cx-s*1,cy+s*1,text); pDC-TextOut(cx+s*1,cy-s*1,text); pDC-TextOut(cx+s*1,cy+s*1,text); pDC-SetTextColor(:GetSysColor(COLOR_3DLIGHT); pDC-TextOut(cx,cy-s*1,text); pDC-TextOut(cx-s*1,cy,text); pDC-TextOut(cx-s*1,cy-s*1,text); pDC-SetTextColor(textcol); /输出标题pDC-TextOut(cx,cy,text); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 30 页 - - - - - - - - - /恢复设备描述表pDC-SetTextColor(oldTextColor); pDC-SetBkMode(oldBkMode); pDC-SelectObject(pFontOld); 用 classwizard 重载 C3dTextButton 类的 DrawItem 函数。编写代码如下所示:void C3dTextButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) CDC* pDC=CDC:FromHandle(lpDrawItemStruct-hDC); ASSERT_V ALID(pDC); CRect rectClient=lpDrawItemStruct-rcItem; Draw(pDC,rectClient,lpDrawItemStruct-itemState); 用 classwizard 为 IDC_3DTEXTBTN建立一个 C3dTextButton 控件变量m_3dTextButton1 。把“3dTextButton.h ”加入 testDlg 头文件。编译并测试应用程序。27. 如何正确的得到ComBox 的指针CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CComboBox*):GetDlgItem(m_hWnd,IDC_DuanCB); 28. 如何让对话框中的CEdit 控件类接收对话框的消息/ / 如何让对话框中的CEdit 控件类接收对话框的消息/ 1、在对话框中增加一个ID 为 IDC_EDIT1 的 CEdit1 控件2、通过 ClassWizard 生成一个基于CEdit 的新类 CMyEdit, CMyEditm_wndEdit; 3、在对话框OnInitDialog() 中,将 m_wndEdit 子类化,使其能够接受对话框的消息。m_wndEdit.SubclassDlgItem (IDC_EDIT1,this); 29.利用 WM_CTLCOLOR消息实现编辑控制(Edit Control )的文本与背景色的改变首先要明白:WM_CTLCOLOR是一个由控制(Control) 发送给它父窗口的通知消息(Notification message)。实现步骤:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 30 页 - - - - - - - - - 生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About 对话框做示范。在About dialog 中添加两个Edit control, 设定其 ID 为 IDC_EDIT1 与 IDC_EDIT2 。第一种方法 (对应于IDC_EDIT1): 按照标准的Windows 编程,由其父窗口的消息处理函数负责处理 WM_CTLCOLOR消息。1. 在 CAboutDlg中添加一个数据成员:HBRUSH m_brMine; 2. 利 用 向 导 映 射AboutDlg的WM_CTLCOLOR消 息 , 产 生 函 数 : HBRUSH CAboutDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);pDC 是 AboutDlg的设备上下文,pWnd 是 AboutDlg中发送该消息的control 指针, nCtlColor 市Control 的类型编码。对其进行如下修改:HBRUSH CAboutDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) if (pWnd-GetDlgCtrlID() = IDC_EDIT1) & (nCtlColor = CTLCOLOR_EDIT) COLORREF clr = RGB(255,0,0); pDC-SetTextColor(clr);/设置红色的文本clr = RGB(0,0,0); pDC-SetBkColor(clr);/设置黑色的背景m_brMine = :CreateSolidBrush(clr); return m_brMine;/作为约定,返回背景色对应的刷子句柄 else HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); return hbr; 第二种方法 (对应于 IDC_EDIT2): 利用 MFC 4.0 的新特性 : Message reflection 。1.利用向导添加一个新的类:CColorEdit ,基类为CEdit; 2.在 CColorEdit 中添加一个数据成员: HBRUSH m_bkBrush; 3.利用向导映射CColorEdit的=WM_CTLCOLOR消息,产生函数:HBRUSH CColorEdit:CtlColor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:HBRUSH CColorEdit:CtlColor(CDC* pDC, UINT nCtlColor) COLORREF clr = RGB(0,0,0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 30 页 - - - - - - - - - pDC-SetTextColor(clr);/设置黑色的文本clr = RGB(255,0,0); pDC-SetBkColor(clr);/设置红色的背景m_bkBrush = :CreateSolidBrush(clr); return m_bkBrush;/作为约定,返回背景色对应的刷子句柄 4.利用向导为IDC_EDIT2 生成一个数据成员CColorEdit m_coloredit; 5.在定义 CAboutDlg的 color.cpp 文件中加入:#include coloredit.h 30. 如何防止密码被非法获取? 问题提出 这两天大家比较专注在获取Edit 密码框的密码.在盗取时 ,我们如何防范呢? 解决方法 此方法针对于通过SendMessage 向此窗口发送WM_GETTEXT或 EM_GETLINE消息来取得密码 .跟我来 . 程序实现 方法很简单 ,用 CWnd:DefWindowProc函数拦截得到的消息(向 Edit 发的 ). 建 立 名 为My的 对 话 框 工 程 . 建 立 一 个Edit控 件ID=IDC_EDIT1.建 一 个 新 类 名 为CMyProtectEdit, 派生于 CEdit. 在 MyDlg.cpp中声明全局变量:BOOL g_bIdentity; BOOL g_bIdentity; 在 MyProtecEdit.cpp中: extern BOOL g_bIdentity; 响应 CMyProtectEdit的 DefWindowProc函数 : LRESULT CMyProtectEdit:DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) / TODO: Add your specialized code here and/or call the base class / 对 Edit 的内容获取必须通过以下两个消息之一,不对其采用默认的处理: if( message = WM_GETTEXT) | ( message = EM_GETLINE) /检查是否为合法if(!g_bIdentity) /非法获取 ,显示非法信息AfxMessageBox(_T(不能让你看我的密码,:( !); return 0; ) g_bIdentity = FALSE;/合法获取 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 30 页 - - - - - - - - - return CEdit:DefWindowProc(message, wParam, lParam); 然后在 MyDlg.cpp中void CMyDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CGetPasswordDlg) / NOTE: the ClassWizard will add DDX and DDV calls here if( pDX-m_bSaveAndValidate) g_bIdentity = TRUE; /AFX_DATA_MAP MFC 技巧 90例-总结篇 (五) 2008-02-03 14:35 51. 如何获得其他程序的图标,并显示在 View 中 问题提出 有的时候 ,如:类资源管理器会遇到获得程序图标并显示的操作,如何实现呢 ? 解决方法 SDK 函数 SHGetFileInfo来获得有关文件的很多信息:如大小图标 ,属性 ,类型等 . 程序实现 建立名为My 的 SDI 工程 .在 OnPaint() 函数中加入 : void CMyView:OnPaint() CPaintDC dc(this); / device context for painting HICON hIcon=: ExtractIcon(AfxGetInstanceHandle(),_T(NotePad.exe),0); if (hIcon & hIcon!=(HICON)-1) dc.DrawIcon(10,10,hIcon); / TODO: Add your message handler code here / Do not call CView:OnPaint() for painting messages 说明 :_T(NotePad.exe) 指的是要获得什么程序的图标. 或者在 OnDraw() 中 (此时必须保证没有OnPaint() 函数 ,想想为何 ?) void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here HICON hIcon=: ExtractIcon(AfxGetInstanceHandle(),_T(NotePad.exe),0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 30 页 - - - - - - - - - if (hIcon &hIcon!=(HICON)-1) pDC-DrawIcon(10,10,hIcon); 52 .RichEdit 在 Dialog(FormView中打开 )中加入 CRichEdit 控件后 ,这个 dialog 为什么打不开如何处理? 解决方法 在函数: InitInstance 的第一句加入AfxInitRichEdit(); 53. 如何使 FormView 中显示 dialog 时,不是凹的 ? 问题提出 为什么 FormView 中显示 dialog 时 ,是凹的 ,能不能不这样 解决方法 在 Dialog 的属性中 : 增加属性WS_BORDER或者WS_EX_WINDOWEDGE 用程序实现 : pView-ModifyStyle(,WS_BORDER) 或者 pView-ModifyStyleEx(,WS_EX_WINDOWEDGE ) 54. 如何改变窗口标题? 问题提出 在应用程序的不同运行时期,要反映当前状态往往会修改应用程序标题. 解决方法 在 MFC 类库中提供了CWnd:SetWindowText函数 ,通过该函数可以改变任何窗体(包括控件 )的标题 . 改变主窗体的标题: CWnd *m_pMainWnd; m_pMainWnd=AfxGetMainWnd(); m_pMainWnd-SetWindowText(_T(改变标题 ); 当改变多视MDI 的子窗口的标题时,用: GetParentFrame()-SetWindowText(_T(MDI Child改变标题 ); 当改变按钮的标题时(假设按钮的ID=IDC_BUTTON1): GetDlgItem(IDC_BUTTON1)-SetWindowText(_T(Button 改变标题 ); 运行看看 . 55.图标透明(1).Windows 中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做“ AND ”操作,另一个作“XOR ”操作。透明:用 “ 白色 ”AND,用 “ 黑色 ”XO R 反色:用 “ 白色 ”AND,用 “ 白色 ”XOR正常色:用 “ 黑色 ”AND,用正常颜色XOR. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 30 页 - - - - - - - - - (2). WIN9X中好像是对像素的操作实现透明的WIN2K中就有 API 直接实现透明了!WIN2K中GetWindowLong SetWindowLong SetLayeredWindowAttributes 三个 API 就可以实现透明了!(3) :DrawIconEx(pDC-GetSafeHdc(),point.x,point.y,icon,icosize,icosize,0,NULL,DI_NORMAL); 56.ASSERT() 是干什么用的ASSERT() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n 在程序中不应该为0,如果为 0可能导致错误,你可以这样写程序:. ASSERT( n != 0); k = 10/ n; . ASSERT 只有在 Debug 版本中才有效,如果编译为Release版本则被忽略。assert()的功能类似,它是ANSI C 标准中规定的函数,它与ASSERT 的一个重要区别是可以用在 Release版本中。56. 将 RADIO 控件初始状态设置成为选中1、在 OnInitialDialog中用 CButton:CheckRadioButton(.) 2、在 OnInitialDialog中用 CButton:SetCheck(.) 3、关联一个整型值,在构造函数中设为0。57.获得视图CFrameWnd* pFrameWnd = (CFrameWnd*)theApp.GetMainWnd(); CMyView* pView = (CMyView*)pFrameWnd-GetActiveView(); 58如何得到屏幕的真实尺寸问题提出 我的屏幕是 1024*800, 如何得到屏幕的真实大小,我用GetSystemMetrics(SM_CYFULLSCREEN)得到的高度总是小于800 问题解答 GetSystemMetrics(SM_CYFULLSCREEN)得到的只是屏幕用户区的大小。要得到屏幕的真实大小需要使用GetDeviceCaps 函数 ,该 API 函数原型是这样的: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 30 页 - - - - - - - - - int GetDeviceCaps( HDC hdc,/ handle to DC int nIndex/ index of capability ); /得到屏幕尺寸的代码如下void CMyDlg:OnPaint() CPaintDC dc(this); int cx = :GetDeviceCaps(dc.m_hDC,HORZRES);/得到宽度int cy = :GetDeviceCaps(dc.m_hDC,VERTRES);/得到高度CDialog:OnPaint(); 59. 修改标题栏高度NONCLIENTMETRICS nm 调用 SystemParametersInfo (SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)重设 SystemParametersInfo (SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)60. 如何实现 “ 气球式 ” 工具提示。本程序介绍一个与CToolTipCtrl相似的类CTooolTipWnd 。使用该类的方法如下:1. 增加 ToolTipWnd.cpp到工程文件。2. 在头文件中添加#include ToolTipWnd.h 。3. 在类声明中添加:CToolTipWnd m_BalloonToolTip; 4. 在 OnInitDialog (对话框)或OnInitialUpdate (表单视)中添加下面代码:m_BalloonToolTip.Create(this); m_BalloonToolTip.AddTool(GetDlgItem(), , text color); eg. m_BalloonToolTip.AddTool(GetDlgItem(IDC_EDIT1),Tooltip, RGB(255,0,0); 第三个参数为可选,缺省为RGB(0, 0, 0) 。缺省文本颜色可以用SetDefTextColor 进行设置。4. 重载 PreTranslateMessage 并添加下面代码:if(m_BalloonToolTip)m_BalloonToolTip.RelayEvent(pMsg); 61. dlg 上建立 View 的方法:OnInitDialog() CDialog:;OnInitDialog(); CRect rectWindows; GetWinodwRect(&rectWindows); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 30 页 - - - - - - - - - CRuntimeClass *pViewClass=RUNTIME_CLASS(CXXXView); CCreateContext *pContext=new CCreateContext; pContext-m_pCurrentDoc=NULL; pContext-m_pCurrentFrame=NULL; pContext-m_pLastView=NULL; pContext-m_pNewDocTemplate=NULL; pContext-m_pNewViewClass=pViewClass; CWnd *pWnd=DYNAMIC_DOWNCAST(CWnd,pviewClass-CreateObject(); pWnd-Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0),this,pContext); delete pContext; CXXXView *pView=DYUNAMIC_DOWNCAST(CXXXView,pWnd); . 62. 窗口最大化、最小化及关闭的消息是什么?如何截获?最大化、最小化将发送WM_SYSCOMMAND消息。要处理该消息,可以这么做:1、在 Form 的头文件中添加:void _fastcall RestrictMinimizeMaximize(TMessage &Msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, RestrictMinimizeMaximize) END_MESSAGE_MAP(TForm) 2、在 Form 的单元文件中添加:void _fastcall TForm1:RestrictMinimizeMaximize(TMessage& Msg) if (Msg.WParam = SC_MINIMIZE) /catches minimize. else if (Msg.WParam = SC_MAXIMIZE) /catches maximize. TForm:Dispatch(&Msg); / or else TForm:Dispatch(&Msg) to trap 关闭窗口的消息为WM_CLOSE ,C+Builder提供了 OnClose 事件。63. 如何遍历整个目录树查找文件在应用程序的开发过程中,会遇到如何查找某一文件以确定此文件路径的问题。利用CFileFind名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 30 页 - - - - - - - - - 类可以比较方便地在当前目录下进行文件查找,但却不能对其子目录中的文件进行搜寻。而实际应用中往往需要对某一整个目录树,甚至是整个C 盘或 D 盘驱动器进行文件搜寻。通过实践,我们在 Visual C 6.0中编程实现了如何遍历任意目录树,以查找某一特定的文件。在下面的具体陈述中可以看到,在确定要查找的文件名和要进行搜索的目录的名称后,将调用函数 Search_Directory 进行文件的查找。首先依次查找当前目录下的每一个实体(文件或是子目录) ,如果是某一子目录,则进入该子目录并递归调用函数Search_Dirctory 进行查找, 查找完毕之后, 再返回上一级目录;如果不是子目录而是某一文件,则判断其是否就是我们要查找的文件,如果是则输出其完整的文件路径。这样, 通过 Search_Directory 函数的反复递归调用,就可以实现对整个目录, 包括子目录的遍历搜索。下面将举例详细讲述如何在VC中编程实现在整个目录树中的文件查找。1 在 Visual C 6.0(VC5.0与之类似) 中用默认方式创建了一基于对话框的应用程序Search。 在 主 窗 口 对 话 框 上 放 置 一 命 令 按 钮 , 其Caption为 “Search File ” , ID为ID_BUTTON_SEARCH。单击此按钮将完成文件的查找工作。2 利 用ClassWizard为 “Search File ” 按 钮 的BN_CLICKED 事 件 添 加 处 理 函 数OnButtonSearch ,代码如下:include direct.h include io.hvoid CSearchDlg:OnButtonSearch() / TODO: Add your control notification handler code here char szFilename80; / 字符串szFilename 表示要查找