显示和调节水平滚动条的大小。
选菜单 Insert/New Class,设新创建类的名字为 CDJListBox,其基类为 CListBox,其它选项采用缺省值。
单击 OK,Visual Studio 自动生成 DJListBox.cpp 和 DJListBox.h 两个文件。
接下来将主对话框的列表框改为 CDJListBox 类型,即在 CLassView 扩展 CCustomListBoxDlg 类并双击m_lListTest 成员,在编辑窗格,修改CListBox m_lListTest为:CDJListBox m_lListTest然后,在类声明代码之前,插入include quotDJListBox.hquot此时如果重新编译并运行,是无法看到任何实质性的改变的,因为我们并没有修改 CDJListBox。
所有对于CDJListBox 的调用都直接传递给基类 CListBox 了。
跟踪字符串最大宽度可以通过覆盖 CListBox::AddString实现。
打开 DJListBox.h,紧接类的析构函数加入如下声明:int AddString LPCTSTR lpszItem 并在实现文件 DJListBox.cpp 加入该函数框架:int CDJListBox::AddStringLPCTSTR lpszItem// 此处加入字符串宽度跟踪、水平滚动条显示等代码字符串宽度跟踪可以用整形成员变量 m_nM axWidth 实现。
在 DjListBox.h 的 protected 声明区内,加入以下一行:int m_nMaxWidth在 DJListBox.cpp 文件,找到 CDJListBox 的建构函数,为这个最大宽度作初始化:m_nM axWidth 0现在可以改动新加入的 AddString了。
先应该调用基类 AddString,并用 nRet 记录其返回值:int nRet CListBox::AddStringlpszItem接下来调用 GetScrollInfo以获得垂直滚动条的相关信息。
这些信息是通过一个 SCROLLINFO 结构传递的,下面是对该结构初始化并调用 GetScrollInfo的代码:SCROLLINFO scrollInfomemsetampscrollInfo 0 sizeofSCROLLINFOscrollInfo.cbSize sizeofSCROLLINFOscrollInfo.fM ask SIF_ALLGetScrollInfoSB_VERT ampscrollInfo SIF_ALL在调试器内观察 SCROLLINFO,可以发现要获得 nMax 和 nPage 的正确数值,列表框至少应含有一个字符串。
SCROLLINFO 的成员 nPage 保存了列表框“每页”能够显示的项目数,nMax 是列表框内项目总数。
当nMax 大于或等于 nPage,就出现了垂直滚动条。
我们需要知道垂直滚动条的宽度以正确计算列表框的有效显示宽度。
这里使用一个初始值为 0 的整数 nScrollWidth 表示,并在垂直滚动条显示时将它赋值:int nScrollWidth 0ifGetCount gt 1 ampamp intscrollInfo.nMaxgt intscrollInfo.nPagenScrollWidth GetSystemM etricsSM _CXVSCROLL接下来声明一个 SIZE 变量 sSize,并实例化对话框的 CClientDC:SIZE sSizeCClientDC myDCthis对话框所采用的字体,有可能是缺省字体,也有可能是有目的的选择。
在对话框编辑器中右击对话框,并选择 Properties 可以查看当前值。
虽然 MyDC 是从列表框取得的,但列表框字体信息并未包含在 MyDC 中。
也就是说,对话框创建时所用字体并没有“选入”CClientDC。
要从 GetTextExtentPoint32获得真正的字符串大小,应该先调用 GetFont获得列表框的字体信息,然后将此字体选入 MyDC,代码为:CFont pListBoxFont GetFontifpListBoxFont NULLCFont pOldFont myDC.SelectObjectpListBoxFont现在可以调用 GetTextExtendPoint32函数来获得字符串的宽度了。
字符串.
上一篇:
串口调试,助手源程序,及VC编程,详细过程等问题
下一篇:
14年银行职员入党申请书格式