table.c
来自「<Win2k系统编程>源码.次数为国人自编,内容丰富,还是不错的.」· C语言 代码 · 共 917 行 · 第 1/3 页
C
917 行
gtab_sendtq(hwnd, TQ_CLOSE, ptab->hdr.id);
gtab_deltable(hwnd, ptab);
}
hHeap = (HANDLE) GetWindowLong(hwnd, WW_HEAP);
gmem_freeall(hHeap);
break;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
/* separator lines between fixed rows/columns
* (ie headers) and the rest - if enabled
*/
/* paint here first for good impression,
* and again after to clean up!!
*/
if (ptab->hdr.vseparator) {
gtab_vsep(hwnd, ptab, hDC);
}
if (ptab->hdr.hseparator) {
gtab_hsep(hwnd, ptab, hDC);
}
/* paint only the rows that need painting */
for (i = 0; i < ptab->nlines; i++) {
y = ptab->pdata[i].linepos.start;
y2 = y + ptab->pdata[i].linepos.size;
if ( (y <= ps.rcPaint.bottom) &&
(y2 >= ps.rcPaint.top)) {
gtab_paint(hwnd, hDC, ptab, i);
}
}
if (ptab->hdr.vseparator) {
gtab_vsep(hwnd, ptab, hDC);
}
if (ptab->hdr.hseparator) {
gtab_hsep(hwnd, ptab, hDC);
}
if (ptab->selvisible) {
gtab_invertsel(hwnd, ptab, hDC);
}
}
EndPaint(hwnd, &ps);
break;
case WM_HSCROLL:
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
gtab_msg_hscroll(hwnd, ptab,
GET_SCROLL_OPCODE(wParam, lParam),
GET_SCROLL_POS(wParam, lParam));
}
break;
case WM_VSCROLL:
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
gtab_msg_vscroll(hwnd, ptab,
GET_SCROLL_OPCODE(wParam, lParam),
GET_SCROLL_POS(wParam, lParam));
}
break;
case WM_MOUSEMOVE:
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
gtab_move(hwnd, ptab, LOWORD(lParam), HIWORD(lParam));
} else {
SetCursor(hNormCurs);
}
break;
case WM_LBUTTONDOWN:
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
gtab_press(hwnd, ptab, LOWORD(lParam), HIWORD(lParam));
}
break;
case WM_LBUTTONUP:
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
gtab_release(hwnd, ptab,
LOWORD(lParam), HIWORD(lParam));
}
break;
case WM_LBUTTONDBLCLK:
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
gtab_dblclick(hwnd, ptab,
LOWORD(lParam), HIWORD(lParam));
}
break;
case WM_KEYDOWN:
/* handle key presses for cursor movement about
* the table, and return/space for selection.
* Any key we don't handle is passed to the owner window
* for him to handle.
* The table window should have the focus
*/
ptab = (lpTable) GetWindowLong(hwnd, WL_TABLE);
if (ptab != NULL) {
if (gtab_key(hwnd, ptab, wParam) != 0) {
/* pass key to owner since
* we don't know what to do with it
*/
hOwner = (HANDLE) GetWindowLong(hwnd, WW_OWNER);
return(SendMessage(hOwner, WM_KEYDOWN,
wParam, lParam));
} else {
return(0);
}
}
break;
default:
return(DefWindowProc(hwnd, msg, wParam, lParam));
}
return(TRUE);
}
/***************************************************************************
* Function: gtab_sendtq
*
* Purpose:
*
* Send a table-query message to the owner window. Returns message
* value.
*/
long
gtab_sendtq(HWND hwnd, UINT cmd, long lParam)
{
HWND hOwner;
hOwner = (HANDLE) GetWindowLong(hwnd, WW_OWNER);
return (SendMessage(hOwner, gtab_msgcode, cmd, lParam));
}
/***************************************************************************
* Function: gtab_freelinedata
*
* Purpose:
*
* Free the memory allocated for the array of lines (each containing
* an array of Cells, each containing an array of chars for the actual
* data). Called on any occasion that would change the number of visible lines
*/
void
gtab_freelinedata(HANDLE hHeap, lpTable ptab)
{
int i, j, ncols;
lpCellData cd;
ncols = ptab->hdr.ncols;
/* for each line */
for(i = 0; i < ptab->nlines; i++) {
/* for each cell */
for (j = 0; j < ncols; j++) {
/* free up the actual text space */
cd = &ptab->pdata[i].pdata[j];
gmem_free(hHeap, (LPSTR) cd->ptext, cd->nchars);
}
/* dealloc array of CellData */
gmem_free(hHeap, (LPSTR) ptab->pdata[i].pdata,
sizeof(CellData) * ncols);
}
/* de-alloc array of linedatas */
gmem_free(hHeap, (LPSTR) ptab->pdata,
sizeof(LineData) * ptab->nlines);
ptab->pdata = NULL;
}
/***************************************************************************
* Function: gtab_alloclinedata
*
* Purpose:
*
* Allocate and init array of linedatas (include cell array
* and text for each cell)
*/
BOOL
gtab_alloclinedata(HWND hwnd, HANDLE heap, lpTable ptab)
{
lpLineData pline;
lpCellData cd;
int i, j;
ptab->pdata = (lpLineData) gmem_get(heap,
sizeof(LineData) * ptab->nlines);
if (ptab->pdata == NULL) {
return(FALSE);
}
for (i = 0; i < ptab->nlines; i++) {
pline = &ptab->pdata[i];
pline->linepos.size = ptab->rowheight;
pline->pdata = (lpCellData) gmem_get(heap,
sizeof(CellData) * ptab->hdr.ncols);
if (pline->pdata == NULL) {
return(FALSE);
}
for (j = 0; j < ptab->hdr.ncols; j++) {
cd = &pline->pdata[j];
cd->props.valid = 0;
cd->flags = 0;
cd->nchars = ptab->pcolhdr[j].nchars;
if (cd->nchars > 0) {
cd->ptext = gmem_get(heap, cd->nchars);
if (cd->ptext == NULL) {
return(FALSE);
}
}
}
}
}
/***************************************************************************
* Function: gtab_deltable
*
* Purpose:
*
* Free up all table data structures. Called for new layout or new data.
*/
void
gtab_deltable(HWND hwnd, lpTable ptab)
{
HANDLE hHeap;
int ncols;
if (ptab == NULL) {
return;
}
hHeap = (HANDLE) GetWindowLong(hwnd, WW_HEAP);
ncols = ptab->hdr.ncols;
if (ptab->pcolhdr != NULL) {
gmem_free(hHeap, (LPSTR) ptab->pcolhdr,
sizeof(ColProps) * ncols);
}
if (ptab->pcellpos != NULL) {
gmem_free(hHeap, (LPSTR) ptab->pcellpos,
sizeof(CellPos) * ncols);
}
if (ptab->pdata != NULL) {
gtab_freelinedata(hHeap, ptab);
}
gmem_free(hHeap, (LPSTR) ptab, sizeof(Table));
}
/***************************************************************************
* Function: gtab_buildtable
*
* Purpose:
*
* Build up a Table struct (excluding data allocation and
* anything to do with font or window size).
* Return ptr to this or NULL if error
*/
lpTable
gtab_buildtable(HWND hwnd, DWORD id)
{
lpTable ptab;
HANDLE hHeap;
int ncols, i;
ColPropsList cplist;
hHeap = (HANDLE) GetWindowLong(hwnd, WW_HEAP);
ptab = (lpTable) gmem_get(hHeap, sizeof(Table));
if (ptab == NULL) {
return(NULL);
}
/* get the row/column count from owner window */
ptab->hdr.id = id;
ptab->hdr.props.valid = 0;
ptab->hdr.sendscroll = FALSE;
if (gtab_sendtq(hwnd, TQ_GETSIZE, (long) (LPSTR)&ptab->hdr) == FALSE) {
return(NULL);
}
ncols = ptab->hdr.ncols;
ptab->pcolhdr = (lpColProps) gmem_get(hHeap, sizeof(ColProps) * ncols);
if (ptab->pcolhdr == NULL) {
/* should prob send TQ_CLOSE at this point */
return(NULL);
}
/* init col properties to default */
for (i=0; i < ncols; i++) {
ptab->pcolhdr[i].props.valid = 0;
ptab->pcolhdr[i].nchars = 0;
}
/* get the column props from owner */
cplist.plist = ptab->pcolhdr;
cplist.id = id;
cplist.startcol = 0;
cplist.ncols = ncols;
gtab_sendtq(hwnd, TQ_GETCOLPROPS, (long) (LPSTR)&cplist);
/* init remaining fields */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?