用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1255 lines
35 KiB

5 months ago
// MainDlg.cpp : implementation of the CMainDlg class
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MainDlg.h"
#include "helper/SMenu.h"
#include "../controls.extend/FileHelper.h"
#include "../controls.extend/SChatEdit.h"
#include "../controls.extend/reole/richeditole.h"
#include "../controls.extend/SHexEdit.h"
#include "SMatrixWindow.h"
#include "FormatMsgDlg.h"
#include <math.h>
#include <valueAnimator/SValueAnimator.h>
#include <helper/SMenuEx.h>
#include <helper/SDibHelper.h>
#pragma warning(disable:4192)
#include "skin/SSkinLoader.h"
//#define SHOW_AERO //open aero for vista and win7
#define TIMER_QUIT 1000
#define TIMER_SOUI3 1100
#ifdef SHOW_AERO
#include <dwmapi.h>
#pragma comment(lib,"dwmapi.lib")
#endif
#include <shellapi.h>
#include "skin/SDemoSkin.h"
#include "skin/SetSkinWnd2.h"
#include "../controls.extend/SMcListViewEx/SMCListViewEx.h"
#include "adapter.h"
#include "trayicon/SShellNotifyIcon.h"
#include "CAdapter.h"
#include "CDropTarget.h"
int CMainDlg::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
#ifdef SHOW_AERO
MARGINS mar = {5,5,30,5};
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );//打开这里可以启用Aero效果
#endif
ModifyStyle(WS_BORDER, 0); //去掉overlap风格窗口的默认圆角。
SetMsgHandled(FALSE);
return 0;
}
struct student{
TCHAR szName[100];
TCHAR szSex[10];
int age;
int score;
};
//init listctrl
void CMainDlg::InitListCtrl()
{
//找到列表控件
SListCtrl *pList=FindChildByName2<SListCtrl>(L"lc_test");
if(pList)
{
//列表控件的唯一子控件即为表头控件
SWindow *pHeader=pList->GetWindow(GSW_FIRSTCHILD);
//向表头控件订阅表明点击事件,并把它和OnListHeaderClick函数相连。
pHeader->GetEventSet()->subscribeEvent(EVT_HEADER_CLICK,Subscriber(&CMainDlg::OnListHeaderClick,this));
TCHAR szSex[][5]={_T(""),_T(""),_T("人妖")};
for(int i=0;i<100;i++)
{
student *pst=new student;
_stprintf(pst->szName,_T("学生_%d"),i+1);
_tcscpy(pst->szSex,szSex[rand()%3]);
pst->age=rand()%30;
pst->score=rand()%60+40;
int iItem=pList->InsertItem(i,pst->szName);
pList->SetItemData(iItem,(LPARAM)pst);
pList->SetSubItemText(iItem,1,pst->szSex);
TCHAR szBuf[10];
_stprintf(szBuf,_T("%d"),pst->age);
pList->SetSubItemText(iItem,2,szBuf);
_stprintf(szBuf,_T("%d"),pst->score);
pList->SetSubItemText(iItem,3,szBuf);
}
}
SMCListViewEx *musiclist = FindChildByName2<SMCListViewEx>(_T("musiclist"));
if (musiclist)
{
SMusicListAdapter* musicadapter = new SMusicListAdapter(1, m_hWnd);
musiclist->SetAdapter(musicadapter);
}
}
void SaveSkinInf2File(SkinType skinType, SkinSaveInf &skinSaveInf)
{
pugi::xml_document docSave;
pugi::xml_node rootNode = docSave.append_child(L"DEMO_SKIN_CONFIG");
pugi::xml_node childSkinType = rootNode.append_child(L"skinInf");
childSkinType.append_attribute(L"type") = skinType;
SStringT strSkinConfigPath = SApplication::getSingleton().GetAppDir() + _T("\\themes\\skin_config.xml");
switch (skinType)
{
case color://纯色只有SkinSaveInf的color有效
childSkinType.append_attribute(L"color") = (int)skinSaveInf.color;
break;
case sys://此处为系统皮肤,只需要给文件路径和margin
{
childSkinType.append_attribute(L"skin_path") = skinSaveInf.filepath;
SStringW margin;
margin.Format(L"%d,%d,%d,%d", skinSaveInf.margin.left, skinSaveInf.margin.top, skinSaveInf.margin.right, skinSaveInf.margin.bottom);
childSkinType.append_attribute(L"skin_margin") = margin;
}
break;
case builtin:
default:
break;
}
docSave.save_file(strSkinConfigPath);
}
bool CMainDlg::SaveSkin(SkinType skinType, SkinSaveInf &skinSaveInf)
{
HRESULT hr = S_OK;
SaveSkinInf2File(skinType, skinSaveInf);
return hr == S_OK;
}
void LoadSkinFormXml(SDemoSkin *skin, SkinType *skinType, SkinLoadInf *skininf)
{
SStringT strSkinConfigPath = SApplication::getSingleton().GetAppDir() + _T("\\themes\\skin_config.xml");
pugi::xml_document docLoad;
pugi::xml_parse_result result = docLoad.load_file(strSkinConfigPath);
if (result)
{
pugi::xml_node skinInf = docLoad.child(L"DEMO_SKIN_CONFIG").child(L"skinInf");
*skinType = (SkinType)skinInf.attribute(L"type").as_int();
switch (*skinType)
{
//纯色只有SkinSaveInf的color有效
case color:
skininf->color = skinInf.attribute(L"color").as_int();
break;
//此处为系统皮肤,只需要给文件路径和margin
case sys:
skininf->filepath = skinInf.attribute(L"skin_path").as_string();
int v1 = 0, v2 = 0, v3 = 0, v4 = 0;
swscanf(skinInf.attribute(L"skin_margin").as_string(), L"%d,%d,%d,%d", &v1, &v2, &v3, &v4);
skininf->margin.left = v1;
skininf->margin.top = v2;
skininf->margin.right = v3;
skininf->margin.bottom = v4;
break;
}
}
}
bool CMainDlg::LoadSkin()
{
SDemoSkin *skin = (SDemoSkin *)GETSKIN(L"demoskinbk",GetScale());
if (skin)
{
SkinLoadInf loadInf;
SkinType type;
LoadSkinFormXml(skin, &type, &loadInf);
skin->SetHander(this);
return skin->LoadSkin(type, loadInf);
}
return false;
}
int funCmpare(void* pCtx,const void *p1,const void *p2)
{
int iCol=*(int*)pCtx;
const DXLVITEM *plv1=(const DXLVITEM*)p1;
const DXLVITEM *plv2=(const DXLVITEM*)p2;
const student *pst1=(const student *)plv1->dwData;
const student *pst2=(const student *)plv2->dwData;
switch(iCol)
{
case 0://name
return _tcscmp(pst1->szName,pst2->szName);
case 1://sex
return _tcscmp(pst1->szSex,pst2->szSex);
case 2://age
return pst1->age-pst2->age;
case 3://score
return pst1->score-pst2->score;
default:
return 0;
}
}
//表头点击事件处理函数
bool CMainDlg::OnListHeaderClick(EventArgs *pEvtBase)
{
//事件对象强制转换
EventHeaderClick *pEvt =(EventHeaderClick*)pEvtBase;
SHeaderCtrl *pHeader=(SHeaderCtrl*)pEvt->sender;
//从表头控件获得列表控件对象
SListCtrl *pList= (SListCtrl*)pHeader->GetParent();
//列表数据排序
SHDITEM hditem;
hditem.mask=SHDI_ORDER;
pHeader->GetItem(pEvt->iItem,&hditem);
pList->SortItems(funCmpare,&hditem.iOrder);
return true;
}
void CMainDlg::OnDestory()
{
SListCtrl *pList=FindChildByName2<SListCtrl>(L"lc_test");
if(pList)
{
for(int i=0;i<pList->GetItemCount();i++)
{
student *pst=(student*) pList->GetItemData(i);
delete pst;
}
}
SDemoSkin *skin = (SDemoSkin *)GETSKIN(L"demoskinbk",GetScale());
if (skin)
{
skin->SaveSkin();
}
SetMsgHandled(FALSE);
if (m_pTabBinder)
delete m_pTabBinder;
if (m_pTabBinder2)
delete m_pTabBinder2;
}
class CSmileySource2 : public CSmileySource
{
public:
CSmileySource2(){}
protected:
//获对ID对应的图片路径
virtual SStringW ImageID2Path(UINT nID)
{
return SStringW().Format(L"./gif/%d.gif",nID);
}
};
//Richedit中插入表情使用的回调函数。
ISmileySource * CreateSource2()
{
return new CSmileySource2;
}
HRESULT CMainDlg::OnSkinChangeMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bHandled)
{
STabCtrl *pMainTab = FindChildByName2<STabCtrl>("tab_main");
if(SSkinPoolMgr::getSingletonPtr()->GetSkin(L"tab_icon",100))
{
pMainTab->SetAttribute(L"iconSkin",L"tab_icon");
}else
{
pMainTab->SetAttribute(L"iconSkin",L"skin_page_icons");
}
FindChildByID(9527)->Invalidate();
SDemoSkin *skin = (SDemoSkin *) GETSKIN(L"demoskinbk",GetScale());
DWORD tm1=GetTickCount();
COLORREF crTheme = skin->GetThemeColor();
if (crTheme != CR_INVALID)
DoColorize(crTheme | 0xff000000);
else
DoColorize(0);
SLOG_INFO("DoColorize spend "<<GetTickCount()-tm1<<" ms");
return S_OK;
}
LRESULT CMainDlg::OnInitDialog( HWND hWnd, LPARAM lParam )
{
SLOG_INFO("OnInitDialog");
m_bLayoutInited=TRUE;
FindChildByID2<SGroupList>(R.id.gl_catalog)->SelectPage(R.id.page_mclistview);
STabCtrl *pTabCtrl = FindChildByName2<STabCtrl>(L"tab_radio2");
{
m_pTabBinder = new STabCtrlHeaderBinder(pTabCtrl);
m_pTabBinder->Bind(FindChildByName(L"radio3_1"), 0);
m_pTabBinder->Bind(FindChildByName(L"radio3_2"), 1);
m_pTabBinder->Bind(FindChildByName(L"radio3_3"), 2);
m_pTabBinder->Bind(FindChildByName(L"radio3_4"), 3);
m_pTabBinder->Bind(FindChildByName(L"radio3_5"), 4);
m_pTabBinder->Bind(FindChildByName(L"radio3_6"), 5);
m_pTabBinder2 = new STabCtrlHeaderBinder(pTabCtrl);
m_pTabBinder->Bind(FindChildByName(L"btn4_1"), 0);
m_pTabBinder->Bind(FindChildByName(L"btn4_2"), 1);
m_pTabBinder->Bind(FindChildByName(L"btn4_3"), 2);
m_pTabBinder->Bind(FindChildByName(L"btn4_4"), 3);
m_pTabBinder->Bind(FindChildByName(L"btn4_5"), 4);
m_pTabBinder->Bind(FindChildByName(L"btn4_6"), 5);
}
LoadSkin();
//设置为磁吸主窗口
SetMainWnd(m_hWnd);
InitListCtrl();
SWindow *pEdit1 = FindChildByName(L"edit_drop_top");
//设置标题
SStringW strTitle = SStringW().Format(GETSTRING(R.string.title),SOUI_VER1,SOUI_VER2,SOUI_VER3,SOUI_VER4);
FindChildByID(R.id.txt_title)->SetWindowText(S_CW2T(tr(strTitle)));
//演示在SOUI中的拖放
SWindow *pEdit2 = FindChildByName(L"edit_drop_bottom");
if(pEdit1 && pEdit2)
{
HRESULT hr=::RegisterDragDrop(m_hWnd,GetDropTarget());
RegisterDragDrop(pEdit1->GetSwnd(),new CTestDropTarget1(pEdit1));
RegisterDragDrop(pEdit2->GetSwnd(),new CTestDropTarget1(pEdit2));
}
SRichEdit *pEdit = FindChildByName2<SRichEdit>(L"re_gifhost");
if(pEdit)
{
SetSRicheditOleCallback(pEdit,CreateSource2);
pEdit->SetAttribute(L"rtf",L"rtf:rtf_test");
}
//演示如何响应Edit的EN_CHANGE事件
SEdit *pEditUrl = FindChildByName2<SEdit>(L"edit_url");
if(pEditUrl)
{
pEditUrl->SSendMessage(EM_SETEVENTMASK,0,ENM_CHANGE);
}
//演示SetWindowRgn用法
SWindow *pWndRgn = FindChildByName(L"wnd_rgn");
if(pWndRgn)
{
//性能优化后,隐藏窗口不能直接获取位置,这里先主动请求布局。
SList<SWindow*> pps;
SWindow *p = pWndRgn->GetParent();
while (!p->IsVisible(TRUE))
{
pps.AddHead(p);
p = p->GetParent();
}
SPOSITION pos = pps.GetHeadPosition();
while (pos)
{
SWindow *p = pps.GetNext(pos);
p->UpdateChildrenPosition();
}
SAutoRefPtr<IRegion> pRgn;
GETRENDERFACTORY->CreateRegion(&pRgn);
CRect rc=pWndRgn->GetWindowRect();
rc.MoveToXY(0,0);//注意:SWindow将窗口的左上角定义为Rgn的原点。
pRgn->CombineEllipse(&rc,RGN_COPY);
pWndRgn->SetWindowRgn(pRgn,TRUE);
}
//行高固定的列表
SListView *pLstViewFix = FindChildByName2<SListView>("lv_test_fix");
if(pLstViewFix)
{
ILvAdapter *pAdapter = new CTestAdapterFix;
pLstViewFix->SetAdapter(pAdapter);
pAdapter->Release();
}
//行高固定的列表
SListView *pLstViewFixHorz = FindChildByName2<SListView>("lv_test_fix_horz");
if(pLstViewFixHorz)
{
ILvAdapter *pAdapter = new CTestAdapterFixHorz;
pLstViewFixHorz->SetAdapter(pAdapter);
pAdapter->Release();
}
//行高可变的列表
SListView *pLstViewFlex = FindChildByName2<SListView>("lv_test_flex");
if(pLstViewFlex)
{
ILvAdapter *pAdapter = new CTestAdapterFlex;
pLstViewFlex->SetAdapter(pAdapter);
pAdapter->Release();
}
//多列listview
SMCListView * pMcListView = FindChildByName2<SMCListView>("mclv_test");
if(pMcListView)
{
IMcAdapter *pAdapter = new CTestMcAdapterFix;
pMcListView->SetAdapter(pAdapter);
pAdapter->Release();
}
//tileView
STileView *pTileView = FindChildByName2<STileView>("lv_test_tile");
if(pTileView)
{
CTestTileAdapter *pAdapter = new CTestTileAdapter;
pTileView->SetAdapter(pAdapter);
pAdapter->Release();
}
//treeview
STreeView * pTreeView = FindChildByName2<STreeView>("tree_view_00");
if (pTreeView)
{
CTreeViewAdapter * pTreeViewAdapter = new CTreeViewAdapter;
pTreeView->SetAdapter(pTreeViewAdapter);
pTreeViewAdapter->Release();
}
FindChildByID2<SShellNotifyIcon>(8)->StartAni();
SPathView *pPathView = FindChildByName2<SPathView>("pv_test");
if(pPathView)
{
CRect rc=pPathView->GetClientRect();
POINT pts[10];
for(int i=0;i<ARRAYSIZE(pts);i++)
{
pts[i].x = rand()%500;
pts[i].y = rand()%300;
}
pPathView->AddPoint(pts,ARRAYSIZE(pts));
}
//init soui 3.0 animation.
InitSoui3Animation();
BYTE hexData[128] = {0};
for (int i=0; i<sizeof(hexData); ++i)
{
hexData[i] = i;
}
SHexEdit* hexEdit = FindChildByName2<SHexEdit>("ctrl_hexedit");
hexEdit->SetData(hexData, sizeof(hexData));
return 0;
}
void CMainDlg::OnBtnWebkitGo()
{
SWkeWebkit *pWebkit= FindChildByName2<SWkeWebkit>(L"wke_test");
if(pWebkit)
{
SEdit *pEdit=FindChildByName2<SEdit>(L"edit_url");
SStringT strUrl=pEdit->GetWindowText();
pWebkit->SetAttribute(L"url",S_CT2W(strUrl),FALSE);
}
}
void CMainDlg::OnBtnWebkitBackward()
{
SWkeWebkit *pWebkit= FindChildByName2<SWkeWebkit>(L"wke_test");
if(pWebkit)
{
pWebkit->GetWebView()->goBack();
}
}
void CMainDlg::OnBtnWebkitForeward()
{
SWkeWebkit *pWebkit= FindChildByName2<SWkeWebkit>(L"wke_test");
if(pWebkit)
{
pWebkit->GetWebView()->goForward();
}
}
void CMainDlg::OnBtnWebkitRefresh()
{
SWkeWebkit *pWebkit= FindChildByName2<SWkeWebkit>(L"wke_test");
if(pWebkit)
{
pWebkit->GetWebView()->reload();
}
}
void CMainDlg::OnBtnSelectGIF()
{
SGifPlayer *pGifPlayer = FindChildByName2<SGifPlayer>(L"giftest");
if(pGifPlayer)
{
CFileDialogEx openDlg(TRUE,_T("gif"),0,6,_T("gif files(*.gif)\0*.gif\0All files (*.*)\0*.*\0\0"));
if(openDlg.DoModal()==IDOK)
pGifPlayer->PlayGifFile(openDlg.m_szFileName);
}
}
void CMainDlg::OnBtnMenu()
{
CPoint pt;
GetCursorPos(&pt);
//使用自绘菜单
SMenu menu;
menu.LoadMenu(_T("SMenu:menu_test"));
menu.TrackPopupMenu(0,pt.x,pt.y,m_hWnd);
}
//演示如何响应菜单事件
void CMainDlg::OnCommand( UINT uNotifyCode, int nID, HWND wndCtl )
{
if(uNotifyCode==0)
{
if(nID == 7)
{
if(GetColorizeColor()==0) DoColorize(RGB(255,255,0));//将图片调整为粉红
else DoColorize(0);//恢复
}
else if(nID==6)
{//nID==6对应menu_test定义的菜单的exit项。
PostMessage(WM_CLOSE);
}else if(nID==54)
{//about SOUI
STabCtrl *pTabCtrl = FindChildByName2<STabCtrl>(L"tab_main");
if(pTabCtrl) pTabCtrl->SetCurSel(_T("about"));
}
else if (nID == 51)
{//skin1
SSkinLoader::getSingleton().LoadSkin(_T("themes\\skin1"));
SWindow::Invalidate();
}
else if (nID == 52)
{//skin2
SSkinLoader::getSingleton().LoadSkin(_T("themes\\skin2"));
SWindow::Invalidate();
}
else if (nID == 53)
{//skin3
SSkinLoader::getSingleton().LoadSkin(_T("themes\\skin3"));
SWindow::Invalidate();
}
else if(nID==100)
{//delete item in mclistview
SMCListView *pListView = FindChildByName2<SMCListView>(L"mclv_test");
if(pListView)
{
int iItem = pListView->GetSel();
if(iItem!=-1)
{
CTestMcAdapterFix *pAdapter = (CTestMcAdapterFix*)pListView->GetAdapter();
pAdapter->DeleteItem(iItem);
}
}
}
}
}
void CMainDlg::OnBtnHideTest()
{
SWindow * pBtn = FindChildByName(L"btn_display");
if(pBtn) pBtn->SetVisible(!pBtn->IsVisible(TRUE),TRUE);
}
void CMainDlg::OnBtnInsertGif2RE()
{
SRichEdit *pEdit = FindChildByName2<SRichEdit>(L"re_gifhost");
if(pEdit)
{
CFileDialogEx openDlg(TRUE,_T("gif"),0,6,_T("gif files(*.gif)\0*.gif\0All files (*.*)\0*.*\0\0"));
if(openDlg.DoModal()==IDOK)
{
ISmileySource* pSource = new CSmileySource2;
HRESULT hr=pSource->LoadFromFile(S_CT2W(openDlg.m_szFileName));
if(SUCCEEDED(hr))
{
SComPtr<ISmileyCtrl> pSmiley;
hr=::CoCreateInstance(CLSID_SSmileyCtrl,NULL,CLSCTX_INPROC,__uuidof(ISmileyCtrl),(LPVOID*)&pSmiley);
if(SUCCEEDED(hr))
{
pSmiley->SetSource(pSource);
SComPtr<IRichEditOle> ole;
pEdit->SSendMessage(EM_GETOLEINTERFACE,0,(LPARAM)&ole);
pSmiley->Insert2Richedit(ole);
}else
{
UINT uRet = SMessageBox(m_hWnd,_T("可能是因为没有向系统注册表情COM模块。\\n现在注册吗?"),_T("创建表情OLE对象失败"),MB_YESNO|MB_ICONSTOP);
if(uRet == IDYES)
{
HMODULE hMod = LoadLibrary(_T("sosmiley.dll"));
if(hMod)
{
typedef HRESULT (STDAPICALLTYPE *DllRegisterServerPtr)();
DllRegisterServerPtr funRegDll = (DllRegisterServerPtr)GetProcAddress(hMod,"DllRegisterServer");
if(funRegDll)
{
HRESULT hr=funRegDll();
if(FAILED(hr))
{
SMessageBox(m_hWnd,_T("请使用管理员权限运行模块注册程序"),_T("注册表情COM失败"),MB_OK|MB_ICONSTOP);
}else
{
SMessageBox(m_hWnd,_T("请重试"),_T("注册成功"),MB_OK|MB_ICONINFORMATION);
}
}
FreeLibrary(hMod);
}else
{
SMessageBox(m_hWnd,_T("没有找到表情COM模块[sosmiley.dll]。\\n现在注册吗"),_T("错误"),MB_OK|MB_ICONSTOP);
}
}
}
}else
{
SMessageBox(m_hWnd,_T("加载表情失败"),_T("错误"),MB_OK|MB_ICONSTOP);
}
pSource->Release();
}
}
}
void CMainDlg::OnBtnAppendMsg()
{
SChatEdit *pEdit = FindChildByName2<SChatEdit>(L"re_gifhost");
if(pEdit)
{
CFormatMsgDlg formatMsgDlg;
if(formatMsgDlg.DoModal()==IDOK)
{
for(int i=0;i<formatMsgDlg.m_nRepeat;i++)
pEdit->AppendFormatText(S_CT2W(SStringT().Format(_T("line:%d "),i) + formatMsgDlg.m_strMsg));
}
}
}
void CMainDlg::OnBtnMsgBox()
{
SMessageBox(NULL,_T("this is a message box"),_T("haha"),MB_OK|MB_ICONEXCLAMATION);
SMessageBox(NULL,_T("this message box includes two buttons"),_T("haha"),MB_YESNO|MB_ICONQUESTION);
SNativeWnd::SetTimer(TIMER_QUIT,3000,NULL);//3S后退出APP
SMessageBox(NULL,_T("this message box includes three buttons. \nthe app will quit after 3 seconds if you keep the msgbox open!"),_T("Alarm"),MB_ABORTRETRYIGNORE|MB_ICONSTOP);
SNativeWnd::KillTimer(TIMER_QUIT);
}
class SSkiaTestWnd : public SHostWnd
{
public:
SSkiaTestWnd(LPCTSTR pszResName = NULL):SHostWnd(pszResName){}
protected:
void OnLButtonDown(UINT nFlags,CPoint pt)
{
SMessageBox(m_hWnd,_T("test"),_T("msgbox"),MB_OK);
SetMsgHandled(FALSE);
}
BEGIN_MSG_MAP_EX(SSkiaTestWnd)
MSG_WM_LBUTTONDOWN(OnLButtonDown)
CHAIN_MSG_MAP(__super)
END_MSG_MAP()
void OnFinalMessage(HWND hWnd){
//演示OnFinalMessage用法,下面new出来的不需要显示调用delete
__super::OnFinalMessage(hWnd);
delete this;
}
};
void CMainDlg::OnBtnLRC()
{
static int s_Count = 0;
SSkiaTestWnd* pHostWnd = new SSkiaTestWnd(_T("layout:dlg_skiatext"));
pHostWnd->Create(m_hWnd,WS_POPUP,0,0,0,0,0);
//选择一种吸附模式
CMagnetFrame::ATTACHMODE am;
CMagnetFrame::ATTACHALIGN aa;
switch(s_Count++ %4)
{
case 0:am = AM_TOP,aa = AA_LEFT;break;
case 1:am = AM_BOTTOM, aa=AA_LEFT;break;
case 2:am = AM_LEFT, aa=AA_TOP;break;
case 3:am = AM_RIGHT,aa=AA_TOP;break;
}
AddSubWnd(pHostWnd->m_hWnd, am,aa);
pHostWnd->ShowWindow(SW_SHOW);
}
void CMainDlg::OnTabPageRadioSwitch(EventArgs *pEvt)
{
EventSwndStateChanged *pEvt2 = sobj_cast<EventSwndStateChanged>(pEvt);
if(pEvt2->CheckState(WndState_Check) && (pEvt2->dwNewState & WndState_Check))
{
int id= pEvt->idFrom;
STabCtrl *pTab =FindChildByName2<STabCtrl>(L"tab_radio2");
if(pTab) pTab->SetCurSel(id-10000);
}
}
void CMainDlg::OnBtnRtfSave()
{
SRichEdit *pEdit = FindChildByName2<SRichEdit>(L"re_gifhost");
if(pEdit)
{
CFileDialogEx openDlg(FALSE,_T("rtf"),_T("soui_richedit"),6,_T("rtf files(*.rtf)\0*.rtf\0All files (*.*)\0*.*\0\0"));
if(openDlg.DoModal()==IDOK)
{
pEdit->SaveRtf(openDlg.m_szFileName);
}
}
}
void CMainDlg::OnBtnRtfOpen()
{
SRichEdit *pEdit = FindChildByName2<SRichEdit>(L"re_gifhost");
if(pEdit)
{
CFileDialogEx openDlg(TRUE,_T("rtf"),0,6,_T("rtf files(*.rtf)\0*.rtf\0All files (*.*)\0*.*\0\0"));
if(openDlg.DoModal()==IDOK)
{
pEdit->LoadRtf(openDlg.m_szFileName);
}
}
}
void CMainDlg::OnChromeTabNew( EventArgs *pEvt )
{
static int iPage = 0;
EventChromeTabNew *pEvtTabNew = (EventChromeTabNew*)pEvt;
SStringT strTitle = SStringT().Format(_T("新建窗口 %d"),++iPage);
pEvtTabNew->pNewTab->SetWindowText(strTitle);
pEvtTabNew->pNewTab->SetAttribute(L"tip",S_CT2W(strTitle));
}
//演示如何使用文件资源创建窗口
void CMainDlg::OnBtnFileWnd()
{
//由于资源中使用了相对路径,需要将当前路径指定到资源所在位置
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);
}
//演示如何响应Edit的EN_CHANGE事件
void CMainDlg::OnUrlReNotify(EventArgs *pEvt)
{
EventRENotify *pEvt2 = sobj_cast<EventRENotify>(pEvt);
SLOGFMTD(_T("OnUrlReNotify,iNotify = %d"),pEvt2->iNotify);
if(pEvt2->iNotify == EN_CHANGE)
{
SLOGFMTD(_T("OnUrlReNotify,iNotify = EN_CHANGE"));
}
}
void CMainDlg::OnMclvCtxMenu(EventArgs *pEvt)
{
EventCtxMenu *pEvt2 = sobj_cast<EventCtxMenu>(pEvt);
POINT pt = pEvt2->pt;
{
//选中鼠标点击行
SMCListView *pListview = sobj_cast<SMCListView>(pEvt2->sender);
CPoint pt2 = pt;
SItemPanel *pItem = pListview->HitTest(pt2);
if(pItem)
{
int iItem = pItem->GetItemIndex();
pListview->SetSel(iItem);
SLOGFMTD(_T("当前选中行:%d"),iItem);
}
}
SMenu menu;
menu.LoadMenu(_T("smenu:menu_lv"));
ClientToScreen(&pt);
menu.TrackPopupMenu(0,pt.x,pt.y,m_hWnd);
}
void CMainDlg::OnMclvEventOfPanel(EventArgs * pEvt)
{
EventOfPanel *e2 = sobj_cast<EventOfPanel>(pEvt);
SASSERT(e2);
if (e2->pOrgEvt->GetID() == EventItemPanelDbclick::EventID)
{
EventItemPanelDbclick *e3 = sobj_cast<EventItemPanelDbclick>(e2->pOrgEvt);
SItemPanel *pSender = sobj_cast<SItemPanel>(e3->sender);
SASSERT(pSender);
int iItem = pSender->GetItemIndex();
SMessageBox(m_hWnd, SStringT().Format(_T("double click item:%d"), iItem+1), _T("haha"), MB_OK | MB_ICONSTOP);
}
}
//处理模拟菜单中控件的事件
void CMainDlg::OnMenuSliderPos(EventArgs *pEvt)
{
EventSliderPos *pEvt2 = sobj_cast<EventSliderPos>(pEvt);
SASSERT(pEvt2);
SSliderBar * pSlider = sobj_cast<SSliderBar>(pEvt->sender);
SASSERT(pSlider);
//注意此处不能调用this->FindChildByXXX,因为pEvt是菜单中的对象,和this不是一个host
SWindow *pText = pSlider->GetParent()->FindChildByName(L"menu_text");
SASSERT(pText);
pText->SetWindowText(SStringT().Format(_T("%d"),pEvt2->nPos));
}
void CMainDlg::OnMatrixWindowReNotify(EventArgs *pEvt)
{
EventRENotify *pEvt2 = sobj_cast<EventRENotify>(pEvt);
SASSERT(pEvt2);
if(pEvt2->iNotify != EN_CHANGE)
return;
SEdit *pEdit = sobj_cast<SEdit>(pEvt->sender);
SASSERT(pEdit);
SStringW strValue = S_CT2W(pEdit->GetWindowText());
SWindow *pMatrixWnd = FindChildByName(L"matrix_test");
SASSERT(pMatrixWnd);
if(SStringW(L"edit_rotate") == pEvt->nameFrom)
{
pMatrixWnd->SetAttribute(L"rotate",strValue);
}else if(SStringW(L"edit_skew") == pEvt->nameFrom)
{
pMatrixWnd->SetAttribute(L"skew",strValue);
}else if(SStringW(L"edit_scale")==pEvt->nameFrom)
{
pMatrixWnd->SetAttribute(L"scale",strValue);
}else if(SStringW(L"edit_translate") == pEvt->nameFrom)
{
pMatrixWnd->SetAttribute(L"translate",strValue);
}
}
//演示从XML字符串动态创建子窗口,使用subscribeEvent来响应创建出来的控件的事件,这里不做演示
void CMainDlg::OnBtnCreateChildren()
{
SRichEdit *pEdit = FindChildByID2<SRichEdit>(R.id.edit_xml);
SASSERT(pEdit);
SStringW strXml = S_CT2W(pEdit->GetWindowText());
SWindow *pContainer = FindChildByID(R.id.wnd_container);
SASSERT(pContainer);
//remove all children at first.
SWindow *pChild = pContainer->GetWindow(GSW_FIRSTCHILD);
while(pChild)
{
SWindow *pNext = pChild->GetWindow(GSW_NEXTSIBLING);
pChild->DestroyWindow();
pChild = pNext;
}
//using SWindow::CreateChildren to Create Children described in the input xml string.
pContainer->CreateChildren(strXml);
}
void CMainDlg::OnInitListBox()
{
SListBox *pLb = FindChildByID2<SListBox>(R.id.lb_test);
if(pLb)
{
int nCount = pLb->GetCount();
for(int i=0; i< 20; i++)
{
int iItem = pLb->AddString(SStringT().Format(_T("new item:%d"),nCount+i));
pLb->EnsureVisible(iItem);
pLb->UpdateWindow();
Sleep(10);
}
}
}
//
// void CMainDlg::OnSetSkin(int iSkin)
// {
// SStringW strSkin = SStringW().Format(L"skin_bkimg_%d",iSkin);
// SSkinImgList * pSkin = sobj_cast<SSkinImgList>(GETSKIN(strSkin));
// SASSERT(pSkin);
// COLORREF crAvg = SDIBHelper::CalcAvarageColor(pSkin->GetImage());
// FindChildByID(R.id.img_skin_layer)->SetAttribute(L"skin",strSkin);
// DoColorize(crAvg);
// }
void CMainDlg::OnBtnSkin()
{
if (!::IsWindow(m_hSetSkinWnd))
{
CSetSkinWnd *pSetSkinWnd = new CSetSkinWnd();
pSetSkinWnd->Create(NULL);
pSetSkinWnd->CenterWindow(GetDesktopWindow());
pSetSkinWnd->ShowWindow(SW_SHOWDEFAULT);
m_hSetSkinWnd = pSetSkinWnd->m_hWnd;
}
else
{
SetForegroundWindow(m_hSetSkinWnd);
FlashWindow(m_hSetSkinWnd, TRUE);
}
}
UINT CMainDlg::Run()
{
while(!IsStoped())
{
int nSleep = rand()%2000+500;
#if _MSC_VER >= 1700 //VS2012
SRUNONUI(
SStringW strMsg = SStringW().Format(L"event thread, sleep = %d", nSleep);
SChatEdit *pOutput = FindChildByID2<SChatEdit>(R.id.re_notifycenter);
pOutput->AppendFormatText(strMsg);
);
#else
EventThread *pEvt = new EventThread(this);
pEvt->nData = nSleep;
SNotifyCenter::getSingleton().FireEventAsync(pEvt);
pEvt->Release();
#endif
Sleep(nSleep);
}
return 0;
}
void CMainDlg::OnBtnStartNotifyThread()
{
if(IsRunning()) return;
SNotifyCenter::getSingleton().addEvent(EVENTID(EventThreadStart));
SNotifyCenter::getSingleton().addEvent(EVENTID(EventThreadStop));
SNotifyCenter::getSingleton().addEvent(EVENTID(EventThread));
EventThreadStart evt(this);
SNotifyCenter::getSingleton().FireEventSync(&evt);
BeginThread();
}
void CMainDlg::OnBtnStopNotifyThread()
{
if(!IsRunning()) return;
EndThread();
EventThreadStop evt(this);
SNotifyCenter::getSingleton().FireEventSync(&evt);
SNotifyCenter::getSingleton().removeEvent(EventThreadStart::EventID);
SNotifyCenter::getSingleton().removeEvent(EventThreadStop::EventID);
SNotifyCenter::getSingleton().removeEvent(EventThread::EventID);
}
bool CMainDlg::OnEventThreadStart(EventArgs *e)
{
SChatEdit *pOutput = FindChildByID2<SChatEdit>(R.id.re_notifycenter);
pOutput->AppendFormatText(L"start Thread");
return true;
}
bool CMainDlg::OnEventThreadStop(EventArgs *e)
{
SChatEdit *pOutput = FindChildByID2<SChatEdit>(R.id.re_notifycenter);
pOutput->AppendFormatText(L"stop Thread");
return true;
}
bool CMainDlg::OnEventThread(EventArgs *e)
{
EventThread *pEvt = sobj_cast<EventThread>(e);
SStringW strMsg = SStringW().Format(L"event thread, sleep = %d",pEvt->nData);
SChatEdit *pOutput = FindChildByID2<SChatEdit>(R.id.re_notifycenter);
pOutput->AppendFormatText(strMsg);
return true;
}
void CMainDlg::OnBtnTip()
{
SWindow *pBtn = FindChildByID(R.id.btn_tip);
if (pBtn)
{
CRect rc = pBtn->GetWindowRect();
ClientToScreen(&rc);
STipWnd::ShowTip(rc.right, rc.top, STipWnd::AT_LEFT_BOTTOM, _T("欢迎使用SOUI!\n如果有好的demo欢迎发送截图给作者,SOUI2基于MIT协议,SOUI3使用自定义协议,商用收费!\n启程软件"));
}
}
void CMainDlg::OnBtnOpenWrapContent()
{
SHostDialog dlgWrapContent(_T("layout:dlg_wrap_content"));
dlgWrapContent.DoModal(m_hWnd);
}
void CMainDlg::OnTimer(UINT_PTR idEvent)
{
SetMsgHandled(FALSE);
if(idEvent==TIMER_QUIT)
{
SNativeWnd::KillTimer(idEvent);
PostQuitMessage(-3);
}else if(idEvent == TIMER_SOUI3)
{
SWindow *pAniHost = FindChildByName(L"wnd_ani_host");
if (pAniHost && pAniHost->IsVisible(TRUE))
{
const WCHAR * kLoveXml= L"<include src=\"LAYOUT:xml_love\"/>";
SWindow *pLove = pAniHost->CreateChildren(kLoveXml);
if(pLove)
{
pAniHost->UpdateLayout();
IAnimation *pAni = SApplication::getSingletonPtr()->LoadAnimation(_T("anim:love"));
if(pAni)
{
pAni->setStartOffset(rand()%100);//random delay max to 100 ms to play the animation.
pAni->setUserData((ULONG_PTR)pLove);
pAni->setAnimationListener(this);
pLove->SetAnimation(pAni);
pAni->Release();
}
}
}
}
}
void CMainDlg::OnCbxInterpolotorChange(EventArgs *e)
{
EventCBSelChange *e2=sobj_cast<EventCBSelChange>(e);
SComboBox *pCbx = sobj_cast<SComboBox>(e2->sender);
if(e2->nCurSel!=-1)
{
SStringT str = pCbx->GetLBText(e2->nCurSel);
str=str.Mid(1,str.GetLength()-1-strlen("Interpolator"));
IInterpolator * pInterpolator = CREATEINTERPOLATOR(S_CT2W(str));
if(pInterpolator)
{
SInterpolatorView *pView = FindChildByID2<SInterpolatorView>(R.id.view_interpolator);
pView->SetInterpolator(pInterpolator);
pInterpolator->Release();
}
}
}
void CMainDlg::OnEventPath(EventArgs *e)
{
EventPath * e2 = sobj_cast<EventPath>(e);
SStringT strLen = SStringT().Format(_T("%.2f"),e2->fLength);
FindChildByID(R.id.txt_path_length)->SetWindowText(strLen);
}
void CMainDlg::OnInitGroup(EventArgs *e)
{
EventGroupListInitGroup *e2 = sobj_cast<EventGroupListInitGroup>(e);
SToggle *pTgl = e2->pItem->FindChildByID2<SToggle>(R.id.tgl_switch);
pTgl->SetToggle(!e2->pGroupInfo->bCollapsed);
e2->pItem->FindChildByID(R.id.txt_label)->SetWindowText(e2->pGroupInfo->strText);
}
void CMainDlg::OnInitItem(EventArgs *e)
{
EventGroupListInitItem *e2 = sobj_cast<EventGroupListInitItem>(e);
e2->pItem->FindChildByID(R.id.txt_label)->SetWindowText(e2->pItemInfo->strText);
e2->pItem->FindChildByID2<SImageWnd>(R.id.img_indicator)->SetIcon(e2->pItemInfo->iIcon);
}
void CMainDlg::OnGroupStateChanged(EventArgs *e)
{
EventGroupStateChanged *e2 = sobj_cast<EventGroupStateChanged>(e);
SToggle *pTgl = e2->pItem->FindChildByID2<SToggle>(R.id.tgl_switch);
pTgl->SetToggle(!e2->pGroupInfo->bCollapsed);
}
void CMainDlg::OnCtrlPageClick(EventArgs *e)
{
EventGroupListItemCheck *e2=sobj_cast<EventGroupListItemCheck>(e);
STabCtrl *pTabOp = FindChildByID2<STabCtrl>(R.id.tab_ctrls);
int nIndex = e2->pItemInfo->id - R.id.page_mclistview;
pTabOp->SetCurSel(nIndex);
}
void CMainDlg::OnMcLvHeaderRelayout(EventArgs * e)
{
SHeaderCtrl *pHeader = sobj_cast<SHeaderCtrl>(e->sender);
int nItems = pHeader->GetItemCount();
if (nItems > 1)
{
CRect rc = pHeader->GetItemRect(pHeader->GetOriItemIndex(0));
SWindow *pChk = pHeader->FindChildByName(L"chk_mclv_sel");
SASSERT(pChk);
CSize szChk = pChk->GetDesiredSize(-1,-1);
CRect rc2(CPoint(rc.left + 5, rc.top + (rc.Height()-szChk.cy)/2), szChk);
if (rc2.right >= rc.right - 5) rc2.right = rc.right - 5;
pChk->Move(rc2);
}
}
void CMainDlg::OnBtnCreateByTemp()
{
SWindow *pContainer = FindChildByName(L"wnd_temp_host");
SWindow *pInput = FindChildByName(L"re_temp_input");
if(pContainer && pInput)
{
SStringT strInput = pInput->GetWindowText();
pContainer->CreateChildren(S_CT2W(strInput));
}
}
void CMainDlg::On3dViewRotate(EventArgs *e)
{
EventSwndStateChanged *e2 = sobj_cast<EventSwndStateChanged>(e);
if(e2->CheckState(WndState_Check))
{
SWindow *p3dView = FindChildByName("3d_test");
if(p3dView) p3dView->SetAttribute(L"rotateDir",e2->sender->GetName());
}
}
void CMainDlg::OnSetPropItemValue()
{
SPropertyGrid * pPropGrid = FindChildByID2<SPropertyGrid>(R.id.prop_test);
SASSERT(pPropGrid);
SStringW strTarget = S_CT2W(FindChildByID(R.id.prop_target)->GetWindowText());
SStringW strProp = S_CT2W(FindChildByID(R.id.prop_prop)->GetWindowText());
SStringW strValue = S_CT2W(FindChildByID(R.id.prop_value)->GetWindowText());
IPropertyItem *pItem = pPropGrid->FindItemByName(strTarget);
if(pItem)
{
pPropGrid->SetItemAttribute(pItem,strProp,strValue);
}else
{
SMessageBox(m_hWnd,_T("target item not found!"),_T("error"),MB_OK|MB_ICONSTOP);
}
}
void CMainDlg::InitSoui3Animation()
{
SWindow *pWnd = FindChildByName(L"img_soui");
if (pWnd)
{
IAnimation *pAni = SApplication::getSingletonPtr()->LoadAnimation(_T("anim:rotate"));
if(pAni)
{
pWnd->SetAnimation(pAni);
pAni->Release();
}
}
SNativeWnd::SetTimer(TIMER_SOUI3,1000); //start timer.
}
void CMainDlg::onAnimationEnd(IAnimation * animation)
{
if(wcsicmp(animation->GetName(),L"ani_test") == 0)
{
SWindow *pWnd = (SWindow*)animation->getUserData();
pWnd->DestroyWindow();
}
}
void CMainDlg::OnToggleLeft(EventArgs *e)
{
SToggle *pToggle = sobj_cast<SToggle>(e->sender);
SASSERT(pToggle);
SWindow *pWnd = FindChildByName(L"pane_left");
if(!pWnd)
return;
if(pToggle->GetToggle())
{
IAnimation *pAni = SApplication::getSingletonPtr()->LoadAnimation(_T("anim:slide_show"));
if(pAni)
{
pWnd->SetAnimation(pAni);
pAni->Release();
}
}else
{
IAnimation *pAni = SApplication::getSingletonPtr()->LoadAnimation(_T("anim:slide_hide"));
if(pAni)
{
pWnd->SetAnimation(pAni);
pAni->Release();
}
}
}
void CMainDlg::OnSouiClick()
{
IValueAnimator * pAni = SApplication::getSingletonPtr()->LoadValueAnimator(_T("valueAni:colorAni"));
if(pAni)
{
pAni->addListener(this);
pAni->addUpdateListener(this);
pAni->start(this);
}
}
void CMainDlg::OnSetHostAnimation()
{
IAnimation *pAni = SApplication::getSingletonPtr()->LoadAnimation(_T("anim:anihost"));
if (pAni)
{
StartHostAnimation(pAni);
pAni->Release();
}
}
void CMainDlg::onAnimationEnd(IValueAnimator * pAnimator)
{
SWindow *pTst = FindChildByName(L"tree_test");
if(pTst)
{
pTst->SetAttribute(L"colorBkgnd",L"RGBA(255,255,255,0)");//set invalid colorBkgnd
pAnimator->Release();
}
}
void CMainDlg::onAnimationUpdate(IValueAnimator *pAnimator)
{
SWindow *pTst = FindChildByName(L"tree_test");
if(pTst)
{
SColorAnimator *ani = sobj_cast<SColorAnimator>(pAnimator);
if(ani)
{
SStringW strColor;
SColor cr(ani->getValue());
strColor.Format(L"RGBA(%d,%d,%d,%d)",cr.r,cr.g,cr.b,cr.a);
pTst->SetAttribute(L"colorBkgnd",strColor);
}
}
}