www.pudn.com > cwin.rar > CODELIST.C
/*-----------------------------------------------------------
函数 _GetCode : 代码表
-----------------------------------------------------------*/
#include
#include
/*-------- 内部函数 _PutRecord : 显示代码条目 -------------*/
static void _Cdecl _PutRecord(col,line,width,getrec,i,selected,key)
int col; /* 代码条目显示列坐标(以字节为单位) */
int line; /* 代码条目显示行坐标(以象素为单位) */
int width; /* 代码条目显示宽度 (以字节为单位) */
void (*getrec)(); /* 构造代码条目的函数(由用户提供) */
int i; /* 代码条目的序号 */
int selected; /* 代码条目是否被选中 */
unsigned key; /* 为构造代码条目的函数提供的键值 */
{
/*-- 根据代码条目是否被选中,确定代码条目的显示颜色 ----*/
int color = selected?_EditColor:_TextColor;
int bk = selected?_EditBk:_Background;
char code[81];
/*-- 清代码条目背景,构造并显示代码条目 ----------------*/
_Block(col+1,line,width,_Ytimes*CHAR_HIGH,bk);
(*getrec)(i,code,key);
outxystr(col+1,line,color,code);
}
/*------------ 函数 getcode : 窗口式代码表函数 ------------*/
unsigned _Cdecl _GetCode(col,line,width,high,title,n,getrec,no)
int col; /* 代码表左上角列坐标(以字节为单位) */
int line; /* 代码表左上角行坐标(以象素为单位) */
int width; /* 代码表宽度(以字节为单位) */
int high; /* 代码表高度(以象素为单位) */
char *title; /* 代码表标题 */
int n; /* 代码表长度(代码条数) */
void (*getrec)(); /* 构造代码条目的函数(由用户提供) */
int *no; /* 选中的代码序号 */
{
char **block; /* 存储代码表背景的缓冲区指针 */
unsigned key;
int i;
int page_top; /* 当前页首代码编号 */
int curr_rec = *no; /* 光条(当前)代码编号 */
int have_cursor = iscursorlight();
int mouse_light = ismouselight();
int char_high = _Ytimes*CHAR_HIGH;
int dispwidth = _Xtimes*width-2;
int oldpos = -1; /* 滚动条用临时变量 */
int sblen = high*_Ytimes*CHAR_HIGH-6;
/*-- 如果取光条颜色与正文颜色相同,可构造帮助提示框 ----*/
int onlyshow = (_EditColor == _TextColor && _EditBk==_Background);
/*--------------- 如果代码表为空则退出 ----------------*/
if(n<=0 || getrec==NULL)
return KEY_ESC;
/*------------------ 关闭光标和鼠标 -------------------*/
if(have_cursor)
delightcursor();
if(mouse_light)
delight_mouse();
/*------------------- 显示代码表表框 ------------------*/
block = getblock(col,line,dispwidth+4,high*char_high);
_Box(col*8,line,(dispwidth+4)*8,high*char_high);
scroll_v_box((col+dispwidth+2)*8-3,line+3,sblen,high,0,n,&curr_rec,&oldpos);
delight_mouse();
/*---------- 如果有标题,则显示标题,然后调整参数 -------*/
if(title)
{
_Bar(col*8+4,line+4,(dispwidth+1)*8+1,char_high,_TitleBk,0xffff0000);
outxystr(col+(dispwidth-strlen(title)*_Xtimes)/2+1,line+4*_Ytimes,_TitleColor,title);
_H_Line(col*8+4,line+char_high+4,(dispwidth+1)*8+1,_BoxLineColor,0xff);
high -= 2;
line += (char_high*2-6*_Ytimes);
}
else
{
high --;
line += char_high-6*_Ytimes;
}
/*--------------------- 修正n的数值 -------------------*/
if(*no<0)
*no = 0;
else if(*no>=n)
*no = n-1;
/*---------------- 显示代码表第一页的内容 -------------*/
page_top = (*no/high)*high;
for(i=0;ihigh?high:n-page_top;
if(mouse_enter(col*8,line,(col+dispwidth)*8,line+tmphigh*char_high))
{
i = (mouserow()-line)/char_high;
if(double_press(key))
ungeth(KEY_ENTER);
else
key = ' ';
}
}
break;
case KEY_Down: /* 向下键:光标移向下一代码 */
if(onlyshow)
i = high-1;
if(ihigh?page_top-high:0;
_Block(col+1,line,dispwidth,high*char_high,
_Background);
for(i=0;i= high || curr_rec-page_top<0)
{
page_top = curr_rec/high*high;
_Block(col+1,line,dispwidth,high*char_high,_Background);
for(i=0;i