SOUI知识点小结2

/*
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
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值