MFC邮递表的中文翻译20.doc

上传人:鲁** 文档编号:544547563 上传时间:2023-03-11 格式:DOC 页数:14 大小:43KB
返回 下载 相关 举报
MFC邮递表的中文翻译20.doc_第1页
第1页 / 共14页
MFC邮递表的中文翻译20.doc_第2页
第2页 / 共14页
MFC邮递表的中文翻译20.doc_第3页
第3页 / 共14页
MFC邮递表的中文翻译20.doc_第4页
第4页 / 共14页
MFC邮递表的中文翻译20.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《MFC邮递表的中文翻译20.doc》由会员分享,可在线阅读,更多相关《MFC邮递表的中文翻译20.doc(14页珍藏版)》请在金锄头文库上搜索。

1、MFC邮递表的中文翻译20MFC邮递表的中文翻译我是一名mfc程序设计的爱好者,订阅了mfc的maillist,利用业余时间将它翻译出来,希望能对mfc编程的朋友有所帮助,请朋友们指正.第二十期目录 杨晓东 1998.12.27为何MDI程序中有子窗口打开时主应用程序不能关. 滚动视中LPtoDP失败 ODBC许可问题 怪异的字体 自画列表框样例 CWnd:GetMenu()的问题 用MFC制作弹出窗口 怎样取消一个弹出式菜单 为何MDI程序中有子窗口打开时主应用程序不能关.问:我在MDI程序中增加了一个CRichEditView文档模板,在子窗口视中我增加了下面一些代码. StartRepo

2、rt (void)CReportFrame *rpt;CReportDoc *rptDoc; / First get the right document templatePOSITION pPos = theApp.GetFirstDocTemplatePosition();theApp.GetNextDocTemplate ( pPos );theApp.GetNextDocTemplate ( pPos );CDocTemplate *pTemplate = theApp.GetNextDocTemplate ( pPos ); / Verify validityASSERT(pTemp

3、late != NULL);ASSERT_KINDOF(CDocTemplate, pTemplate); / Create the framerptDoc = new CReportDoc;rpt = (CReportFrame*)pTemplate-CreateNewFrame ( rptDoc, NULL );pTemplate-InitialUpdateFrame (rpt, rptDoc); / Get access to the display areaCReportView *rptView = static_cast(rpt-GetActiveView();CRichEditC

4、trl &rptCtrl = rptView-GetRichEditCtrl();CReportFrame继承于CMDIChildWndCReportDoc继承于CRichEditDocCReportView继承于from CRichEditView 如果我关闭程序前不关闭新建的视,调试器将认为程序依然在运行(程序管理器中依然存在) 我需要用调试菜单中的stop debugging来关闭程序;如果我手工关闭该视,程序将会正常关闭.如果有什么不同的话,在手工关闭新的视之前程序会询问是否保存. 那么怎样我才能关闭程序呢?答:1)我也碰上过对话框,窗口不能自动关闭的情况,这主要是因为继承的对象不正确

5、所造成的。通常应该在主程序中设置AfxGetMainWnd(). 你的程序让我搞糊涂了,一连使用了多个GetNextDocTemplate(pPos),在这些文档指针是NULL时通常会引起一些循环.在你的文档模板中是否已经精心算好了数目?这样可能会产生些bugs 我建议找出当前的文档模板用CDocTemplate:CreateNewDocument()来代替你的new CReportDoc 2) 记住一个公共规则,关闭程序前要关闭所有的视.返回本期目录滚动视中LPtoDP失败问:在WINDOWS98/95中,当你给光标指针位置大于32767或者小于-21768函数CDC:LPtoDP 将失败,

6、程序工作在NT上但在95/98中用滚动视工作时却出现了问题. LPtoDP是在下面函数中被调用的: SetScrollSizes(MM_HIMETRIC, sizeTotal);函数是在CScrollView中调用的我使用的是HIMETRIC映射方式,在我想将A4扩大150%时这个问题就会出现。怎样才能解决这个问题?答:1)在95中确实存在这样的问题,95中的GDI不是32位的.当我们开发一个程序有编辑矢量图象时手动而不是由LPtoDP()函数来完成转换.(在NT中也存在同样的问题) 2)简言之,CScrollView或CWnd之所以32位参数会失败是因为95/98并不是真正的32 位操作系统

7、,里面仍然包含16位代码.比如Scrollbars还是只接受16位的值来调整范围. NT是一个真正的32位操作系统,就没有这些困惑. 在95中不得不面对类似的滚动大文档的问题时,我们只能另外写些代码来实现滚动的实际位置,当它超出-32K或+32K时,你也必须在你的应用中做些映射. 作为一个有关的注意点(可能你已经碰上过这个问题)如果在MFC处理滚动消息时,如: void CSomeWnd:OnVScroll (UINT nSBCode,UINT nPos, CScrollBar *pscrollBar) 中的 nPos参数只有16位长.克服这个限制可以使用SCROOLINFO结构运行:GetS

8、crollInfo.SCROLLINFO 结构中的nTrackPos是一个真正的32位。返回本期目录ODBC许可问题问:我有个程序想通过ODBC来使用一个MS Access数据库,但是却碰上了错误,系统显示 Records cant be read; no read permission on table SESSION.(记录不能读, 表单不允许读)答:001)首先我假设access数据库有一个缺省的用户为admin,可以这样完成ODBC;UID=admin. 然后,当你继承CRecordset类时你就不必带参数打开,但下面的方法可能更好些: Open(CRecordset:dynaset,

9、 NULL,CRecordset:useBookmarks | CRecordset:skipDeletedRecords) 当然你必须提供DSN表示连接名字的数据库在ODBC之下.返回本期目录怪异的字体问:我们有一个MFC应用程序,主窗口是在客户区域内画些文本和图形. 我们希望能在客户区域内显示文本,在不需要时则擦除.所以我们先得到一个DC(CClientDC), 然后设置字体和文本颜色就开始写文本,在擦除时,我们用同样的字体,同样的地方用背景色重写文本. 这种方法绝大部分情况下都工作得很好,但偶尔文本并不能完全擦除,有些像素点依然可见. 好象在写文本时比通常略微胖了些,就象用粗体一样.字体

10、是在写文本时使用的,以后也没有进行过任何的调整. 下面是我们使用的写与擦除的函数. void CSign:DrawSignName(CDC* pDC) int OldBkMode; / select the appropriate font CFont* pOldFont = (CFont*) pDC-SelectObject(pSignNameFont); OldBkMode = pDC-SetBkMode(TRANSPARENT); / determine the colour of the text if (IsSignNameVisible() pDC-SetTextColor(aCo

11、loursSIGN_NAME_COLOUR); else pDC-SetTextColor(aColoursDEVICE_INVISIBLE_COLOUR); / draw the text pDC-TextOut(m_pointNameCoords.x, m_pointNameCoords.y, m_strName); / restore the previously used font and background mode pDC-SelectObject(pOldFont); pDC-SetBkMode(OldBkMode); / DrawSignName 函数是在消息句柄中调用的,而

12、参数中的DC是这样建立的: CClientDC dc(AfxGetMainWnd(). 字体是在程序初始化时建立的: pSignNameFont = new CFont; pSignNameFont-CreateFont(10,5,0,0,150, FALSE,FALSE,0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, Helvetica); 是不是一次使用两个指向同一个客户窗口的DC有问题?程序中的DrawSignName()被多个消息句柄

13、调用。答:1)加入以下代码: m_strName.Empty();Invalidate();UpdateWindow();more stuff; 上面代码会产生一个WM_ERASEBKGND消息,将会用背景色填满窗口,然后再调用OnDraw(),这时只要将字符串置空即可。 2)我不清楚为什么程序不能正常工作,但我有个主意(它会更快些)可以在显示文本的地方用一个背景色的矩形画一下即可。我也不清楚为什么你们为什么要用透明文本,它将会给图形系统带来大量的工作。字体之所以有这种情况,是否你们安装了文本输出的图形保真软件?它会给你们带来困惑的。 3)你只想简单的用一个指针来保存一个指向DC的GDI对象,

14、并试图再次调用它时期望它能指向正确的对象。恕我直言,这不是正确的方法(我不知道是否这是显示不正常的唯一原因)将它转化为一个Windows句柄才是正确的: / Creating:/pSignNameFont = new CFont;pSignNameFont-CreateFont(10,5,0,0,150, FALSE,FALSE,0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, Helvetica);/ Now converting into

15、a windows handlem_hSNFont = (HFONT) pSignNameFont-GetSafeHandle(); 直接保存一个对象是不安全的。返回本期目录自画列表框样例问:很久以前,有人散发关于自画列表框控件代码,而自画列表框外观就象一个标准列表框,在那时我就有个想法想把程序员开发的所有自画控件的代码惧收集起来,这样程序员们就可以使用现存的代码了。 我想问一下在1996年关于MFC站点那儿有才能关于列表框或其它控件的代码?答:1)自画列表框代码如下,看看是不是你所想要的。 Header fileclass CCustomListBox : public CListBoxpublic:/ Operations DECLARE

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号