WTL 网格






3.79/5 (10投票s)
2001年10月8日
1分钟阅读

188347

4838
一个 WTL 网格(真的)。
引言
在使用 WTL 一段时间后,我开发了我在所做的项目类型中最缺失的控件:一个网格。
这个网格是从 CScrollWindowImpl
派生而来,从零开始编写,具有以下特性:
- 网格是一个
CString
的向量的向量。 - 它有一个可选的工具栏,用于添加带有工具提示的按钮,用于编辑操作(参见截图)。
- 可调整大小的列标题
- 使用编辑框、组合框或复选框进行就地编辑。
- 可折叠的树状行为。
- 可通过派生监听器类覆盖行为(
BeforeEdit
、AfterEdit
、CellRendering
等)。
#include "WtlGrid.h" WtlGridWrapper grid; grid.Create(*this,rcDefault,NULL,WS_CHILD|WS_VISIBLE); grid.construct(); //setup grid.listener(new LevelListener); //add a listener to overwrite some behavior grid.vertical_delimiter(true); //show vertical lines grid.horizontal_delimiter(true); grid.column_header(true); //show header grid.toolbar(); //show toolbar grid.m_toolbar.AddButton(IDB_NEW,true,"New"); //resource ID and tooltip grid.m_toolbar.AddButton(IDB_DELETE,false,"Delete"); grid.m_toolbar.AddButton(IDB_UP,true,"Up"); grid.m_toolbar.AddButton(IDB_DOWN,true,"Down"); grid.m_toolbar.AddButton(IDB_TOP,true,"Top"); grid.m_toolbar.AddButton(IDB_BOTTOM,true,"Bottom"); grid.m_toolbar.enable_button(1,false); grid.header_height(25); grid.selection_mode(); //now add the columns (header,width,alignment,Resource // ID,render mode,edit mode,can grow, can be selected) grid.add_column("Name",-1,WtlDC::left,-1, WtlGridCell::rstring,WtlGridColumn::edit,true,true); grid.add_column("Label",-1,WtlDC::left,-1, WtlGridCell::rstring, WtlGridColumn::edit,true,true); grid.add_column("",25,WtlDC::left,IDB_VISIBLE, WtlGridCell::rcheck, WtlGridColumn::check,false, true,IDB_SELECTED); //to add rows, add a vector of cstring vector<CString> buf; buf.push_back("whatever"); ... grid->add_row(buf,lev);
内部代码也设计得易于理解,你会发现以下类:
|
一个单元格值,存储为 |
|
一个带有渲染模式的单元格。 |
|
一列,带有标题等。 |
|
列集合,一个列的向量。 |
|
网格行,包含一个 |
|
行集合。 |
|
控件本身,包含列和行。 |
|
工具栏和列标题的包装控件,这是您包含在应用程序中的控件。 |
一些行为,特别是单元格的渲染和编辑方式,可以通过覆盖监听器类来更改,例如:
class LevelListener : public WtlGridListener { public : LevelListener(); virtual bool after_edit(WtlGrid *grid, CString &old_value, int row_nb, int column_nb,void *user,bool add); virtual bool after_select(WtlGrid *grid,int row_nb,int column_nb,void *user); virtual bool toolbar_button(WtlGrid *grid,int button_nb,void *user); virtual bool header_select(WtlGrid *grid,int header_nb,void *user); virtual bool render(WtlGrid *grid,CDCHandle dc, CRect &rc, WtlGridRow *row,WtlGridCell *cell,void *user); virtual WtlGridColumn::e_edit_mode before_edit(WtlGrid *grid, int row_nb, int column_nb, void *user); };
缺少什么
- 显然,网格应该可以绑定到数据库,并以虚拟方式进行(不将所有记录加载到内存中),这将是我的下一步行动。
- 很多特性…