社区
界面
帖子详情
MFC中当改变对话框大小时怎么让控件自动调整大小
「已注销」
2010-04-21 05:57:39
MFC中当改变对话框大小时怎么让控件自动调整大小?让控件随对话框的改变而调整大小
有代码的可以发给我,我邮箱是3624240213@163.com
...全文
527
6
打赏
收藏
MFC中当改变对话框大小时怎么让控件自动调整大小
MFC中当改变对话框大小时怎么让控件自动调整大小?让控件随对话框的改变而调整大小 有代码的可以发给我,我邮箱是3624240213@163.com
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
「已注销」
2012-06-11
打赏
举报
回复
呵呵 这么老的帖子还有人回啊
CyckSDN
2012-06-09
打赏
举报
回复
晕了 完全陌生了
尹成
2010-04-21
打赏
举报
回复
响应WM_SIZE消息,然后MoveWindow等调整各个控件成比例
class CWndAutoPos
{
struct ITEM_DATA
{
CRect Rect;
int nID;
int nPersentX;
int nPersentY;
int nPersentWidth;
int nPersentHeigh;
BOOL bReDraw;
};
public:
CWndAutoPos();
~CWndAutoPos();
BOOL Clear();
BOOL AddItem(int nID, BOOL bReDraw = FALSE, int nPersentX = 0, int nPersentY = 0, int nPersentWidth = 0, int nPersentHeigh = 0);
BOOL InitOrgSize(CWnd *pParent);
BOOL InflateItemRect(int nID, CRect &IftRect, BOOL bRePaint = TRUE);
BOOL DeflateItemRect(int nID, CRect &DftRect, BOOL bRePaint = TRUE);
BOOL FindItem(int nID, ITEM_DATA **ppItemData);
virtual void OnParentSize(int nWidth, int nHeigh, BOOL bRepaint = FALSE);
//
CWnd * m_pParent;
int m_nWidth;
int m_nHeigh;
CList<ITEM_DATA> m_ItemList;
};
////////////////////////////////////////////////////////////////////////////////
// CwndAutoPos
BOOL NMfc::GetDlgBkRgn(CWnd *pWnd, CRgn *pBkRgn)
{
CWnd * pChildWnd;
DWORD dwStyle;
CRect MainRect;
CRect OneRect;
CRgn MainRgn;
CRgn AllRgn;
CRgn OneRgn;
pWnd->GetWindowRect(MainRect);
pWnd->ScreenToClient(MainRect);
MainRgn.CreateRectRgnIndirect(MainRect);
AllRgn.CreateRectRgn(0, 0, 0, 0);
for(pChildWnd = pWnd->GetTopWindow();
pChildWnd;
pChildWnd = pChildWnd->GetNextWindow(GW_HWNDNEXT))
{
dwStyle = pChildWnd->GetStyle();
if((dwStyle & WS_VISIBLE) == 0)
continue;
pChildWnd->GetWindowRect(OneRect);
pWnd->ScreenToClient(OneRect);
OneRgn.CreateRectRgnIndirect(OneRect);
AllRgn.CombineRgn(&AllRgn, &OneRgn, RGN_OR);
OneRgn.DeleteObject();
}
pBkRgn->CreateRectRgn(0, 0, 0, 0);
pBkRgn->CombineRgn(&MainRgn, &AllRgn, RGN_XOR);
MainRgn.DeleteObject();
AllRgn.DeleteObject();
return TRUE;
}
CWndAutoPos::CWndAutoPos()
{
m_nWidth = 0;
m_nHeigh = 0;
m_pParent = NULL;
}
CWndAutoPos::~CWndAutoPos()
{
}
BOOL CWndAutoPos::Clear()
{
return FALSE;
}
BOOL CWndAutoPos::AddItem(int nID, BOOL bReDraw, int nPersentX, int nPersentY, int nPersentWidth, int nPersentHeigh)
{
ITEM_DATA OneItem;
CWnd * pItem;
CRect WindowRect;
pItem = m_pParent->GetDlgItem(nID);
pItem->GetWindowRect(WindowRect);
m_pParent->ScreenToClient(WindowRect);
OneItem.Rect = WindowRect;
OneItem.nID = nID;
OneItem.nPersentX = nPersentX;
OneItem.nPersentY = nPersentY;
OneItem.nPersentWidth = nPersentWidth;
OneItem.nPersentHeigh = nPersentHeigh;
OneItem.bReDraw = bReDraw;
m_ItemList.AddTail(OneItem);
return TRUE;
}
BOOL CWndAutoPos::InitOrgSize(CWnd *pParent)
{
CRect CltRect;
m_pParent = pParent;
pParent->GetClientRect(CltRect);
m_nWidth = CltRect.Width();
m_nHeigh = CltRect.Height();
return TRUE;
}
BOOL CWndAutoPos::FindItem(int nID, ITEM_DATA **ppItemData)
{
POSITION pos;
ITEM_DATA * pItem;
int nCount;
*ppItemData = NULL;
nCount = (int)m_ItemList.GetSize();
if(nCount == 0)
return FALSE;
for(pos = m_ItemList.GetHeadPosition();
pos;
)
{
pItem = &(m_ItemList.GetNext(pos));
if(pItem->nID == nID)
{
*ppItemData = pItem;
return TRUE;
}
}
return FALSE;
}
BOOL CWndAutoPos::InflateItemRect(int nID, CRect &IftRect, BOOL bRePaint)
{
CWnd * pItemWnd;
ITEM_DATA * pItemData;
CRect ItemRect;
pItemWnd = m_pParent->GetDlgItem(nID);
FindItem(nID, &pItemData);
if(pItemData == NULL)
return FALSE;
pItemWnd->GetWindowRect(ItemRect);
m_pParent->ScreenToClient(ItemRect);
ItemRect.InflateRect(IftRect);
pItemWnd->MoveWindow(ItemRect, bRePaint);
pItemData->Rect.InflateRect(IftRect);
return TRUE;
}
BOOL CWndAutoPos::DeflateItemRect(int nID, CRect &DftRect, BOOL bRePaint)
{
CWnd * pItemWnd;
ITEM_DATA * pItemData;
CRect ItemRect;
pItemWnd = m_pParent->GetDlgItem(nID);
FindItem(nID, &pItemData);
if(pItemData == NULL)
return FALSE;
pItemWnd->GetWindowRect(ItemRect);
m_pParent->ScreenToClient(ItemRect);
ItemRect.DeflateRect(DftRect);
pItemWnd->MoveWindow(ItemRect, bRePaint);
pItemData->Rect.DeflateRect(DftRect);
return TRUE;
}
void CWndAutoPos::OnParentSize(int nWidth, int nHeigh, BOOL bRepaint)
{
POSITION pos;
ITEM_DATA * pItem;
CRect FinRect;
int x, y;
int w, h;
CWnd * pItemWnd;
int nCount;
HDWP hWinPosInfo;
CRgn BkRgn;
nCount = (int)m_ItemList.GetSize();
if(nCount == 0)
return;
// m_pParent->RedrawWindow();
hWinPosInfo = BeginDeferWindowPos(nCount);
for(pos = m_ItemList.GetHeadPosition();
pos;
)
{
pItem = &(m_ItemList.GetNext(pos));
pItemWnd = m_pParent->GetDlgItem(pItem->nID);
FinRect = pItem->Rect;
x = pItem->Rect.left;
y = pItem->Rect.top;
w = pItem->Rect.Width();
h = pItem->Rect.Height();
x += (nWidth - m_nWidth) * pItem->nPersentX / 100;
y += (nHeigh - m_nHeigh) * pItem->nPersentY / 100;
w += (nWidth - m_nWidth) * pItem->nPersentWidth / 100;
h += (nHeigh - m_nHeigh) * pItem->nPersentHeigh / 100;
if(bRepaint || pItem->bReDraw)
DeferWindowPos(hWinPosInfo, pItemWnd->GetSafeHwnd(), HWND_TOP, x, y, w, h, SWP_NOZORDER);
else
DeferWindowPos(hWinPosInfo, pItemWnd->GetSafeHwnd(), HWND_TOP, x, y, w, h, SWP_NOZORDER | SWP_NOREDRAW);
}
EndDeferWindowPos(hWinPosInfo);
NMfc::GetDlgBkRgn(m_pParent, &BkRgn);
m_pParent->InvalidateRgn(&BkRgn, TRUE);
return;
}
// CWndAutoPos
////////////////////////////////////////////////////////////////////////////////
用法: (如 CTinyIeDlg )
1. 初始化
BOOL CTinyIeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
…
m_AutoPos.InitOrgSize(this);
m_AutoPos.AddItem(IDC_COMBOBOXEX1, TRUE, 0, 0, 100, 0);
m_AutoPos.AddItem(IDOK, TRUE, 100, 0, 0, 0);
…
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
2. OnSize
void CTinyIeDlg::OnSize(UINT nType, int cx, int cy)
{
m_AutoPos.OnParentSize(cx, cy);
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
「已注销」
2010-04-21
打赏
举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
响应WM_SIZE消息,然后MoveWindow等调整各个控件成比例
[/Quote]
能给点具体代码么?
ActiveFrank
2010-04-21
打赏
举报
回复
OnSize函数里面 MoveWindows
oyljerry
2010-04-21
打赏
举报
回复
响应WM_SIZE消息,然后MoveWindow等调整各个控件成比例
MFC
中子
对话框
的
大小
随tab
控件
的
大小
改变
而
改变
MFC
中,包含多个
对话框
,子
对话框
在Tab
控件
中显示,让子
对话框
中的
控件
跟随主
对话框
大小
变化而变化,字体也能够缩放,但是不能加载图片
控件
,只对
控件
和字体缩放,单个
对话框
也适用,简单易懂。主要有一个CLout类,这个demo中包含三个子
对话框
,都能够缩放。也可以用于Tab
控件
的学习使用。
VC动态
改变
对话框
大小
,其中
控件
也跟着
改变
VC动态
改变
对话框
大小
,其中
控件
也跟着
改变
,很实用的。。。
MFC
快速入门
Classes,简称
MFC
)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量,这是一套
mfc
快速入门的课程,主要对
MFC
各个
控件
的...
对话框
上的
控件
随
对话框
大小
的
改变
而
改变
对话框
上的
控件
随
对话框
大小
的
改变
而
改变
。
mfc
,vc6.0
对话框
中的
控件
随窗口
大小
改变
而
改变
适应电脑分辨率
看到很多软件在电脑运行的时候,一修改分辨率软件中的
控件
就很不协调,于是写了这个小程序。 最终,窗口包含一个DIALOG,里面添加了几个
控件
,随着分辨率或者窗口高和宽等比例变化时候会
自动
调整
大小
。 有相关的文档说明。
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章