# 编辑框系列控件
## 1 编辑框控件简介
编辑框控件(Edit)是GUI系统中不可或缺的的重要控件之一,主要用于接受用户的字符输入,实现用户交互和文本编辑的功能。实现上分为单行编辑框(Single Line Edit)和多行编辑框(Multiline Edit),单行编辑框用来接受用户内容相对简单的单行文本输入,与之相对,多行文本用来接受复杂的、大量的文本的输入。
- 编辑框类层次关系
- [mWidget](MiniGUIProgGuidePart2Chapter04-zh#3-mwidget)
- [mScrollWidget](MiniGUIProgGuidePart2Chapter08-zh#2-mscrollwidget)
- [mItemView](MiniGUIProgGuidePart2Chapter15#5-mItemView)
- [mScrollView](MiniGUIProgGuidePart2Chapter15#6-mscrollview)
- [mEdit](#2-medit)
- [mSlEdit](#3-msledit)
- [mMlEdit](#4-mmledit)
- 示例图:

## 2 `mEdit`
- 控件窗口类: `NCSCTRL_EDIT`
- 控件英文名: `Edit`
- 简介: 编辑框系列控件的基础类,是单行编辑框和多行编辑框的抽象父类,定义了两者共同的使用接口。
- 示意图:
抽象类,不能直接使用
### 2.1 `mEdit` 风格
继承自 [mScrollView](MiniGUIProgGuidePart2Chapter15#6-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](MiniGUIProgGuidePart2Chapter15#6-mscrollview) 的属性
| 属性 | mstudio 属性名 | 类型 | 权限 | 说明 |
|:----|:--------------|:-----|:----|:-----|
| `NCSP_EDIT_LIMITTEXT` | `MaxLength` | int | `RW` | 字符数目限定值 |
| `NCSP_EDIT_CARETPOS` | -- | int | `RW` | 光标位置 |
### 2.3 `mEdit` 事件
继承自 [mScrollView](MiniGUIProgGuidePart2Chapter15#6-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](MiniGUIProgGuidePart2Chapter15#6-mscrollview) 的方法
#### 2.4.1 `setContent`
```c
void setContent(mEdit *self, const char* str, int start, int len)
```
- 参数:
- str -- 显示在 edit 中的文字内容
- start -- 显示开始位置(相对 str 的起始位置),0 表示从头开始
- len -- 显示字符数目,-1 表示一直到 str 的结束为止
- 说明:
设置编辑框的显示内容,该方法会从str字符串中获取从第 start 个字符位置开始的一共 len 个字符,替换掉 edit 中现有的内容。
- 示例:
```c
//edit中会显示字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串,这里就是“Show Me”
_c(edit)->setContent(edit, "dddd Show Me", 6, -1);
```
#### 2.4.2 `replaceText`
```c
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_start` 到 `repalce_end` 的内容。str 是要替换成的字符串,start 是相对 str 的起始位置,0 表示从头开始,len 是长度,-1 表示一直到 str 的结束为止,`replace_start`、`replace_end` 分别是要替换的位置的起点和终点,是相对于 edit 中现有的文本内容的位置偏移。
- 示例:
```c
//edit中会用字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串(这里就是“Show Me”),
//来替换掉edit中现有文本的从第二个到第十个的字符
_c(edit)->replaceText(edit, "dddd Show Me", 6, -1, 2, 10);
```
#### 2.4.3 insert
```c
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 中现有的文本内容的位置偏移。
- 示例:
```c
//edit中会用字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串(这里就是“Show Me”),
//来插入到edit中现有文本的从第二个字符之后
_c(edit)->insert(edit, "dddd Show Me", 6, -1, 2);
```
#### 2.4.4 append
```c
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 的结束为止。
- 示例:
```c
//edit中会用字符串"dddd Show Me"从第6个字符开始一直到结尾的字符串(这里就是“Show Me”),
//来追加到edit中现有文本的末尾
_c(edit)->append(edit, "dddd Show Me", 6, -1);
```
#### 2.4.5 `getTextLength`
```c
int getTextLength(mEdit *self)
```
- 说明:
获取 Edit 中字符串内容的长度
- 示例:
```c
int text_len = _c(edit)->getTextLength(edit);
```
#### 2.4.6 `getContent`
```c
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`。
- 示例:
```c
char buff[128];
_c(edit)->getContent(edit, buff, 127, 0, -1);//取出edit中的全部内容,buff最多存127个字符
```
#### 2.4.7 `setSel`、`getSel`
```c
int setSel(mEdit *self, int start, int end)
int getSel(mEdit *self, int *pstart, int *pend)
```
- 参数:
- start\end -- 选中区域的起点、终点
- pstart\pend -- 选中区域的起点、终点,用于函数返回
- 说明:
设置、获取选中文本的区域,后两个参数分别对应选中区域的起点和终点。
- 示例:
```c
_c(edit)->setSel(edit, 2, 10);//设置edit的第2~10个字符为选中状态
int ps,pe;
_c(edit)->getSel(edit, &ps, &pe);//获取选中区域
```
#### 2.4.8 `setMargin`
```c
void setMargin(mEdit *self, int left, int top, int right, int bottom)
```
- 参数:
- left, top, right, bottom -- 上下左右的留白,这个参数不是矩形的概念,只是沿用了矩形的数据结构方便参数传递
- 说明:
设置编辑区的上下左右留白
- 示例:
```c
//设置留白
_c(edit)- >setMargin(edit, 10,10,10,10);
```
#### 2.4.9 copy、paste、cut
```c
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
```c
BOOL makevisible(mEdit *self, int pos)
```
- 参数:
- pos -- 需要可见的位置
- 说明:
控制编辑区的滚动,使位置的字符变为可见。
- 示例:
```c
//是第201个字符处可见
_c(edit)- >makevisible(edit, 201);
```
## 3 `mSlEdit`
- 控件窗口类: `NCSCTRL_SLEDIT`
- 控件英文名: Single Line Edit 或者 SlEdit
- 简介: 单行文本编辑框
- 示意图:

### 3.1 `mSlEdit` 风格
继承自 [mEdit 的风格](#21-medit-风格)
| 风格名 | mstudio 属性名 | 说明 |
|:------|:--------------|:-----|
| `NCSS_SLEDIT_PASSWORD` | `Password->TRUE` | 编辑框的内容以密码输入的方式屏蔽显示 |
| `NCSS_SLEDIT_AUTOSELECT` | `AutoSelect->TRUE` | 自动选中风格,获得焦点后文本自动成选中状态 |
### 3.2 `mSlEdit` 属性
继承自 [mEdit 的属性](#22-medit-属性)
| 属性 | mstudio 属性名 | 类型 | 权限 | 说明 |
|:----|:--------------|:-----|:----|:-----|
| `NCSP_SLEDIT_TIPTEXT` | `ToolTip` | `char *` | `RW` | 提示信息字符串,当没有输入时,用来提示用户的信息 |
| `NCSP_SLEDIT_PWDCHAR` | `PasswordChar` | char | `RW` | pass word 显示的字符,只有 `NCSS_SLEDIT_PASSWORD` 风格的有效,默认是‘*’ |
### 3.3 `mSlEdit` 事件
继承自 [mEdit 的事件](#23-medit-事件)
| 事件 ID | 参数 | 说明 |
|:-------|:-----|:----|
| `NCSN_SLEDIT_ENTER` | -- | 捕获到 enter 键消息 |
### 3.4 `mSlEdit` 方法
继承自 [mEdit 的方法](#24-medit-方法)
没有新引入的方法
### 3.5 `mSlEdit` 编程示例
- `SlEdit` 示例代码 :[edit.c](samples/edit.c)
```c
/*
** edit.c: Sample program for mGNCS Programming Guide
** Using edit.
**
** Copyright (C) 2009 Feynman Software.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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` 的使用模板
```c
{
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
- 简介: 多行文本编辑框
- 示意图:

### 4.1 `mMlEdit` 风格
继承自 [mEdit 的风格](#21-medit-风格)
| 风格名 | mstudio 属性名 | 说明 |
|:------|:--------------|:-----|
| `NCSS_MLEDIT_AUTOWRAP` | `AutoWrap->TRUE` | 自动换行 |
### 4.2 `mMlEdit` 属性
继承自 [mEdit 的属性](#22-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 的事件](#23-medit-事件)
没有新引入的事件
### 4.4 `mMlEdit` 方法
继承自 [mEdit 的方法](#24-medit-方法)
### 4.5 `mMlEdit` 编程示例
- `MlEdit` 示例代码 :[edit.c](samples/edit.c)
```c
/*
** edit.c: Sample program for mGNCS Programming Guide
** Using edit.
**
** Copyright (C) 2009 Feynman Software.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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` 的使用模板
```c
{
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
},
```