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

应用场景:

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

效果:

记录类似窗口自动移动,补齐前面的位置demo_第1张图片

实现的点,主要有两个

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

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

xml的布局


	
		
			
			@string/title
			
			
			
			
		
		
			
				
				
				
				
				
				
			
			
			
			
			
		
	

代码:

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);
	}
}

上面是简单的实现方式

你可能感兴趣的:(SOUI自学笔记,window,C++)