📄 dlgitemresizer.cpp
字号:
////////////////////////////////////////////////////////////////////////
// DlgItemResizer.cpp : implementation file
//
// Written by Magnus Egelberg (magnus.egelberg@lundalogik.se)
// Much of this code comes from Eli Vingot (elivingt@internet-zahav.net)
//
//
#include "stdafx.h"
#include "DlgItemResizer.h"
CDlgItemResizer::CDlgItemResizer()
{
m_szInitial = CSize(0,0);
}
CDlgItemResizer::~CDlgItemResizer()
{
// Make sure to delete all allocated items
for (INT i = 0; i < m_vecControls.size(); i++)
{
delete m_vecControls[i];
}
}
void CDlgItemResizer::Add(HWND hWnd, UINT uFlags)
{
HWND hParent = GetParent(hWnd);
if (uFlags == 0)
return;
CRect rc;
GetWindowRect(hWnd, &rc);
ScreenToClient(hParent, &rc);
DLGITEMINFO *item = new DLGITEMINFO;
item->m_uFlags = uFlags;
item->m_hWnd = hWnd;
item->m_rectPosition = rc;
// Set inital size if not set
if (m_szInitial.cx == 0 || m_szInitial.cy == 0)
{
CRect rc;
GetClientRect(hParent, &rc);
m_szInitial = rc.Size();
}
// Add it to the array
m_vecControls.push_back(item);
}
void CDlgItemResizer::Resize(HWND hWnd)
{
// Just return if no initial size yet
if (m_szInitial.cx == 0 || m_szInitial.cy == 0)
return;
// Don't bother to resize minimized windows
if (GetWindowLong(hWnd, GWL_STYLE) & WS_MINIMIZE)
return;
CRect client;
GetClientRect(hWnd, &client);
for (INT i = 0; i < m_vecControls.size(); i++)
{
DLGITEMINFO *item = (DLGITEMINFO *)m_vecControls[i];
// Invalidate the old position
CRect rect;
GetWindowRect(item->m_hWnd, &rect);
ScreenToClient(hWnd, &rect);
InvalidateRect(hWnd, &rect, TRUE);
// Get the current size of the control
CSize size = rect.Size();
// Set the new position according to the flags specified
if ((item->m_uFlags & (RESIZE_LOCKLEFT|RESIZE_LOCKRIGHT)) ==
(RESIZE_LOCKLEFT|RESIZE_LOCKRIGHT))
{
rect.left = item->m_rectPosition.left;
rect.right = client.right -
(m_szInitial.cx - item->m_rectPosition.right);
}
else if (item->m_uFlags & RESIZE_LOCKRIGHT)
{
rect.right = client.right -
(m_szInitial.cx - item->m_rectPosition.right);
rect.left = rect.right - size.cx;
}
else if (item->m_uFlags & RESIZE_LOCKLEFT)
{
rect.left = item->m_rectPosition.left;
rect.right = rect.left + size.cx;
}
if ((item->m_uFlags & (RESIZE_LOCKTOP|RESIZE_LOCKBOTTOM)) ==
(RESIZE_LOCKTOP|RESIZE_LOCKBOTTOM))
{
rect.top = item->m_rectPosition.top;
rect.bottom = client.bottom -
(m_szInitial.cy - item->m_rectPosition.bottom);
}
else if (item->m_uFlags & RESIZE_LOCKTOP)
{
rect.top = item->m_rectPosition.top;
rect.bottom = rect.top + size.cy;
}
else if (item->m_uFlags & RESIZE_LOCKBOTTOM)
{
rect.bottom = client.bottom -
(m_szInitial.cy - item->m_rectPosition.bottom);
rect.top = rect.bottom - size.cy;
}
// Check if control is completely inside client, hide if not
// Do this only when the RESIZE_SHOWHIDE flag is set.
if (item->m_uFlags & RESIZE_SHOWHIDE)
{
CRect unionrect;
unionrect.UnionRect(rect, client);
if (unionrect != client)
{
ShowWindow(item->m_hWnd, SW_HIDE);
}
else
{
// Make sure it is visible
if (!IsWindowVisible(item->m_hWnd))
{
ShowWindow(item->m_hWnd, SW_SHOWNORMAL);
}
MoveWindow(item->m_hWnd, rect.left, rect.top,
rect.Width(), rect.Height(), TRUE);
}
}
else
{
MoveWindow(item->m_hWnd, rect.left, rect.top,
rect.Width(), rect.Height(), TRUE);
}
}
}
void CDlgItemResizer::ScreenToClient(HWND hWnd, CRect* pRect)
{
CPoint point;
point.x = pRect->left;
point.y = pRect->top;
::ScreenToClient(hWnd, &point);
pRect->left = point.x;
pRect->top = point.y;
point.x = pRect->right;
point.y = pRect->bottom;
::ScreenToClient(hWnd, &point);
pRect->right = point.x;
pRect->bottom = point.y;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -