通过所有者绘制的列表视图(2)
所有者绘制列表视图的基础已在前一页中说明。本页将展示如何在所有者绘制列表视图中显示数据库表数据。
1、访问日志 正如在另一个页面中所述,本网站的访问日志目前是通过SQLite3数据库管理的。
以下是上述程序执行的结果。为了有效管理大量记录,每个访问记录都被数字化。这样的数据并不以原始形式存在于关系数据库的表中。
通过执行下面红色显示的SQL语句(选择查询)来获取表log和表path的数据:
90: sqlite3_open(LOGDB, &db); // 打开数据库
91: sql = "select count(*) as cnt,name from log,path
where log.pid=path.id group by pid order by cnt desc";
92: sqlite3_exec(db, sql, callback, 0, &zErrMsg);
93: sqlite3_close(db);
顺便说一下,通过SQL语句 "select count(*) from log;" 可以得到表log的记录数。
截至2013年5月2日,这个值是532,394。在我平时使用的移动PC(1.83GHz, 2.0GB)上,执行上述红色查询的时间是2、3秒。当记录数达到几百万时,执行时间会成为问题。 我正在考虑更换电脑,这样几百万条记录应该没问题,但数千万条记录可能就不行了。 在这种情况下,解决方案总是不从所有原始日志中获取,而是例如按月汇总。 2. 所有者绘制的列表视图 要将列表视图设置为所有者绘制,需要在创建时的窗口样式中添加LVS_OWNERDRAWFIXED。 列的创建与标准列表视图相同。 由于不需要设置显示字符串,因此记录的创建比标准列表视图简单。但是,不能省略。
56: void onCreate(HWND hWnd) {
57: int iCol, iRow;
58: hList = CreateWindowEx(0, WC_LISTVIEW, NULL,
59: WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_OWNERDRAWFIXED,
60: 0, 0, 1, 1, hWnd, (HMENU)777, NULL, NULL);
61: SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES);
62: for (iCol = 0; iCol < NCOL; iCol++) {
63: LVCOLUMN col = { LVCF_FMT|LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM, 0,
64: iCol==0 ? 50 : iCol==1 ? 90 : 400