什么是Soui?
Soui的介绍请查看官方的博客文档,里面有详细的介绍我在这里不多说了,直接上链接:SOUI的介绍
这篇博客主要讲解了Soui的Button的使用,做过UI的都知道Button是最常用的一个控件,经常用到的就是点击一个Button触发一个事件,还有就是对Button的各种属性设置。
以下是我一个例子直接在xml里添加Button的布局:
<SOUI name="mainWindow" maxinset="3,3,3,3" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" margin="5,5,5,5" resizable="1" wndType="appMain"
minSize="600,400"
appWnd="1"
translucent="1"
>
<root colorBkgnd="@color/common_bg" cache="1" width="600" height="400">
<caption pos="0,0,-0,100" show="1" font="adding:0" colorBkgnd="@color/main_title" >
<text pos="10,9" colorText="@color/white">@string/title</text>
<imgbtn name="btn_close" skin="_skin.sys.btn.close" pos="-45,0" tip="close" animate="1"/>
<imgbtn name="btn_max" skin="_skin.sys.btn.maximize" pos="-83,0" animate="1" />
<imgbtn name="btn_restore" skin="_skin.sys.btn.restore" pos="-83,0" show="0" animate="1" />
<imgbtn name="btn_min" skin="_skin.sys.btn.minimize" pos="-121,0" animate="1" />
</caption>
<window layout="vbox" pos="5,[5,-5,-5" colorBkgnd="@color/white" >
<window extend_top="5" size="-2,30" layout="hbox" >
<button name="button1" accel="ctrl+d" id="102" text="快捷键ctrl+d" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button name="button2" text="enable(0)" enable="0" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button name="button3" text="tip" tip="这是一个tip提示" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button name="onVisible" text="visible" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button name="maxWidth" text="maxWidth" maxWidth="100" weight="1" size="0,-2" extend_left="5" extend_right="5" drawFocusRect="0"></button>
</window>
<window extend_top="5" size="-2,30" layout="hbox" >
<button align="left" valign="top" text="align" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="colorText" colorText="@color/red" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button3" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button4" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button5" weight="1" size="0,-2" extend_left="5" extend_right="5" drawFocusRect="0"></button>
</window>
<window extend_top="5" size="-2,30" layout="hbox" >
<button text="Button1" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button2" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button3" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button4" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button5" weight="1" size="0,-2" extend_left="5" extend_right="5" drawFocusRect="0"></button>
</window>
<window extend_top="5" size="-2,30" layout="hbox" >
<button text="Button1" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button2" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button3" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button4" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
<button text="Button5" weight="1" size="0,-2" extend_left="5" extend_right="5" drawFocusRect="0"></button>
</window>
<window size="-1,0" weight="1" layout="vbox" >
<button text="Button1" weight="1" size="-1,0" extend_left="5" drawFocusRect="0"></button>
<button text="Button2" weight="1" size="-1,0" extend_left="5" drawFocusRect="0"></button>
<button text="Button3" weight="1" size="-1,0" extend_left="5" drawFocusRect="0"></button>
<button text="Button4" weight="1" size="-1,0" extend_left="5" drawFocusRect="0"></button>
<button text="Button5" weight="1" size="-1,0" extend_left="5" drawFocusRect="0"></button>
</window>
</window>
</root>
</SOUI>
效果图如下:
按钮点击是监听处理代码如下:
Button 监听注册的方式:
一、第一种方式
//参数说明:第一个参数xml里Button对应的name的名字 第二个参数回调函数界面上点击是回调触发的函数
EVENT_NAME_COMMAND(L"button1", OnClick)
第二种方式
//参数说明:多个按钮点击想回调到同一个函数里注册的方式如下。第一个参数:xml里Button对应的name的名字 第二个参数事件ID 第三个参数:回调函数界面上点击是回调触发的函数
EVENT_NAME_HANDLER(L"button1",SOUI::EVT_CMD, onClick1)
EVENT_NAME_HANDLER(L"button2",SOUI::EVT_CMD, onClick1)
EVENT_NAME_HANDLER(L"button3",SOUI::EVT_CMD, onClick1)
回调函数onClick1获取SButton的对象处理方式如下:
void CMainDlg::onClick1(EventArgs *pEvt){
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
SStringT btnName = pBtn->GetWindowText();
OutputDebugString(btnName);
}
具体代码如下:
MainDlg.h
// MainDlg.h : interface of the CMainDlg class
//
/
#pragma once
class CMainDlg : public SHostWnd
{
public:
CMainDlg();
~CMainDlg();
void OnClose();
void OnMaximize();
void OnRestore();
void OnMinimize();
void OnClick();
void onVisible(EventArgs *pEvt);
void OnSize(UINT nType, CSize size);
BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam);
protected:
//soui消息
EVENT_MAP_BEGIN()
EVENT_NAME_COMMAND(L"btn_close", OnClose)
EVENT_NAME_COMMAND(L"btn_min", OnMinimize)
EVENT_NAME_COMMAND(L"btn_max", OnMaximize)
EVENT_NAME_COMMAND(L"btn_restore", OnRestore)
EVENT_NAME_COMMAND(L"button1", OnClick)
EVENT_NAME_HANDLER(L"onVisible",SOUI::EVT_CMD, onVisible)
EVENT_NAME_HANDLER(L"maxWidth",SOUI::EVT_CMD, onVisible)
EVENT_MAP_END()
//HostWnd真实窗口消息处理
BEGIN_MSG_MAP_EX(CMainDlg)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_CLOSE(OnClose)
MSG_WM_SIZE(OnSize)
CHAIN_MSG_MAP(SHostWnd)
REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()
};
MainDlg.cpp
// MainDlg.cpp : implementation of the CMainDlg class
//
/
#include "stdafx.h"
#include "MainDlg.h"
#include "Windows.h"
CMainDlg::CMainDlg() : SHostWnd(_T("LAYOUT:XML_MAINWND"))
{
}
CMainDlg::~CMainDlg()
{
}
BOOL CMainDlg::OnInitDialog(HWND hWnd, LPARAM lParam)
{
return 0;
}
//TODO:消息映射
void CMainDlg::OnClose()
{
SNativeWnd::DestroyWindow();
}
void CMainDlg::OnMaximize()
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
}
void CMainDlg::OnRestore()
{
SendMessage(WM_SYSCOMMAND, SC_RESTORE);
}
void CMainDlg::OnMinimize()
{
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
}
void CMainDlg::OnClick(){
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
}
void CMainDlg::onVisible(EventArgs *pEvt){
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
SStringT btnName = pBtn->GetWindowText();
OutputDebugString(btnName);
}
void CMainDlg::OnSize(UINT nType, CSize size)
{
SetMsgHandled(FALSE);
SWindow *pBtnMax = FindChildByName(L"btn_max");
SWindow *pBtnRestore = FindChildByName(L"btn_restore");
if(!pBtnMax || !pBtnRestore) return;
if (nType == SIZE_MAXIMIZED)
{
pBtnRestore->SetVisible(TRUE);
pBtnMax->SetVisible(FALSE);
}
else if (nType == SIZE_RESTORED)
{
pBtnRestore->SetVisible(FALSE);
pBtnMax->SetVisible(TRUE);
}
}
button的属性如下,来自官方文档此处记录供自己查看。
button
按钮控件
自身属性
属性名 | 值类型 | 默认值 | 描述 |
---|---|---|---|
accel | STRING | 快捷按键,如ctrl+d | |
animate | BOOL | 0 | 是否启用动画效果 |
animateStep | INT | 25 | 动画的步进值,即每帧增加的不透明度 |
disableAccelIfInvisible | BOOL | 0 | 控件隐藏时,是否也能用快捷按键触发 |
skin | STRING | _skin.sys.btn.normal | override,默认使用SOUI内置按钮皮肤 |
focusable | BOOL | 1 | override,默认可获取焦点 |
继承自window
属性名 | 值类型 | 默认值 | 描述 |
---|---|---|---|
id | INT | 0 | 控件ID |
name | STRING | 控件名称 | |
layout | STRING | souiLayout | 布局样式,支持3种布局 souiLayout 相对布局 gridLayout 网格布局 linearLayout 线性布局(分vbox、hbox两种) |
class | STRING | 属性集合的名称,定义于style中,类比HTML的class属性 | |
skin | STRING | 皮肤样式的名称,定义于skin中 | |
ncSkin | STRING | 非客户区的皮肤 | |
text | STRING | 显示的文本 | |
tip | STRING | 鼠标悬浮时的提示语 | |
trCtx | STRING | 翻译名,为空时使用<soui>的trCtx属性值 | |
data | INT | 0 | 指定一个附加的数据,可通过GetUserData获取 |
enable | BOOL | 1 | 控件是否可用 |
focusable | BOOL | 0 | 控件是否可获取焦点 |
visible | BOOL | 1 | 控件是否可见 |
show | BOOL | 1 | 同visible属性 |
display | BOOL | 1 | 隐藏时是否占位 0 不占位 1 占位 |
maxWidth | INT | -1 | 根据内容自适应大小时的最大宽度 |
float | BOOL | 0 | 位置是否固定不动 |
alpha | UINT | 255 | 控件的透明度(0-255),0为完全透明 |
layeredWindow | BOOL | 0 | 是否为分层窗口 |
msgTransparent | BOOL | 0 | 鼠标消息穿透,开启后控件接收不到鼠标和键盘消息 |
trackMouseEvent | BOOL | 0 | 鼠标事件跟踪,捕获子控件的鼠标消息 |
clipClient | BOOL | 0 | 限制内容只绘制在客户区,开启后超出控件边界的内容会被裁剪掉 |
cache | BOOL | 0 | 绘制缓存 0 无缓存,每次刷新时发送WM_PAINT消息重绘 1 创建绘制缓存,只有自己窗口更新才重绘,否则直接调用缓存绘制 |
drawFocusRect | BOOL | 1 | 是否绘制焦点虚框 |
multiLines | BOOL | 0 | 是否支持多行显示 |
align | STRING | center | 文本水平对齐方式 left 向左 right 向右 center 居中 |
valign | STRING | center | 文本垂直对齐方式 top 向上 bottom 向下 middle 居中 |
colorBkgnd | COLOR | 背景颜色 | |
colorBorder | COLOR | 边框颜色 | |
font | FONT | 正常状态的文本字体 | |
fontHover | FONT | 悬浮状态的文本字体 | |
fontPush | FONT | 按下状态的文本字体 | |
fontDisable | FONT | 禁用状态的文本字体 | |
colorText | COLOR | 正常状态的文本颜色 | |
colorTextHover | COLOR | 悬浮状态的文本颜色 | |
colorTextPush | COLOR | 按下状态的文本颜色 | |
colorTextDisable | COLOR | 禁用状态的文本颜色 | |
margin | INT|SIZE|RECT | 0 | 外边距(非客户区)的大小 |
margin-x | INT | 0 | 左右外边距 |
margin-y | INT | 0 | 上下外边距 |
padding | INT|SIZE|RECT | 0 | 内边距的大小 |
padding_left | INT | 0 | 左内边距 |
padding_top | INT | 0 | 上内边距 |
padding_right | INT | 0 | 右内边距 |
padding_bottom | INT | 0 | 下内边距 |
inset | INT|SIZE|RECT | 0 | 同padding属性 |
cursor | STRING | arrow | 鼠标停留时的光标资源,可取值有: arrow、hand、cross、wait、size、help等 |
dotted | BOOL | 1 | 文本超出边界时,是否使用末尾...显示 |