zoukankan      html  css  js  c++  java
  • 日志列表框控件

    下载源文件- 46kb 介绍 我从从控制台类型的应用程序转移到GUI世界的程序员那里听到的最常见的问题之一是“如何使用printf进行调试输出?”十年前,在我的第一个Windows应用程序中,我问了自己同样的问题,并得出了这个答案。我在这篇文章和附带的代码下载中所展示的,是世界上最大的(至少是IMNSHO)打印等效软件经过十年的成熟所取得的成果。我在附带的关于图形化开发人员环境的文章中提到了这一点,但是这是具有我似乎需要的所有特性的全面控制。 这个示例除了包含跟踪日志外,还演示了MFC中许多其他有趣的技术。这包括 从列表中选择性

      

    地删除项目 从列表中有选择地剪切 从列表中选择复制项目 打印一个CListBox 一种通用的行印刷机构,在一篇附带的文章中描述。 对CListBox进行选择性打印 与全局环境中的CFormView元素交互 通过新菜单项以外的方式创建视图 拥有一个创建或弹出视图的菜单项 一个很好的CFormView示例 使用具有可变长度参数列表的构造函数 使用可变长度参数列表格式化函数内字符串的能力。 这是一个clistbox派生类,它需要一些字符串资源来实现完整性。因此,您必须从示例项目复制一组字符串资源。对于IDS_TRACELOG_消息,它们在5000范围内,对于IDS_WSA Winsock错误消息,它们在10000范围内。可以通过单击页面顶部的链接下载显示在MDI下使用这些类的完整项目。它是在vc++ 6.0下编译的。 TraceEvent类 类声明 事件日志系统的核心是一个所有者抽签列表框。它提取从抽象TraceEvent类派生的项。隐藏,复制Codeclass TraceEvent: public CObject { DECLARE_DYNAMIC (TraceEvent) 保护: 静态使用UINT计数器; TraceEvent(UINT id) {time = CTime::GetCurrentTime(); filterID = id; threadID =: GetCurrentThreadId (); seq =计数器+ +; } 公众: enum {None = -1}; virtual ~TraceEvent() {} textcolor() = 0; 因为虚拟字符串显示(); 因为虚拟字符串showID (); 因为虚拟字符串showfile (); 因为虚拟字符串showThread (); virtual int displayHeight() {} 静态CString cvtext(字节ch);//对各种子类有用 cvtext(const CString &s);//对各种子类有用 保护: CTime时间; 使用UINT filterID; DWORD threadID; 使用UINT seq; }; 注意,textcolor方法被指定为= 0,这意味着不可能实例化类TraceEvent的元素。相反,您可以将其子类化并创建新类。 我从CObject中派生这个类,因为我想在处理过程中做IsKindOf。 一个典型的子类是TraceComment,它的表单隐藏复制代码/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *类TraceComment *输入: * uint id: connection id,或TraceEvent::None 显示字符串 *输入: * uint id: connection id,或TraceEvent::None 要显示的字符串的索引 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / 类跟踪:公共跟踪事件 { DECLARE_DYNAMIC (TraceComment) 公众: TraceEvent(id){注释= s;} TraceEvent(id) TraceEvent(id) { 装运箱;s.LoadString (u);评论= s; } virtual ~TraceComment() {} {返回RGB(0, 128, 0);} 因为虚拟字符串显示(); 保护: 装运箱的评论; }; 这是一个典型的子类。它提供了显示的颜色、格式化构成显示的值的show方法以及预期的构造函数和析构函数。另一个有用的类是Hide。复制代码/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *类TraceFormatMessage *输入: * UINT id: connection id,或TraceEvent::None * DWORD错误:来自GetLastError()的错误代码 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / 类TraceFormatMessage: public TraceError { DECLARE_DYNAMIC (TraceFormatMessage) 公众: TraceFormatMessage(UINT id, DWORD错误); TraceFormatMessage() {} }; 使用类 我们将简要介绍事件日志类,但其基本用法如下所示。注意,在上面显示的显示中,除了一条消息外,“Connection ID”在所有消息的左列中打印。任何与连接相关的消息都会打印它的connection ID,但是一个不相关的事件使用特殊代码TraceEvent::None来表示不应该有打印输出。您对这些概念的解释可能需要不同类型的符号,并且您的参数可能会有所不同。隐藏,Codec_Log副本。AddString(新TraceComment (TraceEvent::没有,IDS_SAW_SOMETHING)); 或者一个很好的特性,当你有一个API失败时,你可以做一些类似隐藏的事情。SomeAPIcall(…); 如果结果(!) {/*失败*/ GetLastError(); c_Log。AddString(新TraceError (TraceEvent::没有,IDS_WHATEVER_FAILED)); c_Log。AddString(新TraceFormatMessage (TraceEvent::没有,犯错)); } /*失败*/ 类的实现 因为类是cobobject派生的,所以我必须做出正确的声明:复制CodeIMPLEMENT_DYNAMIC (TraceComment TraceEvent) IMPLEMENT_DYNAMIC (TraceError TraceEvent) IMPLEMENT_DYNAMIC (TraceFormatError TraceError) 然后我必须声明这些方法。最有趣的是表演方法。基类TraceEvent显示时间。隐藏,复制CodeCString TraceEvent::显示() { 时间。格式(_T(“% H: % M: % S ")); 返回年代; } 我使用一个单独的方法来显示线程ID,原因我们将在查看显示逻辑时看到。 然后,每个方法将格式化其数据并将其附加到基本的显示结果中:复制CodeCString TraceComment::显示() { 返回TraceEvent::show() + comment; } (我不打算展示所有的细节,因为您可以自己在示例代码中阅读它们)。 也许最有用的方法是TraceFormatMessage构造函数,它可以很好地显示来自API的错误代码。这有一个很好的扩展,我也使用它来报告WinSock错误。对于大多数错误,它使用::FormatMessage调用,但是::GetLastError返回的所有值不能被::FormatMessage解码。它实际上只知道如何格式化几种类型的消息。如果你的系统有一个提供错误字符串的DLL,你可以扩展它来使用它。我所做的扩展是,如果::FormatMessage失败,我将错误代码用作字符串表索引。对于WinSock,我只是将字符串放入带有WinSock错误号的字符串表中。当然,这里有一个风险:如果错误编号与表中已经存在的某个字符串相对应,该怎么办?我要求所有这类错误消息都以一个区分字符开头,这将不会作为普通文本中的第一个字符出现。我选择了“®”。隐藏,收缩,复制CodeTraceFormatMessage::TraceFormatMessage(UINT id, DWORD err): TraceError(id) { LPTSTR年代; 如果(::FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 空, 呃, 0, (LPTSTR)和年代, 0, NULL) = = 0) {/*失败*/ //看看它是否是已知的错误代码 装运箱t; t.LoadString(错); if(t. getlength () == 0 || t[0] != _T('®')) {/*其他错误*/ 装运箱fmt; fmt.LoadString (IDS_UNKNOWN_ERROR); t。格式(fmt,犯错,犯错); } /*其他错误*/ 其他的 如果(t.GetLength()在0,,t [0] = = _T(®)) {/*删除前缀*/ t = t.Mid (1); } /*删除前缀*/ < 错误= t; } /*失败*/ 其他的 {/*成功*/ LPTSTR p = _tcschr(s, _T('
    ')); 如果(p ! = NULL) {/*失去CRLF */ * p = _T (' \ 0 '); } /*失去CRLF */ 错误= s; :: LocalFree(年代); } /*成功*/ } 跟踪列表类 跟踪列表类是CListBox的一个子类。要使用它,在你的项目中放置一个CListBox控件,将其设置为owner-draw变量,leave没有选中字符串,并确保Sort没有选中。检查水平滚动以支持滚动。不检查积分高度。注意,类的PreCreateWindow方法将确保这些样式位被准确地设置。然而,如果你将控件放在一个CDialog-或cformview派生的类中,PreCreateWindow将不会被调用,因为控件是在子类化之前创建的。 业主抽签列表框部分属于您的里程可能不同的类别。图纸的细节由你来决定。我提供的类包括一个ID、一个线程ID、一个时间戳和一些显示文本。它为整条线设置单一颜色。但是一旦你看到了基本的结构,你应该能够快速的做主题和变化。 使这个类比简单的CListBox更复杂的是保存文本的能力、对条目数量的限制和花哨的滚动。我们将依次讨论这些。 日志记录到磁盘 磁盘保存可以在两种模式下工作。在第一种模式中,您发出一个Save命令,CListBox的全部内容将被保存到一个文件中。注意,如果设置了一个限制,比如100个项目,那么从列表框中滚动的任何项目将永远丢失。在另一种模式中,您设置了一个标志,使每一行都被保存为文件一写完就立即返回。当然,这种方法效率较低,但它有两个优点: 所有的字符串都会出现在文件中,即使它们已经滚动离开了列表框 如果程序崩溃,或者更糟,系统崩溃,您仍然可以看到日志中的内容,因为文件始终处于稳定状态。 CTraceList: setToDisk (BOOL v) 这将设置保存到磁盘标志。如果设置为TRUE,则写入日志的每一行都将写入文件。当设置为FALSE时,日志记录将停止。注意,在执行过程中只能将其设置为TRUE一次;每次将其设置为TRUE时,它都会提示输入文件名并覆盖任何现有文件的任何文件内容。当它以TRUE调用时,列表框中已经存在的任何内容都被写入文件。 CTraceList:: doSave (BOOL saveAs) 这强制执行保存到磁盘的操作。该控件提示输入文件名,然后将该控件的全部内容写入文件。如果<>saveAs为真,则会提示输入文件名;如果saveAs为FALSE,它将覆盖之前写入的文件(或者如果没有文件,它将提示,通常的保存语义)。 花哨的滚动 滚动这样的控件是很棘手的。如果您正在观察消息出来,您希望看到它们向上滚动,这样您就有了明显的跟踪输出程序。但是,如果您已经回滚查看消息,您不希望每当有新消息传入时控件跳回末尾。这个控件实现了有趣的滚动。如果在添加新行之前最后一行是可见的,而新行不可见,或者在添加后部分模糊,则控件将自动向上滚动。如果最后一行不可见,则添加行后不会发生滚动。 此外,这个类还支持top、to-end和search操作,这些操作在对话框中实现,如下图所示: 第一个控件调用void CTraceList::toTop(),它使列表框的第一行可见。您可以使用谓词BOOL CTraceList::canTop()来决定是否应该启用这个按钮。最后一个控件调用void CTraceList::toEnd(),这会使控件的最后一行可见,BOOL CTraceList::canEnd()会告诉您是否显示了最后一行。 & lt;和比;按钮调用函数int CTraceList::findNext(int start)和int CTraceList::findPrev(int start)来查找日志中的下一个TraceError事件实例。返回的值是当前位置,并将传递给下一个调用。如果在所需的方向上没有找到事件,则两个调用都返回LB_ERR。更复杂的日志记录系统可能使用事件类型的RUNTIME_CLASS进行搜索;我在这个版本中连接了TraceError。 添加事件 我们已经展示了事件的添加方式。AddString方法覆盖了CListBox::AddString。它没有使用LPCTSTR参数,而是使用TraceEvent *参数。它实现了所有的智能滚动。注意,我们可以通过在字符串资源中提供一个CString引用或一个字符串的UINT来添加字符串。该函数还处理设置水平范围以允许水平滚动。 注意,一个事件可以显示在多行上。因此,您可以将事件显示在两行或三行上。这是基于虚拟方法int displayHeight(),该方法在TraceEvent中将返回1,但是可以被任何需要多行代码的事件子类覆盖。隐藏,Codec_Log副本。AddString(新TraceError (TraceEvent::没有,IDS_WHATEVER_FAILED)); c_Log。AddString(新TraceFormatMessage (TraceEvent::没有,犯错)); DrawItem处理程序 该方法利用了所提供的虚拟方法。它将ItemData值转换为TraceEvent *事件,然后调用类的虚拟方法来获取文本颜色和显示文本。要创建更复杂的绘图方案,可能需要向类中添加更多的虚拟方法。下面是一些代码片段,可以让您了解如何使用这些虚拟方法。隐藏,收缩,复制co全无CTraceList::DrawItem(LPDRAWITEMSTRUCT dis) { CDC::FromHandle(dis->hDC); 也就是说bkcolor; 也就是说txcolor; … dc->SaveDC(); … 如果(dis→itemState,ODS_SELECTED) {/* selected */ 如果(::GetFocus () = = m_hWnd) {/*有焦点*/ bkcolor =: GetSysColor (COLOR_HIGHLIGHT); txcolor =: GetSysColor (COLOR_HIGHLIGHTTEXT); } /*有focus */ 其他的 {/*无焦点*/ bkcolor =: GetSysColor (COLOR_BTNFACE); txcolor =: GetSysColor (COLOR_BTNTEXT); } /*无焦点*/ } /*选中*/ 其他的 {/*未被选中*/ txcolor = e→输入textcolor (); bkcolor =: GetSysColor (COLOR_WINDOW); } /*未被选中*/ … showID(); 直流→TextOut (dis→rcItem.left,说→rcItem。前,id); showThread(); 直流→TextOut (dis→rcItem。左+ indent1, dis- gt;rcItem。,年代); s = e→显示(); 直流→TextOut (dis→rcItem。左+ indent1 + indent2, dis- gt;rcItem。,年代); 如果(dis→itemState,ODS_FOCUS) 直流→DrawFocusRect (rcItem默认,说环境); 直流→RestoreDC(保存); } 变量indent1和indent2的使用可以从示例代码中看到;假设它们表示选项卡位置,并已正确计算。在上面的示例中,虚方法以粗体显示。注意,此代码保持高亮显示可见,但如果控件没有焦点,则将其从普通背景更改为名义上的灰色背景。 在MDI应用程序中使用它 在MDI应用程序中使用它需要很多微妙的编码问题。CTraceList窗口是CFormView的成员,CFormView是CMDIChildWnd的子窗口,它位于主框架内的MDI客户端窗口中。这带来了一些额外的复杂性。我所做的就是把它很好地打包在一个样本中,它可以完成所有复杂的工作。要查看我向CWinApp类添加了什么,请在该文件中查找我的首字母(JMN)。我还向CMainFrame类添加了一些示例测试代码。运行此操作并执行一些测试的结果如下所示。 这是一个完全配置的实现,支持从标准菜单项调用的复制、剪切、删除、打印、保存和作为保存操作。它还会在打印机上打印数据;如果打印机是彩色打印机,您将看到与显示器使用相同颜色的输出。 示踪剂参考手册 CTraceEvent CTraceEvent: CTraceEvent(使用UINT id) 它由子类作为构造函数的一部分调用。它将出现在最左边列中的值id与事件相关联。值TraceEvent::None当用作id时,最左边的列将为空。 cvtext(CString s) 这将字符串转换为可打印格式。特别地,小于ASCII“空格”且大于或等于127的字符将被转换为“\x”符号。在Unicode模式下,如果高阶Unicode字节是非零的,它将转换以十六进制表示高阶Unicode字节的字符串。因为这是一个静态方法,所以可以方便地在任何时候调用它来转换字符串。 cvtext(TCHAR ch) 这将单个字符转换为可打印形式。它被cvtext的字符串形式重复调用以转换每个字节。因为这是一个静态方法,所以可以方便地在任何时候调用它来转换字符。 虚拟int TraceEvent:: displayHeight () 此方法仅对需要多行显示的类被覆盖。基类实现返回的默认值是1,用于单行显示。该值总是表示条目的整数行数。 getFont(); 这个方法可以被子类覆盖,以允许为显示目的使用不同的字体。这目前还没有实现,并且总是返回NULL。 虚拟使用UINT TraceEvent: getID () 这个方法返回条目的id值。 TraceEvent::没有 它被用作构造函数的第一个参数,以指示没有id值,并且显示的最左边的列应该是空的。 因为虚拟字符串TraceEvent::显示() 每个子类覆盖此方法以返回用于显示的格式化字符串。基类中的这个方法返回一个空字符串。可以选择修改它以返回时间戳值。 因为虚拟字符串TraceEvent: showfile () 此方法返回一个字符串,该字符串用于计算剪贴板的值或写入文件。此格式包括格式化为6位小数的序列号。这很有用,因为数字是在创建条目时分配的,因此序列中的空白将表示删除。它通常不会被子类覆盖,但可能会被覆盖。 因为虚拟字符串TraceEvent: showID () 这种方法通常不被覆盖;它返回格式化为十进制数的id值。id是TraceEvent::None,它返回一个与它将要返回的小数大小相同的空白字符串。 因为虚拟字符串TraceEvent: showThread () 这种方法通常不被覆盖;它返回一个格式化线程句柄。 也就是说虚拟TraceEvent:输入textcolor () 这个方法必须被子类覆盖,以便为子类提供所需的显示颜色。 TraceComment :TraceComment(UINT id, const CString &s) 构造id已指定且内容由字符串s指定的跟踪。 TraceComment::TraceComment(UINT id, const UINT strid) 构造id已指定且其内容由id为strid的字符串资源指定的跟踪。 TraceData LPBYT TraceData: TraceData(使用UINT idE数据,UINT长度) 创建id已指定且内容为由数据和长度指定的二进制数据字节的TraceData。数据将显示为用空格分隔的十六进制字节。 TraceData::TraceData(UINT id, LPCTSTR data) 创建id已指定且内容为由数据指定的以空结尾的字符串的TraceData。数据将使用TraceData::cvtext显示为文本数据。 :TraceData(UINT id, const CString &数据) 创建id为指定且内容为指定CString的TraceData。数据将使用TraceData::cvtext显示为文本数据。 TraceError TraceError::TraceError(UINT id, const CString &s) 构造一个TraceError,其id已指定,其内容由字符串s指定。 TraceError::TraceError(UINT id, UINT strid) 构造一个id已指定的TraceError,其内容由id为strid的字符串资源指定。参见:TraceFormatError TraceFormatComment TraceFormatComment(UINT id, const CString &fmt,…) 构造一个id已指定且其内容表示一组根据字符串fmt格式化的参数的跟踪。 TraceFormatConnment(UINT id, UINT fmtid,…) 构造一个id被指定的跟踪,它的内容是一组参数,根据由fmtid表示的字符串资源进行格式化。 TraceFormatError TraceFormatError(UINT id, const CString &fmt,…) 构造一个TraceError,其id已指定,其内容表示一组根据字符串fmt格式化的参数。 TraceFormatError::TraceFormatError(UINT id, fmtid,…) 构造一个TraceError,它的id是指定的,它的内容是根据fmtid表示的字符串资源格式化的一组参数。 TraceFormatMessage TraceFormatMessage:: TraceFormatMessage(使用UINT id,犯错) 构造一个CTraceError,其id是指定的,其内容表示错误代码err格式化根据::FormatMessage(…、FORMAT_MESSAGE_FROM_SYSTEM…)。 CTraceList AddString(TraceEvent * event) 向日志窗口追加一个TraceEvent。如果这将导致日志窗口中的项数超过CTraceList::setLimit所设置的限制,那么删除一些刚刚超过边界值的项数(参见CTraceList::setBoundary),直到有空间插入新项。 BOOL CTraceList: canClearAll () 如果列表中有任何元素,则返回TRUE。您可以在子类中重写它,以始终返回FALSE来支持只读列表。 BOOL CTraceList: canCopy () 如果可能进行复制操作,则返回TRUE。要使其工作,列表中必须至少有一个选定项。 BOOL CTraceList: canCut () 如果可能进行切割操作,则返回TRUE。要使其工作,列表中必须至少有一个选定项。您可以通过始终返回FALSE在子类中重写它以支持只读控件。 BOOL CTraceList: canDelete () 如果可能进行删除操作,则返回TRUE。您可以在子类中重写它,以始终返回FALSE以支持只读控件。 BOOL CTraceList: canEnd () 如果列表中有多个项目,则返回TRUE。通常用于确定是否应该启用“结束”按钮。 BOOL CTraceList: canNext () 如果有插入符号的项后面有一个CTraceError项,则返回TRUE;如果没有,则返回FALSE。通常用于确定是否应该启用“下一个错误”按钮。 BOOL CTraceList: canPrev () 如果在具有插入符号的项之前有一个CTraceError项,则返回TRUE;如果没有,则返回FALSE。通常用于确定是否应该启用“以前的错误”按钮。 BOOL CTraceList: canPrint () 如果列表非空,则返回TRUE。 BOOL CTraceList: canSave () 如果列表非空,并且自上次保存以来已被修改,则返回TRUE。 BOOL CTraceList: canSaveAs () 如果列表非空,则返回TRUE。 BOOL CTraceList: canSelectAll () 如果列表非空,则返回TRUE。 BOOL CTraceList: canTop () 如果列表中有多个项目,则返回TRUE。通常用于确定是否应该启用“开始”按钮。 BOOL CTraceList:复制() 如果选择了任何项,则根据CTraceEvent::showfile()方法对它们进行格式化,并以CF_TEXT格式放置在剪贴板上。如果没有选择任何项或无法访问剪贴板,则返回FALSE。通常从视图中的OnCopy处理程序调用。 BOOL CTraceList:减少() 如果选中了任何项目,它们将复制到剪贴板,就像CTraceList::Copy中那样,然后它们将被删除。如果任何操作未能成功地将它们放到剪贴板上,则不会删除它们。通常从视图中的OnCut处理程序调用。 BOOL CTraceList:删除() 如果选择了任何项,则删除它们。如果有任何ite返回TRUE女士被删除。通常由处理程序为Del键或Clear菜单项调用。 int CTraceList:: DeleteString (int n) 从列表中删除元素n。注意,n没有被限制在边界之上(参见CTraceList::setBounary)。 BOOL CTraceList:: doSave (BOOL saveas) 如果saveas参数为真,或者没有先前保存的文件名,提示用户输入文件名。如果saveas参数为FALSE,并且存在先前的保存操作,则会重写文件。文件总是被覆盖,而不是追加到。控件的内容将根据虚拟CTraceEvent::fileshow()方法写入到文件中。 空白CTraceList: enableLimit (BOOL启用) 允许的极限。这将强制删除超过限制的任何元素,直到计数符合限制为止。极限总是超出边界的某个最小尺寸。 空白CTraceList: Print () 提示用户输入打印机,然后打印所选项目或整个列表,具体取决于用户选择的操作。 空白CTraceList: SelectAll () 选择列表中的所有元素。通常从Select All/Ctrl+视图的处理程序中调用。 空白CTraceList:: setBoundary (int边界) 设置一个边界,在该边界之下,当超过指定的限制时,将不会删除任何元素来为其他元素腾出空间。通常,这是在启动后使用的,基本参数被记录下来,不应该丢失。默认的边界是-1,这意味着没有边界,并且列表中的第一个元素将被删除以腾出空间。 设置字体(CFont * font) 这将为整个显示设置默认字体。单个跟踪项可以提供它们自己的字体(此特性未实现)。如果没有指定的字体,这个默认字体将用于显示。 空白CTraceList:: setLimit (int限制) 设置列表框包含的元素不超过limit的限制。如果尝试在列表中放入超过limit的元素,将导致先前的元素被删除。如果没有设置边界(参见setBoundary),则删除列表的第一个元素以留出空间。如果边界已经设置,边界+第一个元素将被删除以创建空间。如果limit的值为负数,则禁用limit,但不更改限制数(这与调用enableLimit(FALSE)相同)。如果限制是正数,它被设置并且enableLimit(TRUE)被影响。但是,在添加新元素之前,元素不会被删除。调用enableLimit(TRUE)将强制执行该限制。限制不能设置得“太小”。有一个最小尺寸;如果设置了边界,则限制是超过将要设置的边界的最小数量。 空白CTraceList: setShowThreadID (BOOL显示) 如果以FALSE调用,则不会显示线程ID。默认设置是显示线程ID。 BOOL CTraceList:: setToDisk (BOOL启用) 使direct-to-disk日志记录。在这种模式下,每个AddString操作都会立即将项目写入磁盘文件。每次在enable将FALSE更改为TRUE时调用该函数时,都会提示用户输入文件名。指定的文件名将替换任何已经存在的文件。如果用户取消了文件对话框,或者在打开文件时出现错误,该函数将返回FALSE。在这种模式下,文件被反复打开和关闭,从而保证在底层系统文件缓存允许的范围内,如果程序崩溃甚至系统崩溃,文件内容将在磁盘上,并且是一致的。 BOOL CTraceList:引起() 移动到列表中的最后一项,使其可见并选择它。删除任何现有的选择。这个结果是正确的。通常由处理程序调用“Go to end”按钮。 BOOL CTraceList: toNext () 从当前插入符号位置向前移动到列表中的下一个TraceError对象,使其可见,并选择它。删除任何现有的选择。如果找到这样的条目,结果为真;如果没有找到这样的条目,结果为假。通常由处理程序调用“下一个错误”按钮。 BOOL CTraceList: toPrev () 从当前插入符号位置向后移动到列表中的前一个TraceError对象,使其可见,并选择它。删除任何现有的选择。如果找到这样的条目,结果为真;如果没有找到这样的条目,结果为假。通常由处理程序调用“以前的错误”按钮。 BOOL CTraceList: toTop () 移动到列表中的第一项,使其可见,并选择它。删除任何现有的选择。这个结果是正确的。通常由处理程序调用“转到开始”按钮。 可以下载显示在MDI下使用这些类的完整项目。它是在vc++ 6.0下编译的。 在这些文章中表达的观点是作者的观点,不代表,也不支持,微软。 发送邮件到纽科姆@比目德关于这篇文章的问题或评论。龙名公司版权所有 本文转载于:http://www.diyabc.com/frontweb/news182.html

  • 相关阅读:
    Java:类与继承(隐藏和覆盖的问题)
    Java中的static关键字解析
    面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)
    面向对象要点(this关键字)
    急须知道postman RSA加密的方式
    RSA加密原理
    postman获取变量
    Mysql通过cmd访问
    一个简单的postman实例
    sum(coalesce(adjust_value,prediction_value))
  • 原文地址:https://www.cnblogs.com/Dincat/p/13431032.html
Copyright © 2011-2022 走看看