MFC邮递表的中文翻译(转载五)

鬼谷子
交通大学思源BBS -- 文章阅读
--------------------------------------------------------------------------------
发信人: common (只爱陌生人), 信区: Visual
标 题: MFC邮递表的中文翻译(转载五)
发信站: 交大兵马俑BBS站 (Tue Dec 28 16:44:26 1999), 站内信件
MFC邮递表的中文翻译
我是一名mfc程序设计的爱好者,订阅了mfc的maillist,利用业余
时间将它翻译出来,希望能对mfc编程的朋友有所帮助,请朋友们指正.
第二十九期目录 杨晓东 1999.3.15
1.直接调用DAO
2.关于列表框
3.隐藏浏览控件
4.可调大小的对话框
5.显示顶级窗口
6.有多个CListCtrl的CListView
7.编译错误
8.位图
直接调用DAO
问:我用下列代码打开一个数据库以及一个表单,这是个顺序型表单,我
想做如下查询:
COleVariant varFilter(_T("[Ship Name] = Reese"), VT_BSTRT);
DAO_CHECK(m_prs->m_pDAORecordset->put_Filter(V_BSTR(&varFilter)));
但没有成功,在第二句上程序停留了下来,有谁能给我展示一下该怎么做吗?
答:如果过滤的条件是关于文本的话,过滤器值必须是相关引证的:
Change: _T("[Ship Name] = Reese")
To: _T("[Ship Name] = 'Reese'")
Or: _T("[Ship Name] = """Reese""")
然而我是从不用过滤器的,相反,我发现用SQL语句来开打一个表单更简单
更快,而且能包含过滤器的.
回到本期目录
关于列表框
问:怎样使鼠标移过列表框时能够显示鼠标所在项目的文字的小的
提示框,不是当前所选择的文本。
答:1)你可以通过CListBox::ItemFromPoint()函数来得到鼠标所
指的位置,它将会返回鼠标所指项目的索引值,从返回的值上可以
很容易的得到该值所对应的文本(使用CListBox::GetText() 函数)
然后你就可以使用ShowToolTip函数或者你自己所处理所要完成的。
2)取得鼠标的X/Y值,发送消息LB_ITEMFROMPOINT来得到鼠标所
指项目的索引值,然后发送消息LB_GETITEMRECT来得到项目的范围就
可以了。
回到本期目录
隐藏浏览控件
问:我有一个使用分隔窗口的程序,在右边的区域里有一个网页浏览
控件,与一个CWnd对象相关联……,问题是当我想临时隐藏控件时,
用m_pBrowser->put_Visible(FALSE)但什么也没有发生,网页依然显
示,java scripts依然运行,我也试着使用m_wndBrowser.ShowWindow(FALSE)
这种方式,图象确实消失了,但m_wndBrowser成员变量被置成0,无法恢复。
答:1)试试用m_wndBrowser.ShowWindow(SW_HIDE)来隐藏窗口,
用m_wndBrowser.ShowWindow(SW_SHOW)来显示窗口,后者调用时将会
重画你的程序。当恢复浏览器时,你必须重新指定所要去的。
2)我也有过同样的问题,我的解决方法是,用子窗口替换掉生成的
浏览器!我建立一个子窗口放置网页控件,然后就可以隐藏/显示了。
回到本期目录
可调大小的对话框
问:我想建立一个对话框,里面包含不确定的控件,特别是有些CEdit
控件,在程序运行时才能确定数目,所以我希望对话框能够自我调整,
以容纳下控件,或者以滚动条出现。
答:1)下面的说明可能对你有所帮助,放置一个静态控件在对话框模
板中,在运行时取得它的位置(因为随着系统设置的不同而不同,比如
大字体,小字体等),使用下面的代码你能计算出在对话框里的控件的
精确位置,对话框的尺寸就可以用SetWindowPos()来调节。
dialog::function()
{
CRect rect;
CStatic* pPreviewArea =static_cast(GetDlgItem(IDC_PREVIEWAREA));
pPreviewArea->GetWindowRect(rect);
ScreenToClient(rect);
// and a bit of extra tweeking for the NC areas.
}
2)这是我最近做的,我觉得不错。首先你要在启动时建立控件,
并做以下工作。
// Create
CEdit *pEdit;
pEdit =3D new CEdit;
pEdit->CreateEx (WS_EX_CLIENTEDGE,=20
"edit",
"",
WS_CHILD | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL,
rcTemp, // see below for rectangle comments
this,=20
ID_OF_FIRST_EDIT_CONTROL + EditCtr);
// EditCtr =increments for each control added
// Set the font for the control to Dialog's font
pPopEdit->SetFont (GetFont ());
// Now store pointer so you can delete it later
m_editArray.Add (pEdit);
你所用的控件的大小是非常重要的,如果你使用大字体,显示界面将
会非常大。这时可以用一个图形控件放置到对话框模板中(放置适当
的位置),使该控件不可见,你的编辑控件只要与之相对应就可以了,
我是这样做的。
CRect rcTemp;
GetDlgItem (IDC_PLACEHOLDER)->GetClientRect (rcTemp);
用rcTemp直接取得图形控件的大小,对于以后的控件,你只需要往下
移一点就可以了。
// use half =control height between controls for example
ControlHSpacing =3D rcTemp.Height () * 3 / 2;
rcTemp.OffsetRect (0, ControlHSpacing);
决定对话框尺寸时,确定对话框模板是放置后的尺寸,调用GetWindowRect
将给出单个控件的尺寸,如果你有超过9个以上的控件,也可以按下面
方法做。
CRect rcDialogWindow;
GetWindowRect (rcDialogWindow);
rcDialogWindow.bottom +=3D (9 * ControlHSpacing);
SetWindowPos (0,=20
0,
0,
rcDialogWindow.Width (),
rcDialogWindow.Height (),
SWP_NOZORDER | SWP_NOMOVE);
最后可能给让你担心的事情是在编辑控件下还有别的控件,如果是这样
的话,还需要做些小小的调整。
回到本期目录
显示顶级窗口
问:怎样才能在线程中实现对话框的顶层显示。
答:这个问题我也遇上过,不知为什么设置成WS_EX_TOPMOST并不能实
现,可能我们还没有真正理解它该怎样使用。但我用另外的方法实现
了:
SetWindowPos (&wndTopMost, 0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE)。
回到本期目录
有多个CListCtrl的CListView
问:一个CListView的视,在一个报表系统中当我想要将一些东西放入
列表中时,首先要清空原先已经存在的东西,然后再将新的数据放入。
这个程序大约有五个关于数据的列表。每次改动,我都要改变其它的
设置,我需要先清空列表数据,然后再将其它的列表的内容置入,我
认为这个方法效率实在是太差了,而且很耗时间,有什么方法更容易
一些。
答:1)较好的方法是实现一个带有多个CListView的CFrameWnd,当其
中一个被激活时,其它将会自动隐藏。
2)你的方法是:在列表控件先保存了所有的栏目,然后当使用
InsertColumn()来插入栏目时必须要用DeleteColumn()来删除已经存
在的栏目。如果有一个办法能够统计栏目数量(象GetItemCount()返
回表的行数一样)就会容易一些了。但要实现它不可避免的要保存该
控件的变化以及栏目,要改变它就不得不依靠一个新的列表控件。这
里如果你使用RecordSet类来保存你的数据时,在插入新的列表项时为
了得了当前的栏目数和(为了保持正确)删除栏目时就会再一次保存
栏目。也许你应该忘记这个方法,通常情况下这种方法效率是不高的,
除了所有的列表控件都拥有相同的栏目,这样你就不用改变而只需要
刷新一下就可以了。
回到本期目录
编译错误
问:请问下面的错误提示什么意思:
fatal error C1852: 'Debug/test1.pch' is not a valid precompiled header file
答:1)一般情况下,出现 这种错误是因为发生下面原因之一:
1.一个.pch文件不能被编译器认识
2.存在一个不正确的.pch 解决上面两种情况的方法我是采用删除有问
题的.pch文件,然后全部重新建立就可以了.
2)试下改变'Automatic use of precompiled headers'将
'through header'置为空,
回到本期目录
位图
问:对一个图形对象,我想用一种颜色来替换原位图调色板中的某一
颜色。另外不管系统是处于16位,32位,256色是不是都可以用上面的
方法解决。
答:我认为你必须对每种情况作出不同的处理,256色可以通过调色板
来改变某一颜色,但在真彩系统中必须重绘图中的相应的点才可以。
(位图是真彩色的)
#define DSPDxax 0x00E20746
void CSJSizeBar::SwapBitmapColor(CDC* pDC, CBitmap* pBitmap,
COLORREF rgbNew, COLORREF rgbOld)
{
BITMAP bm;
CBitmap bmMask;
CDC memDC,maskDC;
// create memory dc for drawing
memDC.CreateCompatibleDC( pDC );
CPalette* pOldPalette = (CPalette*)memDC.SelectPalette(
pDC->GetCurrentPalette(),FALSE );
memDC.RealizePalette();
CBitmap* Bitmap = memDC.SelectObject( pBitmap );
// fill out bitmap structure
pBitmap->GetBitmap( &bm );
// create mask
bmMask.CreateBitmap( bm.bmWidth,bm.bmHeight,1,1,NULL );
maskDC.CreateCompatibleDC( &memDC );
CBitmap* bmOld = maskDC.SelectObject( &bmMask );
CBrush brush( rgbNew );
CBrush* brOld = (CBrush*)memDC.SelectObject( &brush );
memDC.SetBkColor( rgbOld );
maskDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&memDC,0,0,SRCCOPY );
memDC.SetBkColor( RGB(255,255,255) );
memDC.SetTextColor( RGB(0,0,0) );
memDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&maskDC,0,0,DSPDxax );
maskDC.SelectObject( bmOld );
memDC.SelectObject( &brOld );
memDC.SelectObject( Bitmap );
memDC.SelectPalette( pOldPalette,FALSE );
}
--
※ 来源:·交大兵马俑BBS站 bbs.xjtu.edu.cn·[FROM: 21_73]
--------------------------------------------------------------------------------
分类讨论区 全部讨论区 上一篇 本讨论区 下一篇 回文章

龙丘居士亦可怜
谈空说有夜不眠
忽闻河东师子吼
拄杖落手心茫然