常见Visual C++开发使用问答(下) 责任编辑:admin 更新日期:2005-8-6 ·VC 6.0 对 VC 5.0 的兼容性?
很不幸,vc 6.0 在调试模式对 vc 5.0 不兼容,但发行模式没有问题。原因在微软改变了调试模式所用 dll 的格式,而保留了原文件名。因此,不要在 vc 6.0 中打开 vc 5.0 的调试版本工程。
·打印和打印机的问题?
我碰到这么一个问题:在打印方法中使用了 MM_LOMETRIC 模式,在 LOGFONT 结构中改变了字体的大小,但不知道 173(或者对于屏幕而言是 25)是从哪来的,它是 自动的。然而当我用另外一个打印机时 173 并不适合。我想知道的是:我如何对所有的打印来调整这个数字。
我以前也碰到过类似的问题,我让用户改变字体(大小,颜色等)。这些改变在屏幕上看起来挺好,但是打印时太小(我的同事在程序包中加入一个放大类)。原因 非常简单:打印机的分辨率可能是 300 dpi,而屏幕的分辨率则低得多。我是这么解决的:在获得屏幕字体信息后,我获取屏幕字体的毫米级大小(使用 LPtoDP,然后将模式变为 MM_LOMETRIC,调用 DPtoLP),接着对打印机设定了相同的模式,再调用 LPtoDP。切换回原来的模式之后,我调用了 DPtoLP,这样就得到了想要的字体高度和宽度。在 LOGFONT 中使用这个值,并且带有其它诸如下划线,斜体等字体信息,我实现了用户的要求。
·CRichEditCtrl 滚动条的问题?
我使用了 CRichEditCtrl 控制来显示某个文件中的 数据(将该控制设置为只读)。我已经设置了 ES_MULTILINE/ES_AUTOVSCROLL,但当 数据内 容比控制显示多的时候,滚动条并不出现,是不是因为设置了只读属性而引起了其它的问题? ES_AUTOVSCROLL/ES_AUTOHSCROLL 属性只在控制是可编辑时有效。你可心使用下面的滚动条风格来使滚动条出现:WS_VSCROLL/WS_HSCROLL,但是这样一来,不管你的 数据量有多大,滚动条总是会出现。
·如何获得 CRichEditCtrl 中字符的位置?
我想在 CRichEditCtrl 中使用右键菜单,因此想判定光标处字符的位置,请指点。
查看如下的帮助:
IRichEditOleCallback::GetContextMenu
EM_SETOLECALLBACK
·如何限制 mdi 子框架最大化时的大小?
用 ptMaxTrackSize 代替 prMaxSize,如下所示:
void CChildFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
// TODO: Add your message handler code here and/or call default
CChildFrame::OnGetMinMaxInfo(lpMMI);
lpMMI->ptMaxTrackSize.x = 300;
lpMMI->ptMaxTrackSize.y = 400;
}
---
·改变列表控制时发生闪烁现象?
我创建了一个简单的对话框,在对话框中设置了一个列表控件,这个控件占用了对话框的全部客户区。对话框是可以改变大小的,因此我要保证列表控件在对话框中 维持正确的位置,在对话框的 ONSize() 事件中我对列表控件使用了 MoveWindow(),这起到了作用,但当用户改变对话框的大小时,列表控件不停地闪烁。
要解决这个问题,在用 MoveWindow 之前,先用 ShowWindow(SW_HIDE) 隐藏列表控件,然后在 MoveWindow 之后用 ShowWindow(SW_SHOW) 来显示列表控件。
·处理列表控件可见项的问题?
我在一个列表控件中加入了好多条目。我通过获取某个条目是否可见或最后是哪个条目来进行处理,我看了 CListCtrl::GetItem() 的帮助,但是没有找到如何判断一个条目是否可见的方法。
如果你只想处理可见的条目,你可以用 GetTopIndex,它返回最大可见条目的索引值,然后你再用 GetCountPerPage 来得到在可见区域的条目数。
·CFile 使用了缓冲区吗?
CFile 没有使用运行库的 I/O 缓冲例程,从这个意义上讲 CFile 并没有使用缓冲。但是有可能操作系统在处理文件时使用了缓冲区,如果你完全不需要缓冲区,你可以设置 FILE_FLAG_NO_BUFFERING。 CFile 工作在这种模式下的唯一的方法是 CFile::Attach()。
---
·关于用户自定义的消息使用?
我写了一个基于 MFC 应用程序的对话框,在这个程序中,我创建了等待 网络传输 数据的线程,一旦该线程接收到 数据,它就传送一个用户自定义的消息到对话框,使对话框知道有 数据过来。但是为何在 CMyDialog::PreTranslateMessage(MSG* pMsg) 中能捕捉到 WM_MYCMD 这个消息,却不能和 OnMyCommand 相映射?
将你所有自定义消息的基类设为 WM_APP,而不是 WM_USER。
·在打开一个文档时退出?
我有一个 mdi 程序,在打开文件的处理过程中,我想判断该文档是不是应用程序需要处理的文档,因此,我检测文档中的某个数字是否符合要求,如何在发现不是该文档时出现一个错误提示,然后不打开该文档?
给文档设定某个标志,如果文档不是所要的就设定它。然后 OnOpenDocument 中检测,当发现标志被设定后返回 FALSE。
·在 CListCtrl 控件中多选择项的删除?
如何从在 CListCtrl 中删除多个选择项?
按如下方法处理:如果你的在 CListCtrl 是 m_list,to_delete 是个整数数组。
i=3D0;
POSITION pos=3Dm_list.GetFirstSelectedItemPosition();
if(pos)
while(pos)
to_delete[i++]=3Dm_list.GetNextSelectedItem(pos);
然后用删除保存在 to_delete 中的项目,用 GetSelectedCount 来得到已选项的个数。
·如何创建一个动态的 Tree 控件?
我想创建一个动态的 tree 控件,就象弹出窗口一样,但它并不象想象中那么容易。
方法一:用 CreateWindow(SDK)创建风格为 WS_POPUP,WS_CAPTION 和 WS_TICKFRAME 的窗口,并作为父窗口。
方法二:创建一个包含 Tree 控件的对话框。
·SDI 程序开始时不打开文档?
我创建了一个 SDI 应用,但每次启动时它都会打开一个文档("untitled"),如何不让它打开该文档呢?
看看 InitInstance 函数中有没有关于 OnFileNew 的调用,去掉它即可。
---
·在 SDI 应用程序中使用 Active 控件?
我刚了解到如何在 MFC 应用程序中使用 Active 控件,文档上说只能在视图为 CFormView 和 CDialog 时使用,但要是其它的情况该怎么办呢?
你可以在你应用程序的任何地方使用 Active 控件,而不仅仅局限于 CFormView 和 CDialog 为视图基类的情况。DevStudio 通过资源编辑器和对话框模板来使得在上述两个条件下使用 Active 控件更容易。因此,你也可以在任何视图中使用 Active 控件,条件是你直接操纵该控件,创建它并手工的布置好它的位置(这也是 DevStudio 为你所做的事)。
·有 RichEdit 控件的对话框无法正常显示?
我在对话框中放置了一个 RichEdit 控件,但是对话框却无法正常显示。
在你的应用程序 InitInstance() 中调用了 ::AfxInitRichEdit() 吗?
·CArchive 类的 WriteObject 函数问题?
谁知道在使用 CArchive 类的 WriteObject 函数时,如何避免将类名写入文件吗?
WriteObject 函数不仅写入了类名,而且还写入 PID(请查看 TN02),如果你只想写进一个文
本文件,并且你也想用串行化,你可以使用文件指针(用 GetFile)来存储字符串。或者,你可以使用
CFILE 类来处理这个问题,如果是文本文件,你也可以用 CStdioFile 类。
很不幸,vc 6.0 在调试模式对 vc 5.0 不兼容,但发行模式没有问题。原因在微软改变了调试模式所用 dll 的格式,而保留了原文件名。因此,不要在 vc 6.0 中打开 vc 5.0 的调试版本工程。
·打印和打印机的问题?
我碰到这么一个问题:在打印方法中使用了 MM_LOMETRIC 模式,在 LOGFONT 结构中改变了字体的大小,但不知道 173(或者对于屏幕而言是 25)是从哪来的,它是 自动的。然而当我用另外一个打印机时 173 并不适合。我想知道的是:我如何对所有的打印来调整这个数字。
我以前也碰到过类似的问题,我让用户改变字体(大小,颜色等)。这些改变在屏幕上看起来挺好,但是打印时太小(我的同事在程序包中加入一个放大类)。原因 非常简单:打印机的分辨率可能是 300 dpi,而屏幕的分辨率则低得多。我是这么解决的:在获得屏幕字体信息后,我获取屏幕字体的毫米级大小(使用 LPtoDP,然后将模式变为 MM_LOMETRIC,调用 DPtoLP),接着对打印机设定了相同的模式,再调用 LPtoDP。切换回原来的模式之后,我调用了 DPtoLP,这样就得到了想要的字体高度和宽度。在 LOGFONT 中使用这个值,并且带有其它诸如下划线,斜体等字体信息,我实现了用户的要求。
·CRichEditCtrl 滚动条的问题?
我使用了 CRichEditCtrl 控制来显示某个文件中的 数据(将该控制设置为只读)。我已经设置了 ES_MULTILINE/ES_AUTOVSCROLL,但当 数据内 容比控制显示多的时候,滚动条并不出现,是不是因为设置了只读属性而引起了其它的问题? ES_AUTOVSCROLL/ES_AUTOHSCROLL 属性只在控制是可编辑时有效。你可心使用下面的滚动条风格来使滚动条出现:WS_VSCROLL/WS_HSCROLL,但是这样一来,不管你的 数据量有多大,滚动条总是会出现。
·如何获得 CRichEditCtrl 中字符的位置?
我想在 CRichEditCtrl 中使用右键菜单,因此想判定光标处字符的位置,请指点。
查看如下的帮助:
IRichEditOleCallback::GetContextMenu
EM_SETOLECALLBACK
·如何限制 mdi 子框架最大化时的大小?
用 ptMaxTrackSize 代替 prMaxSize,如下所示:
void CChildFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
// TODO: Add your message handler code here and/or call default
CChildFrame::OnGetMinMaxInfo(lpMMI);
lpMMI->ptMaxTrackSize.x = 300;
lpMMI->ptMaxTrackSize.y = 400;
}
---
·改变列表控制时发生闪烁现象?
我创建了一个简单的对话框,在对话框中设置了一个列表控件,这个控件占用了对话框的全部客户区。对话框是可以改变大小的,因此我要保证列表控件在对话框中 维持正确的位置,在对话框的 ONSize() 事件中我对列表控件使用了 MoveWindow(),这起到了作用,但当用户改变对话框的大小时,列表控件不停地闪烁。
要解决这个问题,在用 MoveWindow 之前,先用 ShowWindow(SW_HIDE) 隐藏列表控件,然后在 MoveWindow 之后用 ShowWindow(SW_SHOW) 来显示列表控件。
·处理列表控件可见项的问题?
我在一个列表控件中加入了好多条目。我通过获取某个条目是否可见或最后是哪个条目来进行处理,我看了 CListCtrl::GetItem() 的帮助,但是没有找到如何判断一个条目是否可见的方法。
如果你只想处理可见的条目,你可以用 GetTopIndex,它返回最大可见条目的索引值,然后你再用 GetCountPerPage 来得到在可见区域的条目数。
·CFile 使用了缓冲区吗?
CFile 没有使用运行库的 I/O 缓冲例程,从这个意义上讲 CFile 并没有使用缓冲。但是有可能操作系统在处理文件时使用了缓冲区,如果你完全不需要缓冲区,你可以设置 FILE_FLAG_NO_BUFFERING。 CFile 工作在这种模式下的唯一的方法是 CFile::Attach()。
---
·关于用户自定义的消息使用?
我写了一个基于 MFC 应用程序的对话框,在这个程序中,我创建了等待 网络传输 数据的线程,一旦该线程接收到 数据,它就传送一个用户自定义的消息到对话框,使对话框知道有 数据过来。但是为何在 CMyDialog::PreTranslateMessage(MSG* pMsg) 中能捕捉到 WM_MYCMD 这个消息,却不能和 OnMyCommand 相映射?
将你所有自定义消息的基类设为 WM_APP,而不是 WM_USER。
·在打开一个文档时退出?
我有一个 mdi 程序,在打开文件的处理过程中,我想判断该文档是不是应用程序需要处理的文档,因此,我检测文档中的某个数字是否符合要求,如何在发现不是该文档时出现一个错误提示,然后不打开该文档?
给文档设定某个标志,如果文档不是所要的就设定它。然后 OnOpenDocument 中检测,当发现标志被设定后返回 FALSE。
·在 CListCtrl 控件中多选择项的删除?
如何从在 CListCtrl 中删除多个选择项?
按如下方法处理:如果你的在 CListCtrl 是 m_list,to_delete 是个整数数组。
i=3D0;
POSITION pos=3Dm_list.GetFirstSelectedItemPosition();
if(pos)
while(pos)
to_delete[i++]=3Dm_list.GetNextSelectedItem(pos);
然后用删除保存在 to_delete 中的项目,用 GetSelectedCount 来得到已选项的个数。
·如何创建一个动态的 Tree 控件?
我想创建一个动态的 tree 控件,就象弹出窗口一样,但它并不象想象中那么容易。
方法一:用 CreateWindow(SDK)创建风格为 WS_POPUP,WS_CAPTION 和 WS_TICKFRAME 的窗口,并作为父窗口。
方法二:创建一个包含 Tree 控件的对话框。
·SDI 程序开始时不打开文档?
我创建了一个 SDI 应用,但每次启动时它都会打开一个文档("untitled"),如何不让它打开该文档呢?
看看 InitInstance 函数中有没有关于 OnFileNew 的调用,去掉它即可。
---
·在 SDI 应用程序中使用 Active 控件?
我刚了解到如何在 MFC 应用程序中使用 Active 控件,文档上说只能在视图为 CFormView 和 CDialog 时使用,但要是其它的情况该怎么办呢?
你可以在你应用程序的任何地方使用 Active 控件,而不仅仅局限于 CFormView 和 CDialog 为视图基类的情况。DevStudio 通过资源编辑器和对话框模板来使得在上述两个条件下使用 Active 控件更容易。因此,你也可以在任何视图中使用 Active 控件,条件是你直接操纵该控件,创建它并手工的布置好它的位置(这也是 DevStudio 为你所做的事)。
·有 RichEdit 控件的对话框无法正常显示?
我在对话框中放置了一个 RichEdit 控件,但是对话框却无法正常显示。
在你的应用程序 InitInstance() 中调用了 ::AfxInitRichEdit() 吗?
·CArchive 类的 WriteObject 函数问题?
谁知道在使用 CArchive 类的 WriteObject 函数时,如何避免将类名写入文件吗?
WriteObject 函数不仅写入了类名,而且还写入 PID(请查看 TN02),如果你只想写进一个文
本文件,并且你也想用串行化,你可以使用文件指针(用 GetFile)来存储字符串。或者,你可以使用
CFILE 类来处理这个问题,如果是文本文件,你也可以用 CStdioFile 类。
- 上一篇文章: 常见Visual C++开发使用问答(上)
- 下一篇文章: Visual C++编程中的文件操作