Files
minigui-docs/programming-guide-zh/MiniGUIProgGuidePart2Chapter13-zh.md
lisimeng123 045211f6c4 add
2022-11-17 09:47:52 +08:00

26 KiB
Raw Permalink Blame History

编辑框系列控件

1 编辑框控件简介

编辑框控件Edit是GUI系统中不可或缺的的重要控件之一主要用于接受用户的字符输入实现用户交互和文本编辑的功能。实现上分为单行编辑框Single Line Edit和多行编辑框Multiline Edit单行编辑框用来接受用户内容相对简单的单行文本输入与之相对多行文本用来接受复杂的、大量的文本的输入。

edit

2 mEdit

  • 控件窗口类: NCSCTRL_EDIT
  • 控件英文名: Edit
  • 简介: 编辑框系列控件的基础类,是单行编辑框和多行编辑框的抽象父类,定义了两者共同的使用接口。
  • 示意图:

抽象类,不能直接使用

2.1 mEdit 风格

继承自 mScrollView 的风格

风格名 mstudio 属性名 说明
NCSS_EDIT_LEFT Align->Left 左对齐
NCSS_EDIT_CENTER Align->Center 水平居中
NCSS_EDIT_RIGHT Align->Right 右对齐
NCSS_EDIT_UPPERCASE Case->Upper 输入内容自动转成大写
NCSS_EDIT_LOWERCASE Case->Lower 输入内容自动转成小写
NCSS_EDIT_NOHIDESEL HideSel->FALSE 当编辑框失去焦点的时候,选中的内容依然保持选中状态
NCSS_EDIT_READONLY ReadOnly->TRUE 内容只读
NCSS_EDIT_BASELINE BaseLine->TRUE 内容带下划线显示

2.2 mEdit 属性

继承自 mScrollView 的属性

属性 mstudio 属性名 类型 权限 说明
NCSP_EDIT_LIMITTEXT MaxLength int RW 字符数目限定值
NCSP_EDIT_CARETPOS -- int RW 光标位置

2.3 mEdit 事件

继承自 mScrollView 的事件

事件 ID 参数 说明
NCSN_EDIT_CHANGE -- 内容变化
NCSN_EDIT_CONTCHANGED -- 当 edit 失去焦点时,内容发生变化了
NCSN_EDIT_UPDATE -- 内容被刷新,当通过 setText, resetContent, 方法改变时,或改变属性时
NCSN_EDIT_SELCHANGED -- 选中部分改变
NCSN_EDIT_MAXTEXT -- 字符数量饱和
NCSN_EDIT_SETFOCUS -- 获得焦点
NCSN_EDIT_KILLFOCUS -- 失去焦点

2.4 mEdit 方法

继承自 mScrollView 的方法

2.4.1 setContent

void setContent(mEdit *self, const char* str, int start, int len)
  • 参数:
    • str -- 显示在 edit 中的文字内容
    • start -- 显示开始位置(相对 str 的起始位置)0 表示从头开始
    • len -- 显示字符数目,-1 表示一直到 str 的结束为止
  • 说明:
    设置编辑框的显示内容该方法会从str字符串中获取从第 start 个字符位置开始的一共 len 个字符,替换掉 edit 中现有的内容。
  • 示例:
//edit中会显示字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串这里就是“Show Me”
_c(edit)->setContent(edit, "dddd Show Me", 6, -1);

2.4.2 replaceText

void replaceText(mEdit *self, const char* str, 
    int start, int len, int replace_start, int replace_end)
  • 参数:
    • str -- 用于替换的源字符串
    • start -- 用于替换的源文本相对于 str 的的偏移0表示从头开始
    • len -- 用到的源文本的长度,-1 表示从 start 开始,直到 str 结束
    • replace_start -- 替换开始的位置(相对于 edit 中的现有内容)
    • replace_end -- 替换结束的位置(相对于 edit 中的现有内容)
  • 说明:
    字符串的替换,该方法会从 str 字符串中获取从第 start 个字符位置开始的一共 len 个字符,替换掉 edit 中现有的从 replace_startrepalce_end 的内容。str 是要替换成的字符串start 是相对 str 的起始位置0 表示从头开始len 是长度,-1 表示一直到 str 的结束为止,replace_startreplace_end 分别是要替换的位置的起点和终点,是相对于 edit 中现有的文本内容的位置偏移。
  • 示例:
//edit中会用字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串这里就是“Show Me”
//来替换掉edit中现有文本的从第二个到第十个的字符
_c(edit)->replaceText(edit, "dddd Show Me", 6, -1, 2, 10);

2.4.3 insert

void insert(mEdit *self, const char* str, int start, int len, int at)
  • 参数:
    • str -- 要插入的源字符串
    • start -- 使用到的源文本的起始位置0 表示从头开始
    • len -- 使用到的源文本的长度,-1 表示从 start 开始,直到 str 结束
    • at -- 插入点的位置(相对于 edit 中的现有内容),-1 表示结尾处
  • 说明:
    字符串的插入,该方法会从 str 字符串中获取从第 start 个字符位置开始的一共 len 个字符插入到edit中现有的内容的第 at 个字符的位置。str 是要插入的字符串start 是相对 str 的起始位置0 表示从头开始len 是长度,-1 表示一直到 str 的结束为止, at 参数是要插入的位置,是相对于 edit 中现有的文本内容的位置偏移。
  • 示例:
//edit中会用字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串这里就是“Show Me”
//来插入到edit中现有文本的从第二个字符之后
_c(edit)->insert(edit, "dddd Show Me", 6, -1,  2);

2.4.4 append

void append(mEdit *self, const char* str, int start, int len)
  • 参数:
    • str -- 要追加的源字符串
    • start -- 使用到的源文本的起始位置0 表示从头开始
    • len -- 使用到的源文本的长度,-1 表示从 start 开始,直到 str 结束
  • 说明:
    字符串的追加,该方法会从 str 字符串中获取从第 start 个字符位置开始的一共 len 个字符,追加到 edit 中现有的内容的后面。str 是要追加的字符串start 是相对 str 的起始位置0 表示从头开始len 是长度,-1 表示一直到 str 的结束为止。
  • 示例:
//edit中会用字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串这里就是“Show Me”
//来追加到edit中现有文本的末尾
_c(edit)->append(edit, "dddd Show Me", 6, -1);

2.4.5 getTextLength

int getTextLength(mEdit *self)                                      
  • 说明:
    获取 Edit 中字符串内容的长度
  • 示例:
int text_len = _c(edit)->getTextLength(edit);

2.4.6 getContent

int getContent(mEdit *self, char *strbuff, int buf_len, int start, int end)
  • 参数:
    • strbuff -- 获取到字符串的存放位置(应该提前分配好存放空间)
    • buff_len -- strbuff 的大小
    • start -- 获取内容的起始位置
    • end -- 获取内容的终止位置
  • 说明:
    获取 Edit 中字符串内容,从现有的内容中获取从 start 到 end 位置的内容写入到 strbuff 中,写入的最大数目限定为 buff_len
  • 示例:
char buff[128];
_c(edit)->getContent(edit, buff, 127, 0, -1);//取出edit中的全部内容buff最多存127个字符

2.4.7 setSelgetSel

int setSel(mEdit *self, int start, int end)
int getSel(mEdit *self, int *pstart, int *pend)
  • 参数:
    • start\end -- 选中区域的起点、终点
    • pstart\pend -- 选中区域的起点、终点,用于函数返回
  • 说明:
    设置、获取选中文本的区域,后两个参数分别对应选中区域的起点和终点。
  • 示例:
_c(edit)->setSel(edit, 2, 10);//设置edit的第2~10个字符为选中状态

int ps,pe;
_c(edit)->getSel(edit, &ps, &pe);//获取选中区域

2.4.8 setMargin

void setMargin(mEdit *self, int left, int top, int right, int bottom)
  • 参数:
    • left, top, right, bottom -- 上下左右的留白,这个参数不是矩形的概念,只是沿用了矩形的数据结构方便参数传递
  • 说明:
    设置编辑区的上下左右留白
  • 示例:
//设置留白
_c(edit)- >setMargin(edit, 10,10,10,10);

2.4.9 copy、paste、cut

void copy(mEdit *self)
void cut(mEdit *self)
void paste(mEdit *self)
TextCopyPaste * setCopyPaste(mEdit *self, TextCopyPaste* cp)

剪切、复制、粘贴都是针对选中区域的操作edit 中默认实现了一组使用 minigui 剪切板的操作集,用户还可以通过 setCopyPaste 设置自己实现的操作集。

2.4.10 makevisible

BOOL makevisible(mEdit *self, int pos)
  • 参数:
    • pos -- 需要可见的位置
  • 说明:
    控制编辑区的滚动,使位置的字符变为可见。
  • 示例:
//是第201个字符处可见
_c(edit)- >makevisible(edit, 201);

3 mSlEdit

  • 控件窗口类: NCSCTRL_SLEDIT
  • 控件英文名: Single Line Edit 或者 SlEdit
  • 简介: 单行文本编辑框
  • 示意图:

sledit

3.1 mSlEdit 风格

继承自 mEdit 的风格

风格名 mstudio 属性名 说明
NCSS_SLEDIT_PASSWORD Password->TRUE 编辑框的内容以密码输入的方式屏蔽显示
NCSS_SLEDIT_AUTOSELECT AutoSelect->TRUE 自动选中风格,获得焦点后文本自动成选中状态

3.2 mSlEdit 属性

继承自 mEdit 的属性

属性 mstudio 属性名 类型 权限 说明
NCSP_SLEDIT_TIPTEXT ToolTip char * RW 提示信息字符串,当没有输入时,用来提示用户的信息
NCSP_SLEDIT_PWDCHAR PasswordChar char RW pass word 显示的字符,只有 NCSS_SLEDIT_PASSWORD 风格的有效,默认是‘*

3.3 mSlEdit 事件

继承自 mEdit 的事件

事件 ID 参数 说明
NCSN_SLEDIT_ENTER -- 捕获到 enter 键消息

3.4 mSlEdit 方法

继承自 mEdit 的方法

没有新引入的方法

3.5 mSlEdit 编程示例

  • SlEdit 示例代码 edit.c
/*
** edit.c: Sample program for mGNCS Programming Guide
**      Using edit.
**
** Copyright (C) 2009 Feynman Software.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

#include <mgncs/mgncs.h>

#define ID_NAME     104
#define ID_COUN     105
#define ID_CITY     106
#define ID_PSWD     107
#define ID_SPIN     108
#define ID_INFO     109

#define ID_REG      155
#define ID_CAN      156


static BOOL mymain_onCreate (mWidget* _this, DWORD add_data)
{
    return TRUE;
}

static void mymain_onClose (mWidget* _this, int message)
{
    DestroyMainWindow (_this->hwnd);
    PostQuitMessage (_this->hwnd);
}

static NCS_EVENT_HANDLER mymain_handlers[] = {
    {MSG_CREATE, mymain_onCreate},
    {MSG_CLOSE,  mymain_onClose},
    {0, NULL}
};

static void btn_onClicked(mWidget* _this, int id, int nc, HWND hCtrl)
{
    if(nc == NCSN_WIDGET_CLICKED)
    {
        if (id == ID_CAN){
            PostMessage(GetParent(_this->hwnd), MSG_CLOSE, 0, 0);
        } else if (id == ID_REG){
            //TODO
        }

    }
};

static NCS_EVENT_HANDLER btn_handlers[] = 
{
    {NCS_NOTIFY_CODE(NCSN_WIDGET_CLICKED), btn_onClicked},
    {0, NULL}
};

static NCS_RDR_INFO btn_rdr_info[] =
{
    {"fashion","fashion", NULL}
};

static NCS_PROP_ENTRY static_props[] =
{
    {NCSP_STATIC_ALIGN, NCS_ALIGN_RIGHT},
    {0, 0}
};

static NCS_PROP_ENTRY spin_props [] = 
{
	{NCSP_SPNBOX_MAXPOS, 99},
	{NCSP_SPNBOX_MINPOS, 0},
	{NCSP_SPNBOX_CURPOS, 25},
	{NCSP_SPNBOX_LINESTEP, 1},
	{0, 0}
};

#define HSTART  25
#define HSPACE  40

static NCS_WND_TEMPLATE _ctrl_templ[] = 
{
//START_OF_SLEDIT_TEMPLATE
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Name :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //左对齐
        NCSCTRL_SLEDIT, 
        ID_NAME,
        100, HSTART, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_LEFT,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Age :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_SPINBOX, 
        ID_SPIN,
        100, HSTART + HSPACE, 70, 25,
        WS_VISIBLE | NCSS_SPNBOX_NUMBER | NCSS_SPNBOX_AUTOLOOP,
        WS_EX_NONE,
        "",
        spin_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 2 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Country:",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //居中对齐, 大写字母
        NCSCTRL_SLEDIT, 
        ID_COUN,
        100, HSTART + 2 * HSPACE, 130, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_CENTER | NCSS_EDIT_UPPERCASE,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 3 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "City :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //小写字母
        NCSCTRL_SLEDIT, 
        ID_CITY,
        100, HSTART + 3 * HSPACE, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_LOWERCASE,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 4 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Passwd :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //密码输入形式的edit
        NCSCTRL_SLEDIT, 
        ID_PSWD,
        100, HSTART + 4 * HSPACE, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_SLEDIT_PASSWORD,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
//END_OF_SLEDIT_TEMPLATE
//START_OF_MLEDIT_TEMPLATE
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 5 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Info :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //多行编辑框
        NCSCTRL_MLEDIT, 
        ID_INFO,
        100, HSTART + 5 * HSPACE, 200, 160,
        WS_BORDER | WS_VISIBLE | WS_VSCROLL | NCSS_EDIT_BASELINE, 
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
//END_OF_MLEDIT_TEMPLATE

    {
        NCSCTRL_BUTTON, 
        ID_REG,
        240, 400, 80, 25,
        WS_VISIBLE | NCSS_NOTIFY,
        WS_EX_NONE,
        "Register",
        NULL,
        btn_rdr_info,
        btn_handlers, NULL, 0, 0
    },
    {
        NCSCTRL_BUTTON, 
        ID_CAN,
        120, 400, 80, 25,
        WS_VISIBLE | NCSS_NOTIFY,
        WS_EX_NONE,
        "Cancel",
        NULL,
        btn_rdr_info,
        btn_handlers, NULL, 0, 0
    },
};

static NCS_MNWND_TEMPLATE mymain_templ =
{
    NCSCTRL_DIALOGBOX, 
    1,
    0, 0, 360, 480,
    WS_CAPTION | WS_BORDER | WS_VISIBLE,
    WS_EX_NONE,
    "Register",
    NULL,
    NULL,
    mymain_handlers,
    _ctrl_templ,
    sizeof(_ctrl_templ)/sizeof(NCS_WND_TEMPLATE),
    0,
    0, 0,
};

int MiniGUIMain (int argc, const char* argv[])
{
    ncsInitialize ();

    mDialogBox* mydlg = (mDialogBox *)ncsCreateMainWindowIndirect 
                (&mymain_templ, HWND_DESKTOP);

    _c(mydlg)->doModal (mydlg, TRUE);
 
    ncsUninitialize ();

    return 0;
}
  • 我们这样来定义 SlEdit 的使用模板
{
        NCSCTRL_STATIC, 
        0,
        10, HSTART, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Name :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
},
{   //左对齐
        NCSCTRL_SLEDIT, 
        ID_NAME,
        100, HSTART, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_LEFT,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
},
{
        NCSCTRL_STATIC, 
        0,
        10, HSTART + HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Age :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
},
{
        NCSCTRL_SPINBOX, 
        ID_SPIN,
        100, HSTART + HSPACE, 70, 25,
        WS_VISIBLE | NCSS_SPNBOX_NUMBER | NCSS_SPNBOX_AUTOLOOP,
        WS_EX_NONE,
        "",
        spin_props,
        NULL,
        NULL, NULL, 0, 0
},
{
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 2 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Country:",
        static_props,
        NULL,
        NULL, NULL, 0, 0
},
{   //居中对齐, 大写字母
        NCSCTRL_SLEDIT, 
        ID_COUN,
        100, HSTART + 2 * HSPACE, 130, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_CENTER | NCSS_EDIT_UPPERCASE,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
},
{
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 3 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "City :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
},
{   //小写字母
        NCSCTRL_SLEDIT, 
        ID_CITY,
        100, HSTART + 3 * HSPACE, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_LOWERCASE,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
},
{
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 4 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Passwd :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
},
{   //密码输入形式的edit
        NCSCTRL_SLEDIT, 
        ID_PSWD,
        100, HSTART + 4 * HSPACE, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_SLEDIT_PASSWORD,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
},

4 mMlEdit

  • 控件窗口类: NCSCTRL_MLEDIT
  • 控件英文名: Multiline Edit 或者 MlEdit
  • 简介: 多行文本编辑框
  • 示意图:

mledit

4.1 mMlEdit 风格

继承自 mEdit 的风格

风格名 mstudio 属性名 说明
NCSS_MLEDIT_AUTOWRAP AutoWrap->TRUE 自动换行

4.2 mMlEdit 属性

继承自 mEdit 的属性

属性 mstudio 属性名 类型 权限 说明
NCSP_MLEDIT_LINECOUNT -- int RO 行数
NCSP_MLEDIT_LINEHEIGHT LineHeight int RW 行高
NCSP_MLEDIT_LINEFEEDISPCHAR -- char WO 换行符改用该字符显示出来
NCSP_MLEDIT_LINESEP LineSeperator char RW 换行符标记,默认是‘\n
NCSP_MLEDIT_CARETSHAPE CaretShap int RW 光标形状ED_CARETSHAPE_LINE 或者 ED_CARETSHAPE_BLOCK
NCSP_MLEDIT_NUMOFPARAGRAPHS -- int RO 段落的数目

4.3 mMlEdit 事件

继承自 mEdit 的事件

没有新引入的事件

4.4 mMlEdit 方法

继承自 mEdit 的方法

4.5 mMlEdit 编程示例

  • MlEdit 示例代码 edit.c
/*
** edit.c: Sample program for mGNCS Programming Guide
**      Using edit.
**
** Copyright (C) 2009 Feynman Software.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

#include <mgncs/mgncs.h>

#define ID_NAME     104
#define ID_COUN     105
#define ID_CITY     106
#define ID_PSWD     107
#define ID_SPIN     108
#define ID_INFO     109

#define ID_REG      155
#define ID_CAN      156


static BOOL mymain_onCreate (mWidget* _this, DWORD add_data)
{
    return TRUE;
}

static void mymain_onClose (mWidget* _this, int message)
{
    DestroyMainWindow (_this->hwnd);
    PostQuitMessage (_this->hwnd);
}

static NCS_EVENT_HANDLER mymain_handlers[] = {
    {MSG_CREATE, mymain_onCreate},
    {MSG_CLOSE,  mymain_onClose},
    {0, NULL}
};

static void btn_onClicked(mWidget* _this, int id, int nc, HWND hCtrl)
{
    if(nc == NCSN_WIDGET_CLICKED)
    {
        if (id == ID_CAN){
            PostMessage(GetParent(_this->hwnd), MSG_CLOSE, 0, 0);
        } else if (id == ID_REG){
            //TODO
        }

    }
};

static NCS_EVENT_HANDLER btn_handlers[] = 
{
    {NCS_NOTIFY_CODE(NCSN_WIDGET_CLICKED), btn_onClicked},
    {0, NULL}
};

static NCS_RDR_INFO btn_rdr_info[] =
{
    {"fashion","fashion", NULL}
};

static NCS_PROP_ENTRY static_props[] =
{
    {NCSP_STATIC_ALIGN, NCS_ALIGN_RIGHT},
    {0, 0}
};

static NCS_PROP_ENTRY spin_props [] = 
{
	{NCSP_SPNBOX_MAXPOS, 99},
	{NCSP_SPNBOX_MINPOS, 0},
	{NCSP_SPNBOX_CURPOS, 25},
	{NCSP_SPNBOX_LINESTEP, 1},
	{0, 0}
};

#define HSTART  25
#define HSPACE  40

static NCS_WND_TEMPLATE _ctrl_templ[] = 
{
//START_OF_SLEDIT_TEMPLATE
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Name :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //左对齐
        NCSCTRL_SLEDIT, 
        ID_NAME,
        100, HSTART, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_LEFT,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Age :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_SPINBOX, 
        ID_SPIN,
        100, HSTART + HSPACE, 70, 25,
        WS_VISIBLE | NCSS_SPNBOX_NUMBER | NCSS_SPNBOX_AUTOLOOP,
        WS_EX_NONE,
        "",
        spin_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 2 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Country:",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //居中对齐, 大写字母
        NCSCTRL_SLEDIT, 
        ID_COUN,
        100, HSTART + 2 * HSPACE, 130, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_CENTER | NCSS_EDIT_UPPERCASE,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 3 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "City :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //小写字母
        NCSCTRL_SLEDIT, 
        ID_CITY,
        100, HSTART + 3 * HSPACE, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_EDIT_LOWERCASE,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 4 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Passwd :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //密码输入形式的edit
        NCSCTRL_SLEDIT, 
        ID_PSWD,
        100, HSTART + 4 * HSPACE, 150, 25,
        WS_BORDER | WS_VISIBLE | NCSS_SLEDIT_PASSWORD,
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
//END_OF_SLEDIT_TEMPLATE
//START_OF_MLEDIT_TEMPLATE
    {
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 5 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Info :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
    },
    {   //多行编辑框
        NCSCTRL_MLEDIT, 
        ID_INFO,
        100, HSTART + 5 * HSPACE, 200, 160,
        WS_BORDER | WS_VISIBLE | WS_VSCROLL | NCSS_EDIT_BASELINE, 
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
    },
//END_OF_MLEDIT_TEMPLATE

    {
        NCSCTRL_BUTTON, 
        ID_REG,
        240, 400, 80, 25,
        WS_VISIBLE | NCSS_NOTIFY,
        WS_EX_NONE,
        "Register",
        NULL,
        btn_rdr_info,
        btn_handlers, NULL, 0, 0
    },
    {
        NCSCTRL_BUTTON, 
        ID_CAN,
        120, 400, 80, 25,
        WS_VISIBLE | NCSS_NOTIFY,
        WS_EX_NONE,
        "Cancel",
        NULL,
        btn_rdr_info,
        btn_handlers, NULL, 0, 0
    },
};

static NCS_MNWND_TEMPLATE mymain_templ =
{
    NCSCTRL_DIALOGBOX, 
    1,
    0, 0, 360, 480,
    WS_CAPTION | WS_BORDER | WS_VISIBLE,
    WS_EX_NONE,
    "Register",
    NULL,
    NULL,
    mymain_handlers,
    _ctrl_templ,
    sizeof(_ctrl_templ)/sizeof(NCS_WND_TEMPLATE),
    0,
    0, 0,
};

int MiniGUIMain (int argc, const char* argv[])
{
    ncsInitialize ();

    mDialogBox* mydlg = (mDialogBox *)ncsCreateMainWindowIndirect 
                (&mymain_templ, HWND_DESKTOP);

    _c(mydlg)->doModal (mydlg, TRUE);
 
    ncsUninitialize ();

    return 0;
}
  • 我们这样来定义 MlEdit 的使用模板
{
        NCSCTRL_STATIC, 
        0,
        10, HSTART + 5 * HSPACE, 70, 25,
        WS_VISIBLE,
        WS_EX_NONE,
        "Info :",
        static_props,
        NULL,
        NULL, NULL, 0, 0
},
{   //多行编辑框
        NCSCTRL_MLEDIT, 
        ID_INFO,
        100, HSTART + 5 * HSPACE, 200, 160,
        WS_BORDER | WS_VISIBLE | WS_VSCROLL | NCSS_EDIT_BASELINE, 
        WS_EX_NONE,
        "",
        NULL,
        NULL,
        NULL, NULL, 0, 0
},