//响应控件命令
import win.ui;
/*DSG{{*/
var winform = win.form(text="_WM_COMMAND 消息与 oncommand 事件";right=759;bottom=411)
winform.add(
edit={cls="edit";text="请在运行本程序后修改这里的文本试试";left=15;top=11;right=747;bottom=193;edge=1;multiline=1;z=1};
editTip={cls="edit";left=15;top=212;right=747;bottom=394;edge=1;multiline=1;readonly=1;z=2}
)
/*}}*/

/**************
一个窗口内的控件发生了一些事情，需要通知父窗口，就会发送 _WM_COMMAND 或者 _WM_NOTIFY 消息给父窗口.

最初Windows 3.x 就有的标准控件(Standard Controls)，如Edit，Combobox，Listbox，Button等，发送的控件通知消息的格式是 WM_COMMAND；
而后期的 Win32 通用控件(Common Controls)，如List View，Image List，IP Address，Tree View，Toolbar 等，发送的都是 WM_NOTIFY 控件通知消息。
另外，当用户选择菜单的一个命令项，也会发送 _WM_COMMAND 消息。

早期开发桌面软件使用的是 C++ 这样的静态语言，通常主要代码都是写在父窗口中，所以这种通知父窗口的消息一定意义上来说提供了方便。
但是在 aardio 这样的动态语言中这种方式意义不大，在父窗口上处理所有子控件的消息其实是想对麻烦显不必要的，所以 aardio 将这些消息重新发回给控件对象自己处理。

在 aardio 中通过控件的 oncommand 函数处理自身发出的 _WM_COMMAND 消息，
通过控件的 onnotify 函数处理自身发出的 _WM_NOTIFY 消息。

在 aardio 开发环境的窗体设计器中，右键点击控件，
在弹出菜单中点击「响应命令」就可以为该控件添加 oncommand 函数。
在弹出菜单中点击「响应通知」就可以为该控件添加 onnotify 函数。

窗口控件库参考文档：
https://docs.microsoft.com/zh-cn/windows/win32/controls/individual-control-info
**************/
winform.edit.oncommand = function(id,event){ 
	if(event == 0x300/*_EN_CHANGE*/){
		winform.editTip.print("winform.edit.oncommand 回调函数中收到了文本变更通知")
	}
}

/**************
标准库中的控件，有一些常用的事件也可以通过特定的事件函数来处理,
实现这个功能请右键点代码中的 winform.edit ，在弹出菜单中点「跳转到定义」查看源码。
edit 控件源码定义 onChange 函数的代码为：this._commandFuncnames ={[0x300/*_EN_CHANGE*/]="onChange"}
**************/
winform.edit.onChange = function(){ 
	winform.editTip.print("winform.edit.onChange 回调函数中收到了文本变更通知")
}

/*
oncommand 回调函数中第一个参数是控件 ID，这基本不什么用，
最重要的是回调函数的第二个参数 event，也就是事件代码，通过事件代码可以判断发生了什么事件，
标准控件(Standard Controls) 常用的事件代码如下：

编辑框
_EN_CHANGE编辑框中的文本己更新
_EN_ERRSPACE编辑框内存不足
_EN_HSCROLL用户点击了水平滚动条
_EN_KILLFOCUS编辑框正在失去输入焦点
_EN_MAXTEXT插入的内容被截断
_EN_SETFOCUS编辑框获得输入焦点
_EN_UPDATE编辑框中的文本将要更新
_EN_VSCROLL用户点击了垂直滚动条消息含义

按扭
_BN_CLICKED 用户单击了按钮
_BN_DISABLE 按钮被禁止
_BN_DOUBLECLICKED 用户双击了按钮
_BN_HILITE 用户加亮了按钮
_BN_PAINT 按钮应当重画
_BN_UNHILITE 加亮应当去掉

组合框
_CBN_CLOSEUP 组合框的列表框被关闭
_CBN_DBLCLK 用户双击了一个字符串
_CBN_DROPDOWN 组合框的列表框被拉出
_CBN_EDITCHANGE 用户修改了编辑框中的文本
_CBN_EDITUPDATE 编辑框内的文本即将更新
_CBN_ERRSPACE 组合框内存不足
_CBN_KILLFOCUS 组合框失去输入焦点
_CBN_SELCHANGE 在组合框中选择了一项
_CBN_SELENDCANCEL 用户的选择应当被取消
_CBN_SELENDOK 用户的选择是合法的
_CBN_SETFOCUS 组合框获得输入焦点

列表框
_LBN_DBLCLK用户双击了一项
_LBN_ERRSPACE列表框内存不够
_LBN_KILLFOCUS列表框正在失去输入焦点
_LBN_SELCANCEL选择被取消
_LBN_SELCHANGE选择了另一项
_LBN_SETFOCUS列表框获得输入焦点
*/

winform.show();
win.loopMessage();