MFC编程案例chapter016.pdf
下载附录A 控件窗口风格使用M F C和Windows API创建控件窗口有多种方法:可以使用对话框编辑器增加一个控件到对话框模板中,对话框模板在对话框被创建时由 Windows API创建;或者可以使用 M F C控件类,如C B u t t o n类,自己动手创建控件窗口。若 M F C没有在类中捆绑一个通用控件,仍然可以使用C W n d类和通用控件窗口类名创建控件。每个控件装入时显示不同的可视特征,只要改变窗口风格便可访问这些特征。要想看到所有可用风格,唯一途径是用对话框编辑器作实验,即使对话框编辑器也不可能支持所有的窗口风格。本附录描述了可用的每个控件的重要窗口风格。尤其那些影响控件外观的窗口风格将与相应的图一起列出来。A.1 Windows 3.1及以上版本提供的控件窗口A.1.1 按钮控件用W i n d o w s A PI创建按钮控件HWND CreateWindowEx(dwExStyle,BUTTON,Te x t ,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建按钮控件CButton m_button;/usually embedded in parent classm _ b u t t o n.C r e a t e(Text,WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-1)其他风格B S _ D E F P U S H B U T TO N当当用户按下回车键,拥有这种风格的键被选中。然而,只有当其父窗口(如对话框)具有输入焦点时才会发生。在父窗口中,一次只能有一个按钮有该风格B S _ A U TO C H E C K B O X当当用户单击它时,自动地在被选中和不被选中之间改变状态B S _ A U TO 3 S TAT E当当用户单击它时,自动地在被选中、不被选中和不确定三种状态之间变化B S _ A U TO R A D I O B U T TO N当自动取消选中单选按钮组中地其他按钮B S _ O W N E R D R AW当父窗口必须绘制该按钮B S _ I C O N当在按钮表面绘制一个图标,该图标必须在其他步骤中指定B S _ B I T M A P当在按钮表面绘制一个位图,该位图必须在其他步骤中指定图A-1 按钮控件风格第五部分附录说明注意组合框实际上是一个按钮控件,它被告知绘制一个框,并把它的名字放在左上角,然后,忽略任何输入。这种在同一控件中非近似特征的堆积,可能是由于当时只有七个通用控件而没有增添的余地。其他按钮效果,通过使用A.4节“普通窗口风格”的边框风格获得。A.1.2 静态文本控件使用 Windows API创建静态文本控件(Static Control)HWND CreateWindowEx(dwExStyle,STAT I C ,Te x t ,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,h e i g h t,hWndParent,(HMENU)id,hInstance,NULL);使用M F C创建静态文本控件CStatic m_static;/usually embedded inparent classm _ s t a t i c.C r e a t e(&Text,WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-2)其他风格S S _ O W N E R D R AW父窗口绘制控件S S _ N O T I F Y正常情况下,静态文本控件把任何鼠标单击直接传给父窗口该风格强迫控件自己处理这些消息S S _ I C O N把图标绘制在控件上,图标在另一步中设置S S _ B I T M A P把位图绘制在控件上,位图在另一步中设置S S _ E N H M E TA F I L E把一个加强的元文件绘制在控件上,该元文件在另一步中设置S S _ C E N T E R I M A G E若静态文本控件显示的是图标、位图或元文件,该风格强迫其位于控件中心说明若用户在静态文本中某一字母前指定了&字符,该字符将显示一下划线。当用户按下该字母,Ta b次序紧随其后的控件将获得输入焦点。Ta b次序是对话资源中的控件实体的次序。拥有S S _ E T C H E D V E RT或S S _ E T C H E D H O R Z风格的静态文本控件,为用户绘制一条简单的蚀刻线。怎样使用对话框编辑器实现呢?应该选择哪个控件呢?似乎任何控件都不符合,其实,例6 9提供了一种方法。文本等同效果(文本字符看起来像蚀刻进窗口中)使用CDC:DrawState()和禁用选项可以获得。DrawState()用来画禁用菜单项。A.1.3 编辑控件用Windows API创建编辑控件(Edit Control)306第五部分 附录下载图A-2 静态文本控件风格HWND CreateWindowEx(dwExStyle,EDIT,Te x t ,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建编辑控件CEdit m_edit;/usually embedded in parent classm _ e d i t.C r e a t e E x(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-3)图A-3 编辑控件风格其他风格E S _ A U TO V S C R O L L当新文本输入时,引起文本自动向左滚动E S _ A U TO H S C R O L L当新文本输入时,引起文本向上滚动。只有当控件拥有 E S _ M U LT I L I N E风格时才有效E S _ N O H I D E S E L即使控件失去输入焦点,使被选中的文本仍然处于被选中状态E S _ WA N T R E T U R N对于一个多行控件,允许回车键经过控件,而不是像单击父窗口中的缺省按钮一样说明这里显示的编辑控件有一个附加的边框,在默认情况下,编辑框窗口没有边框。编辑框中的所有文本具有相同的字体(可以用SetFont()设置)。若想使某些文本加下划线或使某些文本显示黑体,应该用 Rich Edit Control。A.1.4 列表框控件用Windows API创建一个列表框控件(List BoxC o n t r o l)HWND CreateWindowEx(dwExStyle,LISTBOX,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建列表框控件CListBox m_listbox;/usually embedded in parentc l a s sm _ l i s t b o x.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);附录A 控件窗口风格307下载图A-4 列表框控件风格可视风格(见图A-4)初始化控件重置列表框内容,用m_listbox.ResetContent();添加一个字符串,用m_listbox.AddString(ListBox1);当设置L B S _ M U LT I C O L U M N风格时,要设每列的宽度,用m _ l i s t b o x.S e t C o l u m n Width(60);当设置L B S _ U S E TA B S TO P S时,要设置制表位,用int tabsNUM=10,20,30;m _ l i s t b o x.S e t Ta b S t o p s(N U M,t a b s);其他风格L B S _ N O T I F Y使使列表框控件处理鼠标单击事件,而不把它们传递到父窗口L B S _ S O RT使字符串按字母顺序排序L B S _ O W N E R D R AW F I X E D使父窗口必须绘制该控件,并且每项的垂直大小相同L B S _ O W N E R D R AW VA R I A B L E使父窗口必须绘制该控件,并且每项的垂直大小可变L B S _ H A S S T R I N G S使对于自绘制的控件,该控件在内部维护字符串,以便还能设置或获得控件字符串L B S _ E X T E N D E D S E L使同L B S _ M U LT I P L E S E L一样,一次可以选择多项,但是用 L B S _ E X T EN D E D S E L,用户必须按下S h i f t和C o n t r o l键进行多项选择;用 L B S _ M U LT I P L E S E L,用户只需单击一个项说明W S _ H S C R O L L风格只有在设置 L B S _ M U LT I C O L U M N风格时才起作用,但这时W S _ V S C R O L L不起作用。通常,一个列表框重载你为它设置的大小,以便能避免控件底部部分地遮蔽列表的最后一行;要关掉该功能,使用L B S _ N O I N T E R G R A L H E I G H T风格。这里所显示的列表框有一个附加的边框;在默认设置下,列表框没有边框。A.1.5 滚动条用Windows API创建滚动条HWND CreateWindowEx(dwExStyle,SCROLLBAR,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建滚动条CScrollBar m_scrollbar;/usually embedded in parent classm _ s c r o l l b a r.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-5)说明与Wi n d o w s在任何一个窗口的非客户区绘制滚动条不同,事实上,这些滚动条自身是308第五部分 附录下载图A-5 滚动条控件风格一些完整的子窗口。一个父窗口可以有它自己的滚动条和任意数量的滚动条控件窗口;但是,非客户区滚动条和控件窗口滚动条都用 W M _ H S C R O L L和W M _ V S C R O L L窗口消息回传到父窗口;要在父窗口中区别它们,需要在消息的 l P a r a m中查看滚动条句柄,当为该消息添加一个处理函数时,M F C把该滚动条句柄封装到一个C S c r o l l B a r类中。当单独设置S B S _ H O R Z和S B S _ V E RT时,滚动条的宽度和高度可以是任意值;当单独设置S B S _ TO PA L I G N,S B S _ B O T TO M A L I G N等,滚动条设置一个标准宽度,这可以在图A-5中看见。创建具有S B S _ S I Z E G R I P风格的滚动条控件,允许用户拖动控件所在的窗口改变其大小,而不管控件位于窗口的什么位置。A.1.6 组合框用Windows API创建组合框HWND CreateWindowEx(dwExStyle,COMBO-BOX,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,N U L L);用M F C创建组合框CComboBox m_combobox;/usuallyembedded in parent classm _ c o m b o b o x.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-6)初始化控件添加一个字符串到一个组合框,所用语句如下:m_combobox.AddString(Combo 1);其他风格:C B S _ O W N E R D R AW F I X E D父窗口绘制该控件,并且每项具有相同高度C B S _ O W N E R D R AW VA R I A B L E父窗口绘制该控件,但每项具有不同的高度C B S _ H A S S T R I N G S即使该控件是由父窗口绘制的,但它仍然为每个项保持一个字符串C B S _ A U TO H S C R O L L如果编辑框有效,当输入文本超出窗口边界时,输入文本自动向左滚动C B S _ S O RT列表按字母顺序排列说明组合框实际上控制两个完全属于它自己的控件窗口:一个编辑框的编辑控件和一个列表框的C o m b o L B o x控件。因为一些窗口消息,如鼠标单击,只传递到这两个控件之一,而不进入组合框,因此,有时需要直接子分类它们,这只要通过搜索该组合框之下的子窗口即可。然而,如果使用下拉风格,列表框控件只有在下拉的情况下才可用。附录A 控件窗口风格309下载图A-6 组合框控件风格A.2 Windows 95/NT及以上版本提供的控件窗口A.2.1 多信息编辑框用Windows API创建多信息编辑控件HWND CreateWindowEx(dwExStyle,RICHEDIT,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建多信息编辑框CRichEditCtrl m_richeditctrl;/usually embedded in/parent classm _ r i c h e d i t c t r l.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);说明多信息编辑框使用大部分与编辑框相同的窗口风格;它们之间的主要不同在于多信息编辑框可以处理多信息文本格式文件,允许文本一行中有多种颜色、风格和字体大小。然而,要使用该功能,不能用 S e t Wi n d o w Text()或G e t Wi n d o w Text()输入文本到窗口中,而需要用成员函数 StreamIn()和StreamOut()。事实上,还是可以使用S e t Wi n d o w Text()和G e t Wi n d o w Text()但是,RT F格式用来改变文本格式的任何文本顺序将会变得可见。A.2.2 列表控件用Windows API创建列表控件HWND CreateW i n d o w E x(d w E x S t y l e,S y s L i s t View32,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,N U L L);用M F C创建列表控件CListCtrl m_listctrl;/usually embeddedin parent classm _ l i s t c t r l.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-7)初始化控件添加列到一个列表控件,用:m_listctrl.InsertColumn(0,Column 1,LV C F M T _ L E F T,w i d t h,0);m_listctrl.InsertColumn(1,Column 1,LV C F M T _ R I G H T,w i d t h,1);添加列表控件可用的图像,用:m_listctrl.SetImageList(&m_imageLarge,LV S I L _ N O R M A L);m_listctrl.SetImageList(&m_imageSmall,LV S I L _ S M A L L);m_listctrl.SetImageList(&m_imageState,LV S I L _ S TAT E);310第五部分 附录下载图A-7 列表控件风格添加新的一行,用:LV_ITEM lvi;lvi.mask=LVIF_TEXT|LV I F _ I M A G E;lvi.iItem=0;lvi.iSubItem=0;l v i.p s z Text=Item 1;lvi.iImage=1;int inx=m_listctrl.InsertItem(&lvi);添加一项到一列中,用:m _ l i s t c t r l.S e t I t e m Te x t(i n x,1,Sub Item 1);改变一行的状态图像,用:m_listctrl.SetItemState(inx,INDEXTO S TAT E I M A G E M A S K(1),LV I S _ S TAT E I M A G E M A S K);要设置扩展风格,如LV S _ E X _ G R I D L I N E S,用:m _ l i s t c t r l.S e n d M e s s a g e(LV M _ S E T E X T E N D E D L I S T V I E W S T Y L E,0,LV S _ E X _ G R I D L I N E S|LV S _ E X _ F U L L R O W S E L E C T);其他风格LV S _ S I N G L E S E L一一次只允许选中一项LV S _ S H O W S E L A LWAY S一即使该窗口失去焦点,也使选项保持选中状态LV S _ S O RTA S C E N D I N G一按升序排列列表项LV S _ S O RT D E S C E N D I N G一按降序排列列表项LV S _ E D I T L A B E L S一允许列表项在适当位置被编辑;当用户做完编辑时,父窗口将会收到一个LV N _ E N D L A B E L E D I T消息LV S _ N O S C R O L L一禁用滚动LV S _ O W N E R D R AW F I X E D一父窗口负责绘制一项说明列宽以像素为单位,一种将字符宽转换为像素的快速方法是:CDC*dc=GetDC();TEXTMETRIC tm;d c-G e t Te x t M e t r i c s(&t m);R e l e a s e D C(d c);这时,当指定列宽时,可以用*t m.t m Av e C h a r Wi d t h字符数。指定为控件使用的图像列表必须在位,否则将不显示任何图像,但控件还是能像没发生任何错误一样工作。保持图像列表可用的最佳方法是把图像列表插入到该控件的父窗口类中。class CDialog:CImageList m_imagelist;A.2.3 扩展组合框用Windows API创建一个扩展组合框附录A 控件窗口风格311下载HWND CreateWindowEx(dwExStyle,ComboBoxEx32,Te x t ,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建扩展组合框CComboBoxEx m_comboex;/usually embedded in parent classm _ c o m b o e x.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-8)图A-8 扩展组合框控件风格初始化控件添加控件可用的图像,用:m _ c o m b o e x.S e t I m a g e L i s t(&m _ i m a g e L i s t);添加项到控件,用:COMBOBOXEXITEM cbei;cbei.mask=CBEIF_INDENT|CBEIF_TEXT|CBEIF_IMAGE;cbei.iItem =0;c b e i.p s z Text =pszItem1;c b e i.c c h TextMax =sizeof(pszItem1);cbei.iImage =0;/IMAGE TO DISPLAYcbei.iSelectedImage=1;/IMAGE TO DISPLAY WHEN SELECTEDcbei.iIndent =0;/#OF PIXELS TO INDENTm _ c o m b o e x.I n s e r t I t e m(&c b e i);说明扩展组合框使用大部分与一般组合框相同的风格,但可以在它的项的边上指定一个图像,并且项可以缩进一个像素。扩展组合框相对较新,一些 M F C版还不能支持;然而,还是可以用 Windows API调用访问它,并用窗口消息与它通信。应负责维护图像列表对象,即使把图像列表对象放入该控件。如果不这样做,图像将不显示。但不会从M F C或Wi n d o w s发送错误消息。A.2.4 动画控件用Windows API创建动画控件HWND CreateWindowEx(dwExStyle,SysAnimate32,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建动画控件CAnimateCtrl m_animate;/usually embedded in parent classm _ a n i m a t e.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);312第五部分 附录下载可视风格A C S _ C E N T E R把.a v i图像置于控件中心A C S _ T R A N S PA R E N T绘制没有背景色的控件,使被绘制的控件直接显示在父窗口中A C S _ A U TO P L AY打开.a v i文件时,自动开始播放A C S _ T I M E R通常,.a v i文件被另一个线程回放;该风格使回放不需要线程初始化控件打开并播放一个.a v i文件,用:m _ a n i m a t e.O p e n(f i l e n a m e );m_animate.Play(0,/from frame(0=start)-1,/to frame(-1=end)1);/number of replays(-1=forever)停止并关闭一个.a v i文件,用:m _ a n i m a t e.S t o p();m _ a n i m a t e.C l o s e();说明参见例9和例5 7。A.2.5 滑块控件用Windows API创建滑块控件HWND CreateWindowEx(dwExStyle,msctls_ trackbar32,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建滑块控件CSliderCtrl m_slider;/usually embedded in parent classm _ s l i d e r.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-9)其他风格T B S _ A U TO T I C K S为控件范围内的每一个增量都创建刻度线T B S _ TO O LT I P S当鼠标压住该控件时,弹出一个弹出窗口,显示滑块的当前位置说明滑块(跟踪条)控件使用的W M _ V S C R O L L和W M _ H S C R O L L消息回传到父窗口,这与滚动条控件窗口相同。OnHScroll()和OnVScroll()消息处理函数把该控件封装到 C S c r o l l B a r类中,但它真正封装的是一个滑块控件,还需使该类嵌入 C S l i d e r C t r l类中。A.2.6 树式视图控件用Windows API创建树式视图控件HWND CreateWindowEx(dwExStyle,SysTr e e View32,Te x t ,附录A 控件窗口风格313下载图A-9 滑块控件风格WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建树式视图控件C TreeCtrl m_treectrl;/usually embedded in parent classm _ t r e e c t r l.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-1 0)图A-10 树式控件风格初始化控件要添加一个可以在该控件中显示的图像列表(图A-1 0中看到的方块是LV S I L _ N O R M A L图像,星形是LV S I L _ S TAT E图像),用:m_treectrl.SetImageList(&m_imageSmall,LV S I L _ N O R M A L);m_treectrl.SetImageList(&m_imageState,LV S I L _ S TAT E);添加一项到列表中,用:T V _ I N S E RTSTRUCT tvi;tvi.item.mask=TVIF_IMAGE|TVIF_TEXT|TVIF_SELECTEDIMAGE;tvi.hParent=TVI_ROOT;tvi.hInsertAfter=TVI_LAST;tvi.item.iImage=tvi.item.iSelectedImage=0;t v i.i t e m.p s z Text=pszItem1;tvi.item.stateMask=TVIS_STAT E I M A G E M A S K;tvi.item.state=INDEXTO S TAT E I M A G E M A S K(1);HTREEITEM hTreeRoot=m_treectrl.InsertItem(&tvi);其他风格T V S _ E D I T L A B E L S允许用户直接编辑控件中的项T V S _ D I S A B L E D R A G D R O P禁止项从该控件拖走T V S _ S H O W S E L A LWAY S使选项保持被选中状态,即使该控件失去焦点时也保持T V S _ T R A C K S E L E C T当鼠标移到控件上时,使控件作出可视反应说明在前面的实例中可以看到,默认情况下树式控件没有边框;用户可以用边框窗口风格为它指定一个边框。参见本附录的下个例子有关边框窗口风格的内容。314第五部分 附录下载A.2.7 微调按钮控件用Windows API创建微调按钮控件HWND CreateWindowEx(dwExStyle,msctls_updown32,Te x t ,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建微调按钮控件CSpinButtonCtrl m_spin;/usually embedded in parent classm _ s p i n.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-11)其他风格U D S _ W R A P在在调整值大于控件范围的尾值或小于初始值时,使该“伙伴”窗口值设为初始值或尾值D S _ N O T H O U S A N D S在在初始化该值时,不在千位之间插入逗号或句号U D S _ A U TO B U D D Y在自动选择父窗口中的前一个窗口作为它的“伙伴”窗口;否则,必须使用C s p i n-B u t t o n C t r l的SetBuddy()函数。微调控件在该伙伴窗口中增加或减少该值U D S _ S E T B U D D Y I N T在使该控件用它当前数值的一个格式化文本串版本更新它的“伙伴”窗口U D S _ A L I G N R I G H T在使该控件与“伙伴”窗口的右边对齐U D S _ A L I G N L E F TU D S _ A R R O W K E Y S在使箭头键可以增加或减少该控件U D S _ H O T T R A C K在当鼠标移到该控件时,使该控件作出可视反应说明微调(S p i n)或上/下(U p/D o w n)按钮控件主要用来增加一个编辑控件。在这种情况下,该按钮叫做一个“伙伴”按钮。在默认的窗口风格下,按钮可以是任意高度,但只有一个标准宽度。然而,用U D S-H O R Z风格,可以设置如图A-11所示的任意大小。A.2.8 进度指示控件风格用Windows API创建进度指示控件风格HWND CreateWindowEx(dwExStyle,msctls_progress32,Te x t ,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建进度指示控件风格CProgressCtrl m_progress;/usually embedded in parent classm _ p r o g r e s s.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-1 2)初始化控件设置控件表示的范围,用:m _ p r o g r e s s.S e t R a n g e(0,1 0 0);设置控件的真实进度,用:m _ p r o g r e s s.S e t P o s(3 3);附录A 控件窗口风格315下载图A-11 微调控件风格图A-12 进度指示控件风格说明你也许还曾见过这样的进度指示控件,即在控件的中央显示数字指示进度。这里没有自动实现该功能的窗口风格,但只要创建一个普通窗口,然后重载W M _ PA I N T消息,用Rectangle()绘制条,以及用TextOut()输出百分数。A.2.9 标题控件风格用Windows API创建标题控件风格HWND CreateWindowEx(dwExStyle,SysHeader32,WS_CHILD|WS_VISIBLE|dwStyle x,y,width,height,hWndParent,(HMENU)id,hInstance,NULL);用M F C创建标题控件风格CHeaderCtrl m_header;/usually embedded in parent classm _ h e a d e r.C r e a t e(WS_VISIBLE|WS_CHILD|dwStyle,rect,pParentWnd,id);可视风格(见图A-1 3)图A-13 标题控件风格初始化控件添加一个文本列标题(如图A-1 3所示的第1、2列),用:HD_ITEM hdi;h d i.m a s k=H D I _ T E X T|H D I _ W I D T H|H D I _ F O R M AT;h d i.f m t=H D F _ C E N T E R|H D F _ S T R I N G;hdi.cxy=100;/column width in pixelsh d i.p s z Text=pszHeader1;/texth d i.c c h Te x t M a x=s i z e o f(p s z H e a d e r 1);m _ h e a d e r.InsertItem(0,&hdi);/0=column 1添加一个位图标题(如图A-1 3所示的第3列),用:hdi.mask=HDI_FORMAT|HDI_WIDTH|HDI_BITMAP;hdi.fmt=HDF_CENTER|HDF_BITMAP;hdi.cxy=100;/column width in pixelshdi.hbm=HBITMAP(m_bitmap);m _ h e a d e r.I n s e r t I t e m(2,&h d i);添加一个具有图标的文本列(如图A-1 3第4列所示),用:m _ h e a d e r.S e t I m a g e L i s t(&m _ i m a g e L i s t);hdi.mask=HDI_IMAGE|HDI_FORMAT|HDI_TEXT;hdi.fmt=HDF_LEFT|HDF_IMAGE|HDF_STRING;h d i.p s z Text=pszHeader4;/texth d i.c c h Te x t M a x=s i z e o f(p s z H e a d e r 4);hdi.iImage=1;/image number in image listhdi.cxy=100;/column width in pixelsm _ h e a d e r.I n s e r t I t e m(3,&h d i);316第五部分 附录下载其他风格H D S _ D R A G D R O P允许用户改变列标题H D S _ F U L L D R A G使控件显示整个标题,即使用户重新调其大小时也这样H D S _ H O T T R A C K当鼠标移到它的上面时,使控件作出可视反应说明单独一个标题控件并无多大意义,它的重要性在于报表模式下作为列表控件的表题。列表控件一旦被创建,可以用下面的代码捆绑一个 C H e a d e r C t r l类到被那个列表控件使用的标题控件。CListCtrl m_listctrl;m _ l i s t c t r l.C r e a t e(.);CHeaderCtrl*pHeader=m_listctrl.GetHeaderCtrl();然后用ModifyStyle()和前面所列的风格改变列表控件标题的风格。GetHeaderCtrl()是C L i s t C t r l的新成员函数,早期的M F C版本可能没有;如果这样的话,还是可以找到标题控件的句柄,通过搜索列表控件的子窗口找到 S y s H e a d e r 3 2窗口类,然后把它添加到C H e a d e r C t r l类。即使已经在标题控件中设置了一个图像,还需把它保存在内存中;通常,可以通过使该图像列表成为父窗口的一个成员变量完成。A.2.10 选项卡控件用Windows API