如何在程序中动态改变Edit Box的大小啊? 程序是这样的,比如MFC SDI程序名是Abc,有一个对应CAbcView类的对话框,该对话框上只有两个Edit Box窗口用于显示数据。现在想这样:当程序运行后,拉动程序主界面边框右下角或者拉动边框改变程序边框大小的时候那两个Edit Box也跟着改变,当然是跟着程序主界面的大小成比例的改变。各位高手们有什么办法吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CRect rect;//TODO:在适当的地方设置你的rectGetDlgItem(ID_EDIT)->MoveWindow(rect); 注意要在CView的OnSize函数里面改变 http://www.codeproject.com/dialog/easysize.asp 如果那两个editbox 是 cedit 成员 的化,可以用setwindowpos 我在CView的Onsize函数中这样写:CRect rect;this->GetWindowRect(rect);GetDlgItem(IDC_EDIT1)->MoveWindow(rect.left+200,rect.top+100,300,300);程序一执行就报内存错,rect.left和rect.top的值没问题,总觉得是GetDlgItem(IDC_EDIT1)这个有问题,有谁知道啊? 我觉得有几个可能存在的问题:1、GetWindowRect的参数写错了,应该是this->GetWindowRect(&rect);另外建议使用RECT结构而不要使用CRect类(如果你不需要对rect进行很复杂的操作的话);2、按照你的写法,(this->GetWindowRect(rect))取到的是整个窗口对于屏幕的坐标值,而下一句(GetDlgItem(IDC_EDIT1)->MoveWindow(rect.left+200,rect.top+100,300,300);)中的MoveWindow移动的控件位置是以应用程序客户区左上角为(0,0)的偏移值,应该在Move之前用函数ScreenToClient(&rect)把坐标转换一下; zry000:你说的要写成 this->GetWindowRect(&rect);是对于RECT结构,如果用CRect类就直接写rect就行。第二个问题,我即使直接写成 GetDlgItem(IDC_EDIT1)->MoveWindow(200,100,300,300); 也还是不行 呵呵,刚才没注意,不过也获益匪浅。叹息之墙老兄,你好像忽略了控件构造顺序,OnSize在视图第一次显示就要调用一次,而这时调用的时候,EDIT控件尚未构造(诞生?!),所以MoveWindow没有对象可以移动,我猜想,错误警报应该是由一个ASSERT引发的,应该是在判断对象是否存在的时候。 建议你把这几句写到WM_SHOWWINDOW的响应函数里再试试看 zry000,你说得对极了,我这样写OnSize函数:void CAbcView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); // TODO: Add your message handler code here m_edit.MoveWindow(50,50,cx-100,cy-100); }m_edit就是那个EditBox的CEdit类型的变量;如果执行的话,会连续出现六七个ASSERT引发的错误警报,如果把这些警报都忽略的话程序倒是可以运行,也能达到EditBox随程序边框变化的效果;现在问题就在这里,就像你说的,OnSize在视图第一次显示就要调用一次,而这时调用的时候,EDIT控件尚未构造,所以引发错误。但是我现在就不知道如何改,写到SHOWWINDOW似乎不行,刚才试了,也会出一次错误警报,而且忽略后程序运行起来也达不到效果,因为showwindow不能发出重画的消息;还有没有什么办法啊? 折腾了一晚,总算搞定,应该在OnCreate函数里创建出来m_edit;在View的OnCreate函数里加了这么一句:m_edit.Create(WS_VSCROLL | ES_LEFT | ES_MULTILINE | WS_VISIBLE | WS_TABSTOP | WS_THICKFRAME,CRect(10,10,80,80),this,IDC_EDIT1);现在又有个很奇怪的问题,这样创建出来的EditBox和用资源管理器创建出来的有点区别,在资源管理器上画出来的EditBox如果选中Styles的Border属性后看上去是凹进去的一块,但是在这里如果写上WS_BORDER属性就变成了一个黑色的边框;现在用的这个WS_THICKFRAME倒是也能加个边框,但是看上去是凸出来的一块,我试了各种能用的跟边框有关的属性都不行,谁知道这个怎么解决? 动态改变子控件的布局通常是在映射父窗口的WM_SIZE消息,在OnSize函数里面逐个按比例对控件进行SetWindowRect或者SetWindowPos 这个3DLOOK是个What东东啊?没有听说过 http://www.codeproject.com有关于Resize的话题。有些是封住好的类。你可以直接用。这样很方便的。也可以去看看我收集的:关于Resize的话题http://www.xiaozhou.net/cooldog/blogview.asp?logID=108 为什么我在创建splitter窗口时,总会断言失败 如何设置工具栏按钮的的位图 如何在窗口中确定Messagebox()显示的位置。 关于图像处理的前进方向-求同行给予指导 CString转变为10进制的问题 <-调用基类有讲究吗? 【讨论】请帮我解释一下虚函数的意义 哪里能接到用VC开发的软件兼职 高分请教:关于《WINDOWS网络编程 第二版》上的一些疑问 如何做安装程序 关于C语言中转义字符的疑惑! 帮我看看这样格式的是什么意思啊?O_byFirst =(BYTE)(((DWORD) I_dwValue & 0xFF000000) >> 24);
CRect rect;
this->GetWindowRect(rect);
GetDlgItem(IDC_EDIT1)->MoveWindow(rect.left+200,rect.top+100,300,300);
程序一执行就报内存错,rect.left和rect.top的值没问题,总觉得是GetDlgItem(IDC_EDIT1)这个有问题,有谁知道啊?
1、GetWindowRect的参数写错了,应该是this->GetWindowRect(&rect);
另外建议使用RECT结构而不要使用CRect类(如果你不需要对rect进行很复杂的操作的话);2、按照你的写法,(this->GetWindowRect(rect))取到的是整个窗口对于屏幕的坐标值,而下一句(GetDlgItem(IDC_EDIT1)->MoveWindow(rect.left+200,rect.top+100,300,300);)中的MoveWindow移动的控件位置是以应用程序客户区左上角为(0,0)的偏移值,应该在Move之前用函数ScreenToClient(&rect)把坐标转换一下;
void CAbcView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here m_edit.MoveWindow(50,50,cx-100,cy-100);
}m_edit就是那个EditBox的CEdit类型的变量;如果执行的话,会连续出现六七个ASSERT引发的错误警报,如果把这些警报都忽略的话程序倒是可以运行,也能达到EditBox随程序边框变化的效果;现在问题就在这里,就像你说的,OnSize在视图第一次显示就要调用一次,而这时调用的时候,EDIT控件尚未构造,所以引发错误。但是我现在就不知道如何改,写到SHOWWINDOW似乎不行,刚才试了,也会出一次错误警报,而且忽略后程序运行起来也达不到效果,因为showwindow不能发出重画的消息;还有没有什么办法啊?
m_edit.Create(WS_VSCROLL | ES_LEFT | ES_MULTILINE | WS_VISIBLE | WS_TABSTOP | WS_THICKFRAME,CRect(10,10,80,80),this,IDC_EDIT1);
现在又有个很奇怪的问题,这样创建出来的EditBox和用资源管理器创建出来的有点区别,在资源管理器上画出来的EditBox如果选中Styles的Border属性后看上去是凹进去的一块,但是在这里如果写上WS_BORDER属性就变成了一个黑色的边框;现在用的这个WS_THICKFRAME倒是也能加个边框,但是看上去是凸出来的一块,我试了各种能用的跟边框有关的属性都不行,谁知道这个怎么解决?