duilib窗口在屏幕边缘自动收缩效果

使用duilib界面库编写的一个对话框移入移出效果的Demo类。
下面的.cpp文件

#include "stdafx.h"
#include "DuiMainControl.h"

#define e_window_move 0
CDuiMainControl::CDuiMainControl()
{
}


CDuiMainControl::~CDuiMainControl()
{
}


CDuiString CDuiMainControl::GetSkinFolder()
{
	return _T("skin");
}

CDuiString CDuiMainControl::GetSkinFile()
{
	return _T("ControlFrame.xml");
}

LPCTSTR CDuiMainControl::GetWindowClassName(void)const
{
	return _T("DuiMainFrame");
}

LRESULT CDuiMainControl::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	PostQuitMessage(0);
	return 0;
}

bool CDuiMainControl::InitData()
{
	return true;
}

void CDuiMainControl::InitWindow()
{	
	SetTimer(this->m_hWnd, e_window_move, 400, NULL);
	return;
}

LRESULT CDuiMainControl::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	switch (uMsg)
	{
		case WM_TIMER:
		{
			if (e_window_move == wParam)
			{	
				if (JudgeCursorOut())
				{
					AutoHiddenWindow(6);
				}
				else
				{
					AutoShowWindow();
				}
			}
			break;
		default:
			break;
	}
	return 0;
}

void CDuiMainControl::Notify(TNotifyUI& msg)
{
	if (msg.sType == _T("click"))
	{
		CDuiString   strName = msg.pSender->GetName();
		if (strName == "closebtn")
		{
			PostQuitMessage(0);
			return;
		}
		else if (strName == "minbtn")
		{
			SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
			return;
		}
	}
}

void CDuiMainControl::AutoHiddenWindow(int iNum)
{
	//获取屏幕大小
	m_iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	m_iScreenHeight = GetSystemMetrics(SM_CYSCREEN);

	//RECT m_rtWindow;
	GetWindowRect(this->m_hWnd, &m_rtWindow);
	m_iWindowWidth = m_rtWindow.right - m_rtWindow.left;
	m_iWindowHeight = m_rtWindow.bottom - m_rtWindow.top;

	//left
	while (m_rtWindow.right >= iNum && m_rtWindow.left <= 0 && m_rtWindow.top > 0)
	{
		// 获取窗口范围
		GetWindowRect(this->m_hWnd, &m_rtWindow);
		// 移动窗口
		MoveWindow(this->m_hWnd, m_rtWindow.left - 2, m_rtWindow.top, m_iWindowWidth, m_iWindowHeight, FALSE);
	}

	//top
	while (m_rtWindow.top <= 0 && m_rtWindow.bottom >= iNum)
	{
		// 获取窗口范围
		GetWindowRect(this->m_hWnd, &m_rtWindow);
		// 移动窗口
		MoveWindow(this->m_hWnd, m_rtWindow.left, m_rtWindow.top - 2, m_iWindowWidth, m_iWindowHeight, FALSE);
	}

	//right
	while (m_rtWindow.right >= m_iScreenWidth && m_rtWindow.left <= m_iScreenWidth - iNum && m_rtWindow.top > 0)
	{
		// 获取窗口范围
		GetWindowRect(this->m_hWnd, &m_rtWindow);
		// 移动窗口
		MoveWindow(this->m_hWnd, m_rtWindow.left + 2, m_rtWindow.top, m_iWindowWidth, m_iWindowHeight, FALSE);
	}
}

void CDuiMainControl::AutoShowWindow()
{
	// 获取屏幕大小
	m_iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	m_iScreenHeight = GetSystemMetrics(SM_CYSCREEN);

	RECT m_rtWindow;
	GetWindowRect(this->m_hWnd, &m_rtWindow);
	m_iWindowWidth = m_rtWindow.right - m_rtWindow.left;
	m_iWindowHeight = m_rtWindow.bottom - m_rtWindow.top;

	// 向右弹出
	while (m_rtWindow.left < 0)
	{
		// 移动窗口
		MoveWindow(this->m_hWnd, m_rtWindow.left + 2, m_rtWindow.top, m_iWindowWidth, m_iWindowHeight, FALSE);
		// 获取窗口范围
		GetWindowRect(this->m_hWnd, &m_rtWindow);
	}

	// 向下收弹出
	while (m_rtWindow.top < 0)
	{
		// 移动窗口
		MoveWindow(this->m_hWnd, m_rtWindow.left, m_rtWindow.top + 2, m_iWindowWidth, m_iWindowHeight, FALSE);
		// 获取窗口范围
		GetWindowRect(this->m_hWnd, &m_rtWindow);
	}

	// 向左弹出
	while (m_rtWindow.right > m_iScreenWidth)
	{
		// 移动窗口
		MoveWindow(this->m_hWnd, m_rtWindow.left - 2, m_rtWindow.top, m_iWindowWidth, m_iWindowHeight, FALSE);
		// 获取窗口范围
		GetWindowRect(this->m_hWnd, &m_rtWindow);
	}
}

bool CDuiMainControl::JudgeCursorOut()
{
	// 获取鼠标位置
	POINT point;
	GetCursorPos(&point);

	// 获取窗口范围
	RECT m_rtWindow;
	GetWindowRect(this->m_hWnd, &m_rtWindow);

	// 判断
	if (point.x >= m_rtWindow.left && point.x <= m_rtWindow.right && point.y >= m_rtWindow.top && point.y <= m_rtWindow.bottom)
	{
		return false;  // 鼠标还在窗口内
	}
	else
	{
		return true;   // 鼠标离开窗口
	}
}

头文件.h

#pragma once

class CDuiMainControl :
	public WindowImplBase
{
public:
	CDuiMainControl();
	~CDuiMainControl();

protected:
	virtual CDuiString GetSkinFolder();
	virtual CDuiString GetSkinFile();
	virtual LPCTSTR GetWindowClassName(void)const;
	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	virtual void InitWindow();
	virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	virtual void Notify(TNotifyUI& msg);
private:
	bool InitData();

	//隐藏窗口 iNum:隐藏后露出的那一小截的宽度(px)
	void AutoHiddenWindow(int iNum);

	//显示窗口
	void AutoShowWindow();

	//判断鼠标是否在该窗口上
	bool JudgeCursorOut();
	
private:
	int			m_iScreenWidth;
	int			m_iScreenHeight;
	RECT		m_rtWindow;
	int			m_iWindowWidth;
	int			m_iWindowHeight;
};


因公司做项目需要写出类似QQ的这种效果,借鉴别人的代码稍微封装了下,如有侵权请告知!感谢网上的各位大神指点!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值