/*
2018-8-27 15:21:21
在SOUI工程中关于定时器的使用
*/
CSimpleWnd::SetTimer(定时器的ID,间隔时间,NULL);
CSimpleWnd::KillTimer(定时器的ID);
/*
2018-8-31 14:31:22
使用zip打包
*/
修改资源后 需要将idx文件重新编译一遍,才能将资源加载进入
通过点击事件 进行一个控件的刷新可以得到一个新的状态
从PE加载修改到zip加载需要修改idx的属性和程序入口的设置
使idx属性与设置密码一致
/*
2018-9-11 10:50:20
使用动态的一个动画的形式 显示一些图标
*/
<!--注意autorun,-1为默认,不自动播放,鼠标移上才播放,0表示无间隔循环播放,大于0表示暂停xx秒循环播放-->
<anmimg name="abc" ani_in="skin.anim.logo1" interval="50" pos="-178,25" autorun="2"/>
<anmimg name="def" ani_in="skin.anim.logo2" interval="120" pos="-178,25" autorun="0"/>
/*
2018-9-11 11:49:09
在SOUI中char *到SStringT 之间的转换
*/
SOUI中的一个字符转换
#ifdef UNICODE
#define S_CA2T S_CA2W
#define S_CT2A S_CW2A
#define S_CW2T S_CW2W
#define S_CT2W S_CW2W
#else
#define S_CA2T S_CA2A
#define S_CT2A S_CA2A
#define S_CW2T S_CW2A
#define S_CT2W S_CA2W
#endif // UNICODE
对于得到的结果进行一个转换
strcpcvt.h
S_CT2A 从SStringT 转换到 string类型
S_CA2T 从string类型 转换到 SStringT类型
S_CT2W 从SStringT 转换到 wstring类型
S_CW2T 从wstring类型 转换到 SStringT类型
/*
2018-9-14 09:47:26
SOUI中使用 animaeing动画插件的用法
*/
例子:
<animateimg pos="-100%,12%,-60%,-28%" size="96, 96" autostart="1" speed="100" skin="skin_animate_png" />
这样就能够在界面中显示动画的一个效果了 加上布局使用的百分比 可以在拉伸的时候实现控件同步的效果
/*
2018-9-14 09:50:40
界面布局的方法
*/
“|”代表参考父窗口的中心;如|-10 代表在父窗口的中心向左/上偏移 10 象素。
“%”代表在父窗口的百分比,可以是小数,负数。如:%40 代表在父窗口的 40%位置,%-40则等价于(1-40%)。
“[”相对于前一兄弟窗口。用于 X 时,参考前一兄弟窗口的 right,用于 Y 时参考前一兄弟窗口的 bottom
“]”相对于后一兄弟窗口。用于 X 时,参考后一兄弟的 left,用于 Y 时参考后一兄弟的 top
“{”相对于前一兄弟窗口。用于 X 时,参考前一兄弟窗口的 left,用于 Y 时参考前一兄弟窗口的top
“}”相对于后一兄弟窗口。用于 X 时,参考后一兄弟的 right,用于 Y 时参考后一兄弟的 bottom
“@”标志用来指定窗口的大小,只能出现在 pos 属性的第 3,4 个值中,用来标识窗口的宽度
/*
2018-9-27 17:19:52
更换SOUI的图标
*/
直接在uires.idx文件中修改对应的值
/*
2018-10-16 15:35:34
使用类似MFC的相同方法打开某个文件的方法
CFileDialogEx
*/
使用这个函数进行文件的打开
class CFileDialogEx
{
public:
OPENFILENAME m_ofn;
BOOL m_bOpenFileDialog; // TRUE for file open, FALSE for file save
TCHAR m_szFileTitle[_MAX_FNAME]; // contains file title after return
TCHAR m_szFileName[_MAX_PATH]; // contains full path name after return
CFileDialogEx(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,
LPCTSTR lpszFilter = NULL,
HWND hWndParent = NULL)
{
memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL
m_szFileName[0] = _T('\0');
m_szFileTitle[0] = _T('\0');
m_bOpenFileDialog = bOpenFileDialog;
m_ofn.lStructSize = sizeof(m_ofn);
m_ofn.lpstrFile = m_szFileName;
m_ofn.nMaxFile = _MAX_PATH;
m_ofn.lpstrDefExt = lpszDefExt;
m_ofn.lpstrFileTitle = (LPTSTR)m_szFileTitle;
m_ofn.nMaxFileTitle = _MAX_FNAME;
m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING| OFN_NOCHANGEDIR;
m_ofn.lpstrFilter = lpszFilter;
m_ofn.hwndOwner = hWndParent;
// setup initial file name
if(lpszFileName != NULL)
_tcscpy_s(m_szFileName, _countof(m_szFileName), lpszFileName);
}
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
{
if(m_ofn.hwndOwner == NULL) // set only if not specified before
m_ofn.hwndOwner = hWndParent;
if(m_bOpenFileDialog)
return ::GetOpenFileName(&m_ofn);
else
return ::GetSaveFileName(&m_ofn);
}
};
/*
2018-10-18 10:07:22
关于在SOUI中热键的使用
*/
对于快捷键的设计
例子如下: 按下Ctrl + A 就会响应 "有按键按下的消息事件"
if (nChar == 0x41 && (GetKeyState(VK_CONTROL) & 0x8000)) //VK_CONTROL
{
SMessageBox(NULL, L"有按键按下", L"提示", MB_OK);
}
需要逆向操作一波 才能 快速的响应Ctrl + A
引发了一个问题
就是GetKeyState是否优先于OnKeyDown现获取了按下的键的消息
最后得出结论
if ((GetKeyState(0x41) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000)) //VK_CONTROL
{
SMessageBox(NULL, L"有按键按下", L"提示", MB_OK);
}
这样才比较快(无论是VK_CONTROL 放前面还是后面)
参考SOUI demo SHostKeyCtrl
/*
2018-10-22 10:39:27
通过文件加载资源
*/
SHostDialog fileDlg(_T("file:test.xml"));
fileDlg.DoModal(m_hWnd);
完整的加载方式:
SStringT strCurDir = SApplication::getSingleton().GetAppDir();
strCurDir += _T("\\filewnd");
SetCurrentDirectory(strCurDir);
if (GetFileAttributes(_T("test.xml")) == INVALID_FILE_ATTRIBUTES)
{
SMessageBox(m_hWnd, _T("没有找到资源文件!"), _T("错误"), MB_OK | MB_ICONSTOP);
return;
}
SHostDialog fileDlg(_T("file:test.xml"));
fileDlg.DoModal(m_hWnd);
/*
2018-11-26 10:04:48
记录下使用STileView 的相关知识点
*/
首先是XML的配置问题
tileview:需要增加name配置属性
template:修饰增加显示Item的宽高 以及鼠标放置在上面的一些属性 颜色设置
免注册使用自定义消息事件的方法:
实验:
弄一个空的windows控件拖放到界面上 设置背景色为紫色,name="TestEvent" 在MainDlg中增加如下代码
SWindow *pWnd = FindChildByName2<SWindow>("TestEvent");
pWnd->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CMainDlg::OnButtonClick, this));
bool CMainDlg::OnButtonClick(EventArgs * pEvt)
{
SMessageBox(NULL, L"测试使用自定义消息事件", L"tip", MB_OK);
return false;
}
/*
2018-11-27 15:12:58
使用link 跳转到对应的界面
*/
<link pos="10,130" maxWidth="100" class="cls_btn_weblink" dotted="1" href="www.setoutsoft.cn">www.setoutsoft.cn</link>
使用link 可以跳转到对应的位置
补充:计算时间的角度
关键点:
时针角度 需要小时和分钟 加起来的角度
分针角度 只需要看分钟即可
时针计算角度:分成12等份
分针计算角度:分成60等份
计算时针角度:
double base = (double)(nHour % 12) * ((double)360 / 12);
base += (double)nMinute * ((double)360 / 12 / 60);
计算分针角度:
(double)nValue * ((double)360 / 60);
/*
2018-11-28 16:14:32
SOUI中常用的系统消息
*/
1.Create消息 应用场景:在控件中包含控件的时候 可以用来进行一些初始化操作
MSG_WM_CREATE(OnCreate) //系统最先调用这个 用来初始化相关操作
int OnCreate(LPCREATESTRUCT lpCreateStruct)
2.Paint消息 应用场景:需要自定义一些控件的图像
MSG_WM_PAINT_EX(OnPaint) //自绘常用的一个消息
void OnPaint(SOUI::IRenderTarget * pRT)
3.Char 消息 应用场景:适用键盘输入的事件
MSG_WM_CHAR(OnChar) //监听键盘的一个按下的事件 当键盘按下会触发
void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
基础知识补充:
multiLines 这个属性用于text中或者Edit中 常用来表示是否需要多行显示
这个属性=1的时候 会自动识别\n =0的时候 将不会识别\n
number="1" 通过设置这个属性 可以使Edit中的内容仅为数字
password="1" 通过设置这个 可以使Edit中的文本以密码的形式显示
trackMouseEvent="1" 通过设置这个属性 可以很捕获到鼠标的一些事件(例如:当鼠标离开或者进入按钮 按钮的状态变化)
/*
2018-12-3 14:55:09
使用SOUI中的控件titleview记录
参照SOUI工程中的demos\demo
*/
控件titleview包含在类 STitleView中
xml部分:
<tileview size="576, 240" name="TestTitle" wantTab="1" marginSize="5" pos="8,112" colorBkgnd="#FFFFFF" colorHover="#ffc0cbff">
<template itemHeight="50" itemWidth="50" colorHover="#FFFFFF" colorSelected="#FFFFFF" trackMouseEvent="1">
<Button pos="|0,[5,@115,@22" size="50,50" offset="-0.5,0" name="btn_test" colorBorder="#BCC0CB" margin-x="1" margin-y="1" trackMouseEvent="1" skin="_skin.sys.wnd.bkgnd" />
</template>
</tileview>
组成 由 titleview 和 template 组成
代码片段:(在mainDlg类的OnInitDialog中进行初始化操作)
//关于titleview的使用
STileView *pTileView = FindChildByName2<STileView>("TestTitle");
if (pTileView)
{
std::vector<SStringT> vctInfo{ L"Test1",L"Fun1", L"Ming", L"Get" };
CTestTileAdapter *pAdapter = new CTestTileAdapter(vctInfo);
pTileView->SetAdapter(pAdapter);
pAdapter->Release();
}
这里需要注意的就是 CTestTileAdapter 这个类。这个类继承自SAdapterBase
CTestTileAdapter 类定义:
#pragma once
#include "helper/SAdapterBase.h"
#include <vector>
namespace SOUI
{
class CTestTileAdapter : public SAdapterBase
{
public:
CTestTileAdapter(std::vector<SStringT> vctInfo):m_VctInfo(vctInfo)
{
}
~CTestTileAdapter()
{
if (m_VctInfo.size() > 0)
{
m_VctInfo.swap(std::vector<SStringT>());
}
}
virtual int getCount()
{
return m_VctInfo.size();
}
virtual void getView(int position, SWindow *pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
SButton *pBtn = pItem->FindChildByName2<SButton>(L"btn_test");
pBtn->SetWindowText(SStringT().Format(_T("%s"), m_VctInfo[position]));
pBtn->GetRoot()->SetUserData(position);
pBtn->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestTileAdapter::OnButtonClick, this));
}
bool OnButtonClick(EventArgs *pEvt)
{
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetRoot()->GetUserData(); //获取到第几个
SStringT btnName = pBtn->GetWindowText();
SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked\nbutton of name: %s"), iItem, btnName), _T("haha"), MB_OK);
return true;
}
private:
std::vector<SStringT> m_VctInfo;
};
/*
2018-12-3 15:31:39
关于SOUI中属性的设置
*/
SOUI_ATTRS_BEGIN()
ATTR_CUSTOM(L"accel",OnAttrAccel)
ATTR_INT(L"animate", m_bAnimate, FALSE)
SOUI_ATTRS_END()
例子:
SOUI_ATTRS_BEGIN()
ATTR_INT(L"length", m_Length, FALSE)
SOUI_ATTRS_END()
在自定义的Edit控件中 加入限制长度的条件 就可以用到属性这个
在XML中设置需要的length 就可以将值 传递给 m_Length