65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL 网格

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.79/5 (10投票s)

2001年10月8日

1分钟阅读

viewsIcon

188347

downloadIcon

4838

一个 WTL 网格(真的)。

Sample Image - WtlGrid.gif

引言

在使用 WTL 一段时间后,我开发了我在所做的项目类型中最缺失的控件:一个网格。
这个网格是从 CScrollWindowImpl 派生而来,从零开始编写,具有以下特性:

  • 网格是一个 CString 的向量的向量。
  • 它有一个可选的工具栏,用于添加带有工具提示的按钮,用于编辑操作(参见截图)。
  • 可调整大小的列标题
  • 使用编辑框、组合框或复选框进行就地编辑。
  • 可折叠的树状行为。
  • 可通过派生监听器类覆盖行为(BeforeEditAfterEditCellRendering 等)。
使用起来应该相当简单
#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);

内部代码也设计得易于理解,你会发现以下类:

WtlGridValue

一个单元格值,存储为 CString

WtlGridCell

一个带有渲染模式的单元格。

WtlGridColumn

一列,带有标题等。

WtlGridColumns

列集合,一个列的向量。

WtlGridRow

网格行,包含一个 WtlGridCell 的向量。

WtlGridRows

行集合。

WtlGrid

控件本身,包含列和行。

WtlGridWrapper

工具栏和列标题的包装控件,这是您包含在应用程序中的控件。

一些行为,特别是单元格的渲染和编辑方式,可以通过覆盖监听器类来更改,例如:

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);
};

缺少什么

  • 显然,网格应该可以绑定到数据库,并以虚拟方式进行(不将所有记录加载到内存中),这将是我的下一步行动。
  • 很多特性…
我将很乐意收到关于此代码的评论和改进建议,请享受…
© . All rights reserved.