📄 button.c
字号:
/*-----------------------------------------------------------
程序模块 button_menu.c : 多功能按钮式菜单
-----------------------------------------------------------*/
#include <hanenv.h>
#include <fcntl.h>
#include <alloc.h>
/*---- 内部函数 _DrawButtonMenu : 在指定坐标处显示菜单 ----*/
static void _Cdecl _DrawButtonMenu(b)
BUTTON_MENU *b; /* 菜单参数 */
{
int i;
/*-- 显示菜单 -----------------------------------------*/
delight_mouse();
if(b->saveimage)
b->block = getblock(b->col,b->line,b->width,b->high);
if(b->disp_fun)
(*(b->disp_fun))(b);
for(i=0;i<b->button_count;i++)
_DrawButton(b->buttons[i],b->col,b->line,NO,0);
if(b->arrow_ctrl)
_DrawButton(b->buttons[b->current],b->col,b->line,YES,0);
light_mouse();
}
/*-----------------------------------------------------------
函数 button_menu : 多功能按键式菜单
-----------------------------------------------------------*/
unsigned _Cdecl button_menu(b,key)
BUTTON_MENU *b; /* 指向菜单参数表的指针 */
unsigned key; /* 进入菜单处理过程时的键码 */
{
int i;
char **block; /* 菜单背景存放地址 */
/*
long memo_size = b->width*b->high*4+16;
*/
/*-- 如果菜单已经弹出,处理键盘码 ----------------------*/
if(b->pop_up)
{
/*-- 如果是鼠标左键且鼠标光标在菜单内 -------------*/
if(key==LEFT_BUTTON && mouse_enter(b->col*8,b->line,(b->col+b->width)*8,b->line+b->high))
{
/*-- 检查鼠标光标是否指向菜单中的某个按键 -----*/
for(i=0;i<b->button_count;i++)
if(mouse_enter(b->col*8+b->buttons[i].x,
b-> line+b->buttons[i].y,
b->col*8+b->buttons[i].x+b->buttons[i].w,
b-> line+b->buttons[i].y+b->buttons[i].h)
&& !(b->buttons[i].lock))
{
/*-- 如果菜单可用键盘控制,修改当前按键 */
if(b->arrow_ctrl)
{
delight_mouse();
_DrawButton(b->buttons[b->current],b->col,b->line,NO,0);
light_mouse();
}
b->current = i;
delight_mouse();
_DrawButton(b->buttons[i],b->col,b->line,YES,1);
light_mouse();
till_mouse_pop(LEFT_BUTTON);
/*-- 如果选择退出项,取消菜单显示,退出 -*/
if(b->buttons[i].key==b->quit_key1 || b->buttons[i].key==b->quit_key2)
{
b->pop_up = NO;
delight_mouse();
if(b->saveimage && b->block)
putblock(b->col,b->line,b->width,b->high,b->block);
light_mouse();
return b->quit_key1;
}
/*-- 如果选中项有可执行函数,执行之 ----*/
if(b->buttons[i].fun)
key = (*(b->buttons[i].fun))();
/*-- 否则取出该选择项对应的键盘码 -----*/
else
key = b->buttons[i].key;
/*-- 弹起该按键 -----------------------*/
delight_mouse();
_DrawButton(b->buttons[i],b->col,b->line,b->arrow_ctrl,0);
light_mouse();
/*-- 退出菜单处理 ---------------------*/
return key;
}
/*-- 如果菜单可移动,且鼠标未指向任何按键 ------*/
if(!b->fixed && coreleft()>(long)(b->width)*b->high*4+16)
{
int x; /* 菜单的列坐标(单位为象素) */
int y; /* 菜单的行坐标(单位为象素) */
int dx; /* 移动菜单的列增量 */
int dy; /* 移动菜单的行增量 */
int oldml,oldmt,oldmr,oldmb; /* 原鼠标范围 */
unsigned mouse_button;
/*-- 计算菜单的位置 -----------------------*/
x = b->col*8;
y = b->line;
/*-- 保存菜单的屏幕图象 -------------------*/
delight_mouse();
block = getblock(b->col,b->line,b->width,b->high);
light_mouse();
/*-- 设置菜单的移动范围 -------------------*/
get_mouse_range(&oldml,&oldmt,&oldmr,&oldmb);
set_mouse_range(b->left,b->top,b->right-b->width*8+1,b->bottom-b->high+1);
/*-- 用鼠标控制一个虚线框选定菜单的新位置 -*/
do
{
/*-- 读取鼠标光标的位置 ---------------*/
mouse_button = get_mouse_status(&dx,&dy);
/*-- 计算矩形虚线框的移动位置 ---------*/
dy -= y;
dx -= x;
/*-- 如果需要移动虚线框 ---------------*/
if(dx || dy)
{
delight_mouse();
/*-- 消除旧框 ---------------------*/
_SetWriteMode(XOR_MODE);
draw_rectangle(x,y,b->width*8,b->high,LIGHTGRAY,0xf0);
/*-- 计算新框位置 -----------------*/
x += dx;
y += dy;
/*-- 重画新框 ---------------------*/
draw_rectangle(x,y,b->width*8,b->high,LIGHTGRAY,0xf0);
_SetWriteMode(PUT_MODE);
light_mouse();
}
}while(mouse_button == LEFT_BUTTON);
/*-- 恢复原来的鼠标移动范围 ---------------*/
set_mouse_range(oldml,oldmt,oldmr,oldmb);
/*-- 取消最后一次所画的框 -----------------*/
delight_mouse();
_SetWriteMode(XOR_MODE);
draw_rectangle(x,y,b->width*8,b->high,LIGHTGRAY,0xf0);
_SetWriteMode(PUT_MODE);
/*-- 恢复菜单下的背景(抹去原来的菜单) -----*/
putblock(b->col,b->line,b->width,b->high,b->block);
/*-- 修改菜单参数表中的菜单位置 -----------*/
b->col = x/8;
b->line = y;
/*-- 保存新菜单位置上的屏幕背景 -----------*/
b->block = getblock(b->col,b->line,b->width,b->high);
/*-- 在新位置上恢复菜单的图象 -------------*/
putblock(b->col,b->line,b->width,b->high,block);
light_mouse();
}
/*-- 菜单移动处理结束 -------------------------*/
}
/*-- 如果输入键盘码为菜单退出键,取消菜单显示,退出 -*/
else if(key==b->quit_key1 || key==b->quit_key2 || key==KEY_ESC)
{
b->pop_up = NO;
delight_mouse();
if(b->saveimage && b->block)
putblock(b->col,b->line,b->width,b->high,b->block);
light_mouse();
return key;
}
/*-- 如果菜单可用键盘控制,处理键盘键 --------------*/
else if(b->arrow_ctrl)
{
/*-- 如果输入键盘码是选择键,执行当前选项 ------*/
if(key==b->press_key1 || key==b->press_key2)
{
/*-- 绘出按下状态的按键 -------------------*/
delight_mouse();
_DrawButton(b->buttons[b->current],b->col,b->line,YES,1);
light_mouse();
/*-- 如果选中项有可执行函数,执行之 --------*/
if(b->buttons[b->current].fun)
key = (*(b->buttons[b->current].fun))();
/*-- 否则取出该选择项对应的键盘码 ---------*/
else
{
key = b->buttons[b->current].key;
delay(_MouseSpeed);
}
/*-- 绘出弹起状态的按键 -------------------*/
delight_mouse();
_DrawButton(b->buttons[b->current],b->col,b->line,YES,0);
light_mouse();
/*-- 退出菜单处理 -------------------------*/
return key;
}
/*-- 如果是移动选择项键,移动当前选择项 --------*/
else if(key==b->forward1 || key==b->forward2 || key==b->backward1 || key==b->backward2)
{
/*-- 用正常色绘制当前键 -------------------*/
delight_mouse();
_DrawButton(b->buttons[b->current],b->col,b->line,NO,0);
light_mouse();
/*-- 处理向前移动键 -----------------------*/
if(key==b->forward1 || key==b->forward2)
{
b->current = (b->current==b->button_count-1?0:b->current+1);
if(b->buttons[b->current].lock)
ungeth(b->forward1);
}
/*-- 处理向后移动键 -----------------------*/
else if(key==b->backward1 || key==b->backward2)
{
b->current=(b->current==0?b->button_count-1:b->current-1);
if(b->buttons[b->current].lock)
ungeth(b->backward1);
}
/*-- 以选中键色绘制当前键 -----------------*/
delight_mouse();
_DrawButton(b->buttons[b->current],b->col,b->line,YES,0);
light_mouse();
/*-- 退出菜单处理 -------------------------*/
return key;
}
/*-- 检查输入键盘码是否和某选择项对应码相同 ---*/
for(i=0;i<b->button_count;i++)
if(key==b->buttons[i].pressed)
{
delight_mouse();
/*-- 将与输入码对应的键变为当前键 -----*/
_DrawButton(b->buttons[b->current],b->col,b->line,NO,0);
_DrawButton(b->buttons[i],b->col,b->line,YES,1);
light_mouse();
delay(_MouseSpeed);
delight_mouse();
_DrawButton(b->buttons[i],b->col,b->line,b->arrow_ctrl,0);
light_mouse();
b->current = i;
/*-- 退出菜单处理 ---------------------*/
return b->buttons[i].key;
}
}
/*-- 使用键盘控制菜单的处理结束 -------------------*/
}
/*-- 如果菜单尚未弹出,设置标记,在屏幕上画菜单 ---------*/
else
{
b->pop_up = YES;
_DrawButtonMenu(b);
}
/*-- 返回键盘码 ---------------------------------------*/
return key;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -