在界面编程中,经常遇到修改CListBox和CComboBox窗口式样(style)的问题.可恼的时,一旦窗口创建后(Creation),没有办法可以修改窗口式样.也就是说,ModifyStyle()和SetWindowLong()都不起作用(但调用会成功).如下面的代码:
// you can not change the style of a list box dynamically, after creation.
A. Use ModifyStyle()
m_ListBox.ModifyStyle(0,WS_HSCROLL|LBS_MULTICOLUMN);
B. Use SetWindowLong()
long style=GetWindowLong(m_ListBox,GWL_STYLE);
style|=LBS_MULTICOLUMN;
style|=WS_HSCROLL;
SetWindowLong(m_ListBox1,GWL_STYLE,style);
而在模式对话框运用中,系统是不产生OnCreate()消息的,所以就没机会修改窗口式样了.
1. 关于"CListBox"的多列功能:
当使用该功能时”垂直滚动”将不起作用,这是因为第一列后的列要等前一列的行用完后才开始使用,这很象报纸上的”栏”,有时也叫”蛇形列(snaking column)”.如果窗口只有一行, 多列显示的list象一个横向list.除非一定要这样做,不如用TabStop功能.
2. 关于"CComboBox"中list的多列功能:
CComboBox其实有3个窗口,分别为combo,edit,list.要得到edit和list的窗口句柄不容易可以参考”http://support.microsoft.com/default.aspx?scid=kb;en-us;Q174667”. 在”.net”下可以使用GetComboBoxInfo(),可惜VC++6.0下无这个函数.
// .net
//typedef struct ComboBoxInfo_tag
//{
//int cbSize;
//RECT rcItem;
//RECT rcButton;
//int stateButton;
//HWND hwndCombo;
//HWND hwndEdit;
//HWND hwndList; // That's what I'm interested in....
//} COMBOBOXINFO,*PCOMBOBOXINFO;
//[DllImport("user32")] public static extern bool
//BOOL GetComboBoxInfo(HWND hwndCombo,COMBOBOXINFO& info);
// COMBOBOXINFO info;
// BOOL bl=GetComboBoxInfo(this->m_hWnd, info);
CComboBox中的listbox叫”COMBOLBOX”,不过跟CLlistBox好像一样(?).
3. 下面说一下对CComboBox中的listbox修改式样的方法: