使用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的这种效果,借鉴别人的代码稍微封装了下,如有侵权请告知!感谢网上的各位大神指点!