VC++编程常见问题解答十 问:VC6.0对VC5.0的兼容性? 答:很不幸,vc6.0在调试模式对vc5.0不兼容,但发行模式没有问题. 原因在微软改变了调试模式所用dll的格式,而保留了原文件名. 因此,不要在 vc6.0中打开vc5.0的调试版本工程. 问:打印和打印机的问题? 我碰到这么一个问题:在打印方法中使用了MM_LOMETRIC模式,在LOGFONT结构中改 变了字体的大小,但不知道173(或者对于屏幕而言是25)是从哪来的,它是自动的. 然而当我用另外一个打印机时173并不适合.我想知道的是:我如何对所有的打印来 调整这个数字. 答:我以前也碰到过类似的问题,我让用户改变字体(大小,颜色等等).这些改变在 屏幕 上看起来挺好,但是打印时太小(我的同事在程序包中加入一个放大类).原因 非常 简单:打印机的分辨率可能是300dpi,而屏幕的分辨率则低得多. 我是这么解决的:在获得屏幕字体信息后,我获取屏幕字体的毫米级大小(使用 LPtoDP,然后将模式变为MM_LOMETRIC,调用DPtoLP),接着对打印机设定了相同的模 式,再调用 LPtoDP.切换回原来的模式之后,我调用了DPtoLP,这样就得到了想要的 字体高度和宽度. 在LOGFONT中使用这个值,并且带有其它诸如下划线,斜体等字体 信息,我实现了用户的要求. 问:CRichEditCtrl滚动条的问题? 我使用了CRichEditCtrl控制来显示某个文件中的数据(将该控制设置为只读).我 已经设置 了ES_MULTILINE | ES_AUTOVSCROLL,但当数据内容比控制显示多的时候 ,滚动条并不出现, 是不是因为设置了只读属性而引起了其它的问题? 答:ES_AUTOVSCROLL | ES_AUTOHSCROLL属性只在控制是可编辑时有效.你可心使 用下面的滚动条 风格来使滚动条出现:WS_VSCROLL | WS_HSCROLL,但是这样一来, 不管你的数据量有多大,滚动 条总是会出现. 问:从数据库中读大于32k的内容? 我在从数据库中读数据时碰到了问题.当数据栏包含超过32k的内容时,我就读不出 来,我试过 ODBC::SQLGetData()也不行. 答:哪种类型的数据库?MS SQL,SYBASE... 试试设置一下大小: BOOL CGetBlobStmt::Execute(LPCTSTR stmt) { m_cbSize = 0; m_size = 0; LPBYTE lpData; lpData = (LPBYTE)GlobalLock(m_hData); m_retcode = SQLSetStmtOption(GetHandle(),SQL_MAX_LENGTH,m_dwBytesLeft); m_retcode = SQLExecDirect(GetHandle(),(UCHAR*)stmt,SQL_NTS); if (m_retcode == SQL_SUCCESS) { m_retcode = SQLFetch(GetHandle()); if (m_retcode == SQL_SUCCESS ||m_retcode == SQL_SUCCESS_WITH_INFO) { m_retcode = SQLGetData(GetHandle(),1,SQL_C_BINARY,lpData,254,&m_cbSize); while(m_retcode == SQL_SUCCESS_WITH_INFO) { lpData+= 254; m_retcode = SQLGetData(GetHandle(),1,SQL_C_BINARY,lpData,254,&m_cbSize); } GetError(); } } GlobalUnlock(m_hData); #if TESTDATA TRACE("%ld",m_size); #endif SaveFile(); return RETVALUE; } 问:如何获得CRichEditCtrl中字符的位置? 我想在CRichEditCtrl中使用右键菜单,因此想判定光标处字符的位置,请指点. 答:查看如下的帮助: IRichEditOleCallback::GetContextMenu EM_SETOLECALLBACK