| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1406 人关注过本帖
标题:请教,有关复杂弹出式输入框的问题
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
 问题点数:0 回复次数:1 
请教,有关复杂弹出式输入框的问题
我编写了复杂弹出式对话框,但是总觉得所采用的数据结构很罗嗦,导致程序代码也很重复,不知道有没有更好的描述
方法。弹出式对话框比较复杂,有以下几种情况
   (1).当前亮条处按回车键,弹出一个数字输入对话框(类似VB的文本框),要求输入数字,输入完毕后存储该数值,,并回到上级对话框
   (2).当前亮条处按回车键,弹出一个下拉菜单,选项不确定,要求通过上下光标键选择。选择后存储当前选项的索引号,并回到上级对话框。   
   (3).当前亮条处按回车键,弹出一个下拉菜单,选项不确定,要求通过上下光标键选择。
     这些选择是上面(1)、(2)的组合,有的选项上按回车键,弹出输入数字对话框
     有的选项上按回车键,弹出下拉列表对话框。

[[it] 本帖最后由 ba_wang_mao 于 2008-3-18 10:08 编辑 [/it]]

4.jpg (43.77 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 弹出式 输入 
2008-03-18 09:49
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
typedef enum tagMSG
{
    WM_NO_MSG,
    WM_DESTORY,        //    按ESC销毁
    WM_PAINT,            //    重画
    WM_CREATE_NUMBER,            //    创建数字对话框
    WM_CREATE_MENU,        //    创建下拉列表
    WM_VALID,            //    确认
    WM_SWITCH,        //    组态切换
    WM_ERROR,            //    错误
    WM_FLUSH,            //    刷新(当控制单位发生改变,    需要重新刷新上级菜单界面)
}MSG;

///////////////////////////////////////////////////////////////////////////////////////////////
//通用结构体(包括:运行、启动曲线、转速控制、负荷控制、#1阀控制、#2阀控制、转速测量
//功能键、串级控制、通讯控制、LCD液晶屏)
///////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tagGUI_COM
{
    int *Value;
    union
    {
        struct
        {
            int *Min;
            int *Max;
            int *Dot;
        }Wnd;
        struct
        {
            char **MENU_Name;                //    "允许","禁止"
            int MENU_Max;                    //    = 2
        }MENU;
    }Class;
}GUI_COM;


typedef struct tagGUI_SET_STRUCT
{
    int Window_No;            //    窗口号
    int Window_Max;            //    当前窗口参数个数
    int DialogBox_Type;        //    对话框类型(数字对话框/下拉列表)
    int *Enable;            //    是否允许编辑
    char *Chinese_Name;        //    对话框中每项的中文名称
    char *Unit_Name;        //    对话框中每项的单位名称
    char **Help_Name;        //    帮助信息
    union
    {
        GUI_COM COM;        //    相同的子项
        GUI_DI DI;            //    不同的子项()
        GUI_DO DO;
        GUI_AI AI;
        GUI_AO AO;
    }Info;
}GUI_SET_STRUCT,*GUI_SET_STRUCT_PTR;

///////////////////////////////////////////////////////////////////////////////////////////////
//系统初始化
///////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl POPUP_GUI_SET_STRUCT_Init(void)
{
    int i;

    for (i = 0 ; i < POPUP_RUN_WINDOW_MAX ; i++)
    {
        GUI_RUN_STRUCT[i].Window_No = POPUP_RUN_WINDOW_NO;
        GUI_RUN_STRUCT[i].Window_Max = POPUP_RUN_WINDOW_MAX;
        GUI_RUN_STRUCT[i].DialogBox_Type = NUMBER_DIALOGBOX;
        GUI_RUN_STRUCT[i].Chinese_Name = run_para_table[i].name;
        GUI_RUN_STRUCT[i].Unit_Name = run_para_table[i].unit;
        GUI_RUN_STRUCT[i].Enable = &run_para_table[i].Enable;
        GUI_RUN_STRUCT[i]. = &run_para_table[i].data;
        GUI_RUN_STRUCT[i]. = &run_para_table[i].data_min;
        GUI_RUN_STRUCT[i]. = &run_para_table[i].data_max;
        GUI_RUN_STRUCT[i]. = &run_para_table[i].type;
    }
    for (i = 0 ; i < POPUP_STARTUP_WINDOW_MAX ; i++)
    {
        GUI_STARTUP_STRUCT[i].Window_No = POPUP_STARTUP_WINDOW_NO;
        GUI_STARTUP_STRUCT[i].Window_Max = POPUP_STARTUP_WINDOW_MAX;
        GUI_STARTUP_STRUCT[i].DialogBox_Type = NUMBER_DIALOGBOX;
        GUI_STARTUP_STRUCT[i].Chinese_Name = start_para_table[i].name;
        GUI_STARTUP_STRUCT[i].Unit_Name = start_para_table[i].unit;
        GUI_STARTUP_STRUCT[i].Enable = &start_para_table[i].Enable;
        GUI_STARTUP_STRUCT[i]. = &start_para_table[i].data;
        GUI_STARTUP_STRUCT[i]. = &start_para_table[i].data_min;
        GUI_STARTUP_STRUCT[i]. = &start_para_table[i].data_max;
        GUI_STARTUP_STRUCT[i]. = &start_para_table[i].type;

    }
    GUI_STARTUP_STRUCT[2].DialogBox_Type = MENU_DIALOGBOX;
    GUI_STARTUP_STRUCT[2]. = 2;
    GUI_STARTUP_STRUCT[2]. = GUI_Enable_Name;
    GUI_STARTUP_STRUCT[5].DialogBox_Type = MENU_DIALOGBOX;
    GUI_STARTUP_STRUCT[5]. = 2;
    GUI_STARTUP_STRUCT[5]. = GUI_Enable_Name;
    for (i = 0 ; i < POPUP_SPEED_WINDOW_MAX ; i++)
    {
        GUI_SPEED_STRUCT[i].Window_No = POPUP_SPEED_WINDOW_NO;
        GUI_SPEED_STRUCT[i].Window_Max = POPUP_SPEED_WINDOW_MAX;
        GUI_SPEED_STRUCT[i].DialogBox_Type = NUMBER_DIALOGBOX;
        GUI_SPEED_STRUCT[i].Chinese_Name = speed_para_table[i].name;
        GUI_SPEED_STRUCT[i].Unit_Name = speed_para_table[i].unit;
        GUI_SPEED_STRUCT[i].Enable = &speed_para_table[i].Enable;
        GUI_SPEED_STRUCT[i]. = &speed_para_table[i].data;
        GUI_SPEED_STRUCT[i]. = &speed_para_table[i].data_min;
        GUI_SPEED_STRUCT[i]. = &speed_para_table[i].data_max;
        GUI_SPEED_STRUCT[i]. = &speed_para_table[i].type;
    }
    GUI_SPEED_STRUCT[13].DialogBox_Type = MENU_DIALOGBOX;
    GUI_SPEED_STRUCT[13]. = 2;
    GUI_SPEED_STRUCT[13]. = GUI_Enable_Name;
    GUI_SPEED_STRUCT[16].DialogBox_Type = MENU_DIALOGBOX;
    GUI_SPEED_STRUCT[16]. = 2;
    GUI_SPEED_STRUCT[16]. = GUI_Enable_Name;
}

///////////////////////////////////////////////////////////////////////
//数字对输入框子程序
//由于要求输入数字时,必须还能执行主程序中其它子程序,因此采用返回消息的方式编制
//window_no = 窗口号
//Index = 下拉列表中第几项
//flush=是否刷新过
//string = 输入缓冲区(从该缓冲区中将输入数字转换成数值)
///////////////////////////////////////////////////////////////////////MSG _Cdecl POPUP_MAIN_Number_KeyBoard(int window_no,int Index,BOOL *flush,char *string)
{
    int num;
    char *p,*q;
    GUI_SET_STRUCT_PTR pM;

    if (GUI_Key_mark && GUI_Key_Code =='Q')//退出键
    {
        GUI_Key_mark = FALSE;
        return (WM_DESTORY);//返回消毁消息
    }
    else if (GUI_Key_mark && GUI_Key_Code =='E')//确认键
    {
        GUI_Key_mark = FALSE;
        num = POPUP_String_To_Number(string);
        pM = POPUP_GUI_SET_STRUCT_ADDR(window_no) + Index;
        if (window_no >= POPUP_STARTUP_WINDOW_NO && window_no <= POPUP_LCD_WINDOW_NO)
        {
            if (GUI_PassWord_mark)
            {
                if (POPUP_MAIN_Limit(window_no,Index,num,GUI_Min,GUI_Max))
                {
                    *pM-> = num;
                    return (WM_VALID);
                }
            }
            else
            {
                if (num == 1234)
                {
                    GUI_PassWord_mark = TRUE;
                    return (WM_DESTORY);
                }
                GUI_Error_Code = PASSWORD_ERROR_CODE;
                return (WM_ERROR);
            }
        }
        else if (num >= GUI_Min && num <= GUI_Max)
        {
            *pM-> = num;
            return (WM_VALID);
        }
        GUI_Error_Code = MIN_MAX_ERROR_CODE;
        return (WM_ERROR);
    }
    else if (GUI_Key_mark && GUI_Key_Code =='C')//清除键
    {
        GUI_Key_mark = FALSE;
        *flush = TRUE;
        p = q = string;
        while (*p)                            //    删除最后一个字符
        {
            q = p;
            p++;
        }
        *q = '\0';
        return (WM_PAINT);
    }
    else if (GUI_Key_mark && (GUI_Key_Code >= '0' && GUI_Key_Code <= '9'))
    {//数字0-数字9键
        GUI_Key_mark = FALSE;
        p = string;
        if (!(*flush))
        {
            *flush = TRUE;
            *p++ = GUI_Key_Code;
            *p = '\0';
        }
        else if (strlen(string) < 7)
        {
            while (*p)
                p++;
            *p++ = GUI_Key_Code;
            *p = '\0';
        }
        return (WM_PAINT);
    }
    return (WM_NO_MSG);
}

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2008-03-18 10:01
快速回复:请教,有关复杂弹出式输入框的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033701 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved