RRGrid控件源码
早些时间从网上下载了一个GRID控件源码,想花两天改改来用,但是那个外国人写得太粗糙了,结果就全部重写了.我留着也没用,把源码放上来,给有心的朋友借鉴.经常在网上下东西,这回也做点贡献. 这个是原来的链接:http://www.codeguru.com/Cpp/controls/controls/gridcontrol/article.php/c5277 有兴趣的朋友可以比照着借鉴一下<br>转载的话请注明出处,并知会我一声
RRGRID
下午发的那个RRGrid有个地方的测试没有取消,会造成内存泄漏,再发一个<br><br>顺便把头文件发出来<br><br>#define RR_GRIDCTRL_CLASS "RRGridCtrl"<br><br>//############################定义Grid的风格<br>//GS_VISIBLE/GS_NO_COLHEAD/GS_NO_ROWHEAD创建时起作用<br>#define GS_VISIBLE 0x00000001L<br>#define GS_NO_COLHEAD 0x00000002L<br>#define GS_NO_ROWHEAD 0x00000004L<br><br><br>#define GS_READONLY 0x00001000L<br>//是否调整Grid高度,以显示完整的行高<br>#define GS_GRIDHIGH_NOADJUST 0x00002000L<br>//选择行是否可见(选择行高亮--可见)<br>#define GS_SELROW_INVISIBLE 0x00004000L<br><br>//是否使用Insert键插入行<br>#define GS_CANCEL_INSKEY 0x00010000L<br>//是否使用Delete键删除行<br>#define GS_CANCEL_DELKEY 0x00020000L<br>//是否在最后行被选择时按Enter键增加行<br>#define GS_CANCEL_ENTER_INSERT 0x00040000L<br><br>//是否拓展最后列到右边界<br>#define GS_LASTCOL_NOEXTEND 0x00100000L <br>//列宽是否可变<br>#define GS_COLUMN_NORESIZE 0x00200000L<br>//列头(第0行)是否显示ABCDE标识<br>#define GS_COLHEAD_CUSTOM 0x00400000L<br>//行头(第0列)是否显示12345标识<br>#define GS_ROWHEAD_CUSTOM 0x00800000L<br><br><br><br><br><br><br><br>//####################通知码(给父窗口发通知消息的通知码)<br><br>//进入编辑后发通知<br>#define GN_ENTRY_CELL_EDITBOX 0x0001<br><br><br>//退出编辑前发通知<br>//GridNotify_T返回值为非0,将不会退出本单元的编辑<br>#define GN_EXIT_CELL_EDITBOX 0x0002<br><br>//在行改变之前发出通知,如果GridNotify_T返回非0,将不会改变行<br>//如果是在编辑中,则不能进入新行编辑<br>#define GN_ROW_CHANGED 0x0003<br><br>//Grid由外部得到焦点<br>#define GN_GET_FOCUS 0x0004<br>//焦点从Grid里移到外部<br>#define GN_LOST_FOCUS 0x0005<br><br>//增加新行前发通知给父窗口<br>//GridNotify_T返回值为非0,将不完成本次操作<br>#define GN_INSERT_ROW 0x0006 <br><br>//删除行前发通知给父窗口<br>//GridNotify_T返回值为非0,将不完成本次操作<br>#define GN_DELETE_ROW 0x0007<br><br>//单击单元<br>//GridNotify_T返回值为非0,将不会进行默认操作<br>//默认操作:在编辑中,单击另一数据单元,将转到另一单元编辑;<br>//在编辑中,单击发生在数据单元外,将退出编辑<br>//在非编辑中,单击将使该行变成选择状态<br>#define GN_CLICK_CELL 0x0008<br><br>//双击单元<br>//GridNotify_T返回值为非0,将不会进行默认操作<br>//默认:非编辑时,在数据单元上双击将进入该单元编辑<br>#define GN_DCLICK_CELL 0x0009<br><br><br><br><br><br>//########################################自定义消息<br><br>#define WM_GRID_USER_INNER WM_USER<br><br>#define WM_GRID_USER_OUTER WM_USER+20<br><br>//WM_GRID_USER_OUTER+1 -- WM_GRID_USER_OUTER+19内部使用 <br><br>//Grid往父窗口发的通知消息<br>//wParam --通知码/控件id组成<br>//lParam --与父窗口进行信息交流的结构指针(GridNotify_T*)<br>#define GM_GRID_NOTIFY WM_GRID_USER_OUTER+1<br><br>//wParam -- TRUE -- 只读;FALSE --可编辑;lParam -- 未用<br>#define GM_GRID_SET_READONLY WM_GRID_USER_OUTER + 2<br><br>//设置列宽是否允许变化wParam: 0--不允许 1--允许;lParam:未用<br>#define GM_GRID_ALLOW_COL_RESIZE WM_GRID_USER_OUTER + 3<br><br>//清除Grid所有单元文本<br>//wParam /lParam -- 未用<br>#define GM_GRID_CLEAR_TEXT WM_GRID_USER_OUTER + 4<br><br>//返回值不包括第0行<br>#define GM_GRID_GET_ROWS WM_GRID_USER_OUTER + 5<br><br>//返回值不包括第0列<br>#define GM_GRID_GET_COLS WM_GRID_USER_OUTER + 6<br><br>//GM_GRID_SET_CELL_COUNT (重置Grid行列数)<br>//重置单元行列数,Grid现有数据将丢失<br>//wParam -- 行数 lParam -- 列数(这两个数值不包括0行/0列)<br>#define GM_GRID_SET_CELL_COUNT WM_GRID_USER_OUTER +7<br><br><br>//增加新行wParam -- 新行号(不能插入第0行)<br>#define GM_GRID_INSERT_ROW WM_GRID_USER_OUTER+8<br><br>//删除行(不能删除第0行,要删除/显示第0行/第0列,可将其相应宽高置为0)<br>//(要删除标题行可将标题文本重置为"\0")<br>#define GM_GRID_DELETE_ROW WM_GRID_USER_OUTER+9<br><br>#define GM_GRID_GET_STYLE WM_GRID_USER_OUTER+10<br><br>//设置GRID 风格,wParam -- 风格<br>#define GM_GRID_SET_STYLE WM_GRID_USER_OUTER+11 <br><br>//进入指定单元编辑<br>//慎用,避免死循环(系统本身已提供了一套编辑/退出编辑机制)<br>//若在GN_CLICK_CELL/GN_DCLICK_CELL通知响应中取消了默认操作,可以尝试使用<br>#define GM_GRID_ENTRY_EDITBOX WM_GRID_USER_OUTER+12 <br><br><br><br>//退出单元编辑<br>//慎用,避免死循环(系统本身已提供了一套编辑/退出编辑机制)<br>//若在GN_CLICK_CELL/GN_DCLICK_CELL通知响应中取消了默认操作,可以尝试使用<br>#define GM_GRID_EXIT_EDITBOX WM_GRID_USER_OUTER+13 <br><br><br>//wParam -- 单元(GridCell_T类型指针) ;lParam --文本字符串<br>#define GM_SET_CELL_TEXT WM_GRID_USER_OUTER + 21 //或RR_GridCtrl_SetCellText<br><br>//wParam -- 单元(GridCell_T类型指针) ;<br>//lParam --缓存区,为避免数据溢出,需先调用GM_GET_CELL_TEXT_LEN得到数据长度以设置缓存区<br>#define GM_GET_CELL_TEXT WM_GRID_USER_OUTER + 22 //或RR_GridCtrl_GetCellText<br><br>//发送GM_GET_CELL_TEXT之前调用,得到数据长度来设置缓冲区<br>//缓存区最小大小需在该消息返回值基础上+1('\0')<br>//wParam -- GridCell_T类型指针;lParam -- 未用<br>#define GM_GET_CELL_TEXT_LEN WM_GRID_USER_OUTER+23<br><br>//wParam --列号(从0开始,0--对应第0列)<br>#define GM_GET_COL_WIDTH WM_GRID_USER_OUTER + 24<br><br>//返回行高:wParam/lParam 未用<br>#define GM_GET_ROW_HEIGHT WM_GRID_USER_OUTER + 25<br><br>//返回第0行高度:wParam/lParam 未用<br>#define GM_GET_HEADERROW_HEIGHT WM_GRID_USER_OUTER + 26<br> <br>//返回当前选择的行号:wParam/lParam 未用<br>#define GM_GET_SELECT_ROW WM_GRID_USER_OUTER + 27<br><br>//wParam --新高度(如果<=0,则没有第0行)<br>#define GM_SET_HEADER_ROW_HEIGHT WM_GRID_USER_OUTER + 28<br><br>//wParam --新高度<br>#define GM_SET_ROW_HEIGHT WM_GRID_USER_OUTER + 29<br><br>//wParam -- 列号lParam 新宽度<br>#define GM_SET_COL_WIDTH WM_GRID_USER_OUTER + 30<br><br><br>//得到当前编辑状态:返回TRUE -- 正在编辑;FALSE --非编辑状态;<br>//wParam :未使用<br>//lParam : GridCell_T指针,返回当前正在编辑的单元<br>#define GM_GET_EDIT_STATUS WM_GRID_USER_OUTER+31<br><br><br>//设置栅格线颜色wParam -- RGB值(COLORREF)<br>#define GM_SET_GRID_LINE_COLOR WM_GRID_USER_OUTER + 32<br><br>//设置选择行在Grid没有焦点时前景色和背景色<br>//wParam -- 前景色,lParam -- 背景色<br>#define GM_SET_NOFOCUS_SELLINE_COLOR WM_GRID_USER_OUTER + 33<br><br>//设置选择行在Grid有焦点时前景色和背景色<br>#define GM_SET_FOCUS_SELLINE_COLOR WM_GRID_USER_OUTER + 34<br><br>//设置当Grid只读时的前景色和背景色<br>#define GM_SET_READONLY_COLOR WM_GRID_USER_OUTER + 35<br><br>//设置Grid背景色和前景色<br>#define GM_SET_GRID_COLOR WM_GRID_USER_OUTER + 36 <br><br>#define GM_SET_TITLE_FONT WM_GRID_USER_OUTER + 37<br><br>#define GM_SET_HEADING_FONT WM_GRID_USER_OUTER + 38<br><br>#define GM_SET_BODY_FONT WM_GRID_USER_OUTER + 39 <br><br><br>//得到GRID修改标志<br>//返回值0 --未被修改,非0--被修改<br>#define GM_GET_GRID_MODIFY WM_GRID_USER_OUTER + 40<br><br>//设置GRID内容修改标志:lParam --值<br>#define GM_SET_GRID_MODIFY WM_GRID_USER_OUTER + 41 <br><br>//得到行修改标志:wParam --行号<br>//可以在GN_ROW_CHANGED通知中获得该标志<br>#define GM_GET_ROW_MODIFY WM_GRID_USER_OUTER + 42<br><br>//设置行修改标志:wParam--行号;lParam --值<br>#define GM_SET_ROW_MODIFY WM_GRID_USER_OUTER + 43<br><br>//得到单元修改标志:wParam -- GridCell_T指针<br>//退出编辑之后该标志是无效的<br>//可以在GN_EXIT_CELL_EDITBOX通知中获得该标志<br>#define GM_GET_CELL_MODIFY WM_GRID_USER_OUTER + 44<br><br>//设置单元修改标志 :wParam -- GridCell_T指针;lParam --值<br>#define GM_SET_CELL_MODIFY WM_GRID_USER_OUTER + 45<br><br><br>typedef struct _tagGridCell <br>{<br> int row;<br> int col;<br>}GridCell_T;<br><br>typedef struct _tagGridNotifyStruct<br>{<br> HWND hwndFrom;//Window handle to the control sending a message<br> UINT idFrom;//Identifier of the control sending a message. <br> UINT code;//Notification code<br> LPARAM param;<br> <br> /*父窗口消息响应中的返回值(用这个变量返回值比直接<br> 用SendMessage返回值可靠,检测到该值未被改变,这可能是<br> 父窗口没有响应该消息或消息响应有意保持Grid后续的默<br> 认处理,但消息返回后Grid都可以放心地按默认处理)*/<br> int retVal;<br> <br> <br>}GridNotify_T;<br><br>extern "C"_declspec(dllimport)<br>BOOL RR_GridCtrl_Register(HINSTANCE); <br><br>extern "C"_declspec(dllimport)<br>BOOL RR_GridCtrl_Register(HINSTANCE);<br><br>extern "C"_declspec(dllimport)<br>void RR_GridCtrl_SetCell(GridCell_T *cell,int row, int col);<br><br>//比较两个单元,行列号相等返回TRUE,否则返回FALSE<br>extern "C"_declspec(dllimport)<br>BOOL RR_GridCtrl_CmpCell(const GridCell_T *pCell1,const GridCell_T *pCell2);<br><br>extern "C"_declspec(dllimport)<br>BOOL RR_GridCtrl_GetCellText(HWND hGrid,int row ,int col ,char *pszBuf,int buf_size);<br><br>extern "C"_declspec(dllimport)<br>BOOL RR_GridCtrl_SetCellText(HWND hGrid,int row ,int col ,char *pszText);<br><br>extern "C"_declspec(dllimport)<br>HWND RR_Create_GridCtrl(DWORD dwStyle,HWND hWndParent,RECT *pGridRect, int nId,char szGridTitle[],int rows,int cols);<br><br>extern "C"_declspec(dllimport)<br>BOOL RR_Load_GridCtrl(char szFile[],HWND hGrid);<br><br>extern "C"_declspec(dllimport)<br>BOOL RR_Save_GridCtrl(char szFile[],HWND hGrid);<br><br>extern "C"_declspec(dllimport)<br>HWND RR_GetDlgGridItem(HWND hDlg,int id);<br><br>
RRGRID
VC SDK 写的DataGrid控件,无需使用数据库(当然你也可以将数据读出来传到数据库中)<br>支持可变列宽,列头行头自定义,行插入、删除,进入单元编辑/退出单元编辑/改变选择行/行插入/行删除等各类通知事件,支持单元修改标志,行修改标志,控件修改标志;风格/颜色/字体自定义;响应鼠标单击双击事件进行编辑风格自定义...<br><br>有问题或需求可以给我发邮件,有时间的情况下,我会考虑帮大家实现