常见Visual C++开发使用问答(下)

 常见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 类。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值