记录类似窗口自动移动,补齐前面的位置demo

应用场景:

类似多个标签窗口并列,一个窗口被移动到另外一个地方去了,后面的则往前补齐的功能

效果:

示例图

实现的点,主要有两个

1.使用线性布局:layout="hbox"

2.改变窗口的size属性,设置为0,0

xml的布局

<SOUI name="mainWindow" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" width="620" height="400" margin="5,5,5,5" resizable="1" wndType="appMain" appWnd="1" translucent="1">
	<root skin="_skin.sys.wnd.bkgnd" cache="1">
		<caption pos="0,0,-0,30" show="1" font="adding:0">
			<icon pos="10,8" src="ICON_LOGO:16" />
			<text pos="29,9">@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 pos="5,[2,-5,-5">
			<window pos="0,0,-0,100" layout="hbox">
				<button pos="0,0" size="100,100" colorText="#000000" skin="_skin.sys.btn.normal">按钮A</button>
				<button size="100,100" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_b">按钮B</button>
				<button size="100,100" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_c">按钮C</button>
				<button size="100,100" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_d">按钮D</button>
				<button size="100,100" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_e">按钮E</button>
				<button size="100,100" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_f">按钮F</button>
			</window>
			<button pos="48,168" size="96,32" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_bbb">按钮</button>
			<button pos="[,{,@96,@32" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_ccc">按钮C</button>
			<button pos="[,{,@96,@32" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_ddd">按钮D</button>
			<button pos="[,{,@96,@32" colorText="#000000" skin="_skin.sys.btn.normal" name="btn_eee">按钮E</button>
		</window>
	</root>
</SOUI>

代码:

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 OnSize(UINT nType, CSize size);
	int OnCreate(LPCREATESTRUCT lpCreateStruct);
	BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam);

protected:
	void OnShowandHideB();
	void OnShowandHideC();
	void OnShowandHideD();
	void OnShowandHideE();

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"btn_bbb", OnShowandHideB)
		EVENT_NAME_COMMAND(L"btn_ccc", OnShowandHideC)
		EVENT_NAME_COMMAND(L"btn_ddd", OnShowandHideD)
		EVENT_NAME_COMMAND(L"btn_eee", OnShowandHideE)
	EVENT_MAP_END()
		
	//HostWnd真实窗口消息处理
	BEGIN_MSG_MAP_EX(CMainDlg)
		MSG_WM_CREATE(OnCreate)
		MSG_WM_INITDIALOG(OnInitDialog)
		MSG_WM_CLOSE(OnClose)
		MSG_WM_SIZE(OnSize)
		CHAIN_MSG_MAP(SHostWnd)
		REFLECT_NOTIFICATIONS_EX()
	END_MSG_MAP()
private:
	BOOL			m_bLayoutInited;	
	bool	m_bFlag;
	bool	m_bFlag1;
	bool	m_bFlag2;
	bool	m_bFlag3;
	SWindow* m_pWnd;
	SWindow* m_pWnd1;
	SWindow* m_pWnd2;
	SWindow* m_pWnd3;
};

MainDlg.cpp

// MainDlg.cpp : implementation of the CMainDlg class
//
/

#include "stdafx.h"
#include "MainDlg.h"	
	
CMainDlg::CMainDlg() : SHostWnd(_T("LAYOUT:XML_MAINWND"))
{
	m_bLayoutInited = FALSE;
	m_bFlag = false;
	m_bFlag1 = false;
	m_bFlag2 = false;
	m_bFlag3 = false;
}

CMainDlg::~CMainDlg()
{
}

int CMainDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	SetMsgHandled(FALSE);
	return 0;
}

BOOL CMainDlg::OnInitDialog(HWND hWnd, LPARAM lParam)
{
	m_bLayoutInited = TRUE;
	m_pWnd = FindChildByName(L"btn_b");
	assert(m_pWnd);
	m_pWnd1 = FindChildByName(L"btn_c");
	assert(m_pWnd1);
	m_pWnd2 = FindChildByName(L"btn_d");
	assert(m_pWnd2);
	m_pWnd3 = FindChildByName(L"btn_e");
	assert(m_pWnd3);
	return 0;
}

void CMainDlg::OnShowandHideB()
{

	if (!m_bFlag)
	{
		m_pWnd->SetAttribute(L"size", L"0,0");
		m_bFlag = true;
	}
	else
	{
		m_pWnd->SetAttribute(L"size", L"100,100");
		m_bFlag = false;
	}

}

void CMainDlg::OnShowandHideC()
{
	if (!m_bFlag1)
	{
		m_pWnd1->SetAttribute(L"size", L"0,0");
		m_bFlag1 = true;
	}
	else
	{
		m_pWnd1->SetAttribute(L"size", L"100,100");
		m_bFlag1 = false;
	}
}

void CMainDlg::OnShowandHideD()
{
	if (!m_bFlag2)
	{
		m_pWnd2->SetAttribute(L"size", L"0,0");
		m_bFlag2 = true;
	}
	else
	{
		m_pWnd2->SetAttribute(L"size", L"100,100");
		m_bFlag2 = false;
	}
}

void CMainDlg::OnShowandHideE()
{
	if (!m_bFlag3)
	{
		m_pWnd3->SetAttribute(L"size", L"0,0");
		m_bFlag3 = true;
	}
	else
	{
		m_pWnd3->SetAttribute(L"size", L"100,100");
		m_bFlag3 = false;
	}
}

//TODO:消息映射
void CMainDlg::OnClose()
{
	CSimpleWnd::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::OnSize(UINT nType, CSize size)
{
	SetMsgHandled(FALSE);
	if (!m_bLayoutInited) return;
	
	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);
	}
}

上面是简单的实现方式

猜你喜欢

转载自blog.csdn.net/Wuzm_/article/details/107494733