下载源文件- 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