一、ResizableLib
http://www.codeproject.com/KB/dialog/resizablelib.aspx
AddAnchor(IDC_STATIC2, TOP_LEFT);
AddAnchor(IDC_EDIT1, TOP_LEFT, ANCHOR(40,100));
AddAnchor(IDC_BUTTON1, BOTTOM_LEFT, ANCHOR(40,100));
AddAnchor(IDC_BUTTON2, BOTTOM_LEFT, ANCHOR(40,100));
AddAnchor(IDC_GROUP1, ANCHOR(40,0), BOTTOM_RIGHT);
AddAnchor(IDC_COMBO1, ANCHOR(40,0), TOP_RIGHT);
AddAnchor(IDC_RADIO1, ANCHOR(70,0), ANCHOR(70,0));
AddAnchor(IDC_RADIO2, ANCHOR(70,0), ANCHOR(70,0));
AddAnchor(IDC_RADIO3, ANCHOR(70,0), ANCHOR(70,0));
AddAnchor(IDC_STATIC1, ANCHOR(40,0), BOTTOM_RIGHT);
AddAnchor(IDC_ICON1, ANCHOR(40,0), ANCHOR(70,0));
尚需依赖界面编辑器!
ANCHOR(40,0)按照原作者的说明前者为x坐标,后为y坐标,均以比例计 (但本人此处猜测应该分别是dx和dy的比例,即拖动父窗体增长的坐标值的比例)
AddAnchor(hwnd/Dialog ID, top-left, bottom-right),第二个参数为控件左上角比例坐标,第三个参数
为控件右下角坐标;注意!当两个参数相等时,使用编辑界面时的值!这种情况很多
DEMO中型如BOTTOM_RIGHT的宏比较容易误导人,应该看作RIGHT_BUTTOM
另外,AddAnchor(::GetDlgItem(GetResizableWnd()->GetSafeHwnd(),IDC_DATAGRID1), , );在针对DataGrid的时候是行不通的,而必须用AddAnchor(GetDlgItem(IDC_DATAGRID1)->m_hWnd , , )
这个方法在与DATAGIRD一起使用的时候容易出现问题,如拖动父窗体时, datagir重绘有问题。
二、《Control Positioning and Sizing using a C++ Helper Class》
http://www.codeproject.com/KB/dialog/layout_helper.aspx
可定义控件相对上下左右的offset
而此处的anchor坐标都是相对左或上
这个可以比例以pixel计,分别以宏表明。
形如
info.Reset();
info.AddOption(CLayoutInfo::OT_LEFT_OFFSET, 0);
info.AddOption(CLayoutInfo::OT_LEFT_ANCHOR, 360);
info.AddOption(CLayoutInfo::OT_TOP_OFFSET, 10);
info.AddOption(CLayoutInfo::OT_RIGHT_OFFSET, 10);
info.AddOption(CLayoutInfo::OT_BOTTOM_OFFSET, 10);
info.AddOption(CLayoutInfo::OT_BOTTOM_ANCHOR, 125);
m_layoutHelper->AddControl(m_layoutOptionsBox, info);
若要使用OT_BOTTOM_ANCHOR,则必须先使用OT_BOTTOM_OFFSET,其它的方向同。
datagrid的重绘无问题,但是似乎DBGrid是两部分组成:外面的框和里面的Grid。所以需要在FornView或者Dialog的Onsize里面专门地写一下DbGrid的MoveWindow,否则就只能看到外面的框自动调整而里面的Grid不调整。
三、另外的一种LayOut
For more powerfull solution see MSDN Magazine July 2001 --- Paul DiLascia: Windows UI: WinMgr
http://msdn.microsoft.com/msdnmag/issues/01/07/winmgr/default.aspx
http://www.codeproject.com/KB/dialog/resizablelib.aspx
AddAnchor(IDC_STATIC2, TOP_LEFT);
AddAnchor(IDC_EDIT1, TOP_LEFT, ANCHOR(40,100));
AddAnchor(IDC_BUTTON1, BOTTOM_LEFT, ANCHOR(40,100));
AddAnchor(IDC_BUTTON2, BOTTOM_LEFT, ANCHOR(40,100));
AddAnchor(IDC_GROUP1, ANCHOR(40,0), BOTTOM_RIGHT);
AddAnchor(IDC_COMBO1, ANCHOR(40,0), TOP_RIGHT);
AddAnchor(IDC_RADIO1, ANCHOR(70,0), ANCHOR(70,0));
AddAnchor(IDC_RADIO2, ANCHOR(70,0), ANCHOR(70,0));
AddAnchor(IDC_RADIO3, ANCHOR(70,0), ANCHOR(70,0));
AddAnchor(IDC_STATIC1, ANCHOR(40,0), BOTTOM_RIGHT);
AddAnchor(IDC_ICON1, ANCHOR(40,0), ANCHOR(70,0));
尚需依赖界面编辑器!
ANCHOR(40,0)按照原作者的说明前者为x坐标,后为y坐标,均以比例计 (但本人此处猜测应该分别是dx和dy的比例,即拖动父窗体增长的坐标值的比例)
AddAnchor(hwnd/Dialog ID, top-left, bottom-right),第二个参数为控件左上角比例坐标,第三个参数
为控件右下角坐标;注意!当两个参数相等时,使用编辑界面时的值!这种情况很多
DEMO中型如BOTTOM_RIGHT的宏比较容易误导人,应该看作RIGHT_BUTTOM
另外,AddAnchor(::GetDlgItem(GetResizableWnd()->GetSafeHwnd(),IDC_DATAGRID1), , );在针对DataGrid的时候是行不通的,而必须用AddAnchor(GetDlgItem(IDC_DATAGRID1)->m_hWnd , , )
这个方法在与DATAGIRD一起使用的时候容易出现问题,如拖动父窗体时, datagir重绘有问题。
二、《Control Positioning and Sizing using a C++ Helper Class》
http://www.codeproject.com/KB/dialog/layout_helper.aspx
可定义控件相对上下左右的offset
而此处的anchor坐标都是相对左或上
这个可以比例以pixel计,分别以宏表明。
形如
info.Reset();
info.AddOption(CLayoutInfo::OT_LEFT_OFFSET, 0);
info.AddOption(CLayoutInfo::OT_LEFT_ANCHOR, 360);
info.AddOption(CLayoutInfo::OT_TOP_OFFSET, 10);
info.AddOption(CLayoutInfo::OT_RIGHT_OFFSET, 10);
info.AddOption(CLayoutInfo::OT_BOTTOM_OFFSET, 10);
info.AddOption(CLayoutInfo::OT_BOTTOM_ANCHOR, 125);
m_layoutHelper->AddControl(m_layoutOptionsBox, info);
若要使用OT_BOTTOM_ANCHOR,则必须先使用OT_BOTTOM_OFFSET,其它的方向同。
datagrid的重绘无问题,但是似乎DBGrid是两部分组成:外面的框和里面的Grid。所以需要在FornView或者Dialog的Onsize里面专门地写一下DbGrid的MoveWindow,否则就只能看到外面的框自动调整而里面的Grid不调整。
三、另外的一种LayOut
For more powerfull solution see MSDN Magazine July 2001 --- Paul DiLascia: Windows UI: WinMgr
http://msdn.microsoft.com/msdnmag/issues/01/07/winmgr/default.aspx