如何建立一个容纳很多内容的对话框? 我想在资源管理器中建立一个对话框,对话框的内容包括一张表,表很长,有一百项左右(每个表项是一个编辑框,有没有更好的办法?)。这样一页肯定容纳不下,需要加上垂直滚动条。可是我的问题是:在资源管理器中创建对话框时,是所见即所得的。即使在对话框的右端加上了一个滚动条,但是由于是在创建阶段,滚动条是不工作的。如何让它向下滚动以便我在下面加上新的编辑框呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以动态改变对话框大小啊SetWindowsPos MoveWindow 需要处理WM_HSCROLL/WM_VSCROLL消息 // WM_VSCROLL消息void CXXXDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default SCROLLINFO scrollinfo; GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); switch (nSBCode) { case SB_BOTTOM: ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10); scrollinfo.nPos = scrollinfo.nMax; SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break; case SB_TOP: ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10); scrollinfo.nPos = scrollinfo.nMin; SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break; case SB_LINEUP: scrollinfo.nPos -= 1; if (scrollinfo.nPos <scrollinfo.nMin) { scrollinfo.nPos = scrollinfo.nMin; break; } SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,10); break; case SB_LINEDOWN: scrollinfo.nPos += 1; if (scrollinfo.nPos> scrollinfo.nMax) { scrollinfo.nPos = scrollinfo.nMax; break; } SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,-10); break; case SB_PAGEUP: scrollinfo.nPos -= 5; if (scrollinfo.nPos <scrollinfo.nMin) { scrollinfo.nPos = scrollinfo.nMin; break; } SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,10*5); break; case SB_PAGEDOWN: scrollinfo.nPos += 5; if (scrollinfo.nPos> scrollinfo.nMax) { scrollinfo.nPos = scrollinfo.nMax; break; } SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,-10*5); break; case SB_ENDSCROLL: // MessageBox( "SB_ENDSCROLL "); break; case SB_THUMBPOSITION: // ScrollWindow(0,(scrollinfo.nPos-nPos)*10); // scrollinfo.nPos = nPos; // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break; case SB_THUMBTRACK: ScrollWindow(0,(scrollinfo.nPos-nPos)*10); scrollinfo.nPos = nPos; SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break; } CDialog::OnVScroll(nSBCode, nPos, pScrollBar); } // WM_HSCROLL 消息void CXXXDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default SCROLLINFO scrollinfo; GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); switch (nSBCode) { case SB_LEFT: ScrollWindow((scrollinfo.nPos-scrollinfo.nMin)*10,0); scrollinfo.nPos = scrollinfo.nMin; SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); break; case SB_RIGHT: ScrollWindow((scrollinfo.nPos-scrollinfo.nMax)*10,0); scrollinfo.nPos = scrollinfo.nMax; SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); break; case SB_LINELEFT: scrollinfo.nPos -= 1; if (scrollinfo.nPos <scrollinfo.nMin) { scrollinfo.nPos = scrollinfo.nMin; break; } SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); ScrollWindow(10,0); break; case SB_LINERIGHT: scrollinfo.nPos += 1; if (scrollinfo.nPos> scrollinfo.nMax) { scrollinfo.nPos = scrollinfo.nMax; break; } SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); ScrollWindow(-10,0); break; case SB_PAGELEFT: scrollinfo.nPos -= 5; if (scrollinfo.nPos <scrollinfo.nMin) { scrollinfo.nPos = scrollinfo.nMin; break; } SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); ScrollWindow(10*5,0); break; case SB_PAGERIGHT: scrollinfo.nPos += 5; if (scrollinfo.nPos> scrollinfo.nMax) { scrollinfo.nPos = scrollinfo.nMax; break; } SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); ScrollWindow(-10*5,0); break; case SB_THUMBPOSITION: break; case SB_THUMBTRACK: ScrollWindow((scrollinfo.nPos-nPos)*10,0); scrollinfo.nPos = nPos; SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); break; case SB_ENDSCROLL: break; } CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } 谢谢!滚动条我以前做过,有印象。但是我有一个疑问:按照上面一位网友的说法,要设计两个对话框,一个父对话框,一个子对话框。父对话框只是一个窗口,子对话框才显示真正的内容。但是:创建对话框的函数是CreateDialogParam,这个函数创建对话框的时候,对话框的位置和大小是以模板中的对话框数据创建的。而且这个位置是以屏幕为基准的。不是以父对话框为基准的。但是我在创建子对话框的时候,希望它以父对话框为基准,而且显示的内容也仅限于父对话框以内,这个怎么办? 你不会是在用SDK做吧把对话框的风格属性设成child然后调用Create函数就可以创建啊 我就是用SDK,原来对话框的属性还可以设为Child,感谢! 表很长,有一百项左右(每个表项是一个编辑框,有没有更好的办法?为哈不用listbox呢? 惭愧!怎么把对话框的属性设为Child?我找了半天找不到啊?是在资源编辑器里,右击对话框,在弹出的菜单中选“属性”是吗?可是里面几个选项,都没有child属性啊 我一急,到资源脚本文件里,把对话框的属性里加了一个WS_CHILD属性,不知可不可以?再到资源编辑器里,发现需要重新装载,重新装载以后,再看对话框的属性,似乎没有什么变化。难道WS_CHILD属性不是在资源编辑器里设的? 我也有此疑问。为什么不用ListCtrl////////////////////////////////////////资源里面,对话框属性里面可以设置Child 项目太多不能用静态方法,要用动态的方法,要点: 1)父窗口:对象指针数组 2)父窗口初始化:Create 3)对象:对象中执行语句:如Click(父窗口->postmessage (消息号,函数X)) 4)父窗口: mapmessage(函数X,消息号) 5)父窗口:退出前清理释放:对象指针数组 请问,在资源编辑器里,如何设计对话框的属性为Child?我用的是VC6.0,我看只有“常规”、“样式”、“更多样式”、“扩展样式”、“更多扩展样式”几个,里面没有设置Child的啊,请问在哪个里面? 你说的是Listview Control吗?那个好象是通用控件,我的教材里没有介绍这个的,无法使用。汗listBox是不行的,我做的就象一个数据库一样,每条记录有几个字段,一共有100条记录左右。在打开对话框里,要从文件中读入相应的内容。然后在对话框中修改以后,按“确定”再存储到文件中。 那就listctrl啊,选择报表格式 难道你做软件必须参考教材啊。Listctrl完全实现你目前的要求在“Style”(样式)中“Style”里面选择“Child”(popup,child,overlapped)三选一 用List Ctrol很方便啊,我公司里面用的软件就是这样的,上千行的记录,实时的显示,查找,存储,要用编辑框不疯掉了,程序运行几个月都好用的 为什么vs2008通过去没显示出结果啊? MFC:工具栏问题 implement_serial()问题 五岳语音卡挂机检查 对话框程序,线程内怎么传入类成员(public)变量? 为什么动态创建控件总是不成功? 一般到新公司多久才会安排点任务做作了?我来了3天了,什么也没做! 求救!求救!马上给分! 如何读取文本文件中指定的数据 请问:在Class View 里面,类的成员函数前加上了一把黄色的钥匙,或一把灰色的琐头是什么意思啊。 一个新人的散分贴(就20分) 急!内存画图问题
SetWindowsPos MoveWindow
// WM_VSCROLL消息
void CXXXDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default SCROLLINFO scrollinfo;
GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
switch (nSBCode)
{
case SB_BOTTOM:
ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10);
scrollinfo.nPos = scrollinfo.nMax;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case SB_TOP:
ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10);
scrollinfo.nPos = scrollinfo.nMin;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case SB_LINEUP:
scrollinfo.nPos -= 1;
if (scrollinfo.nPos <scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,10);
break;
case SB_LINEDOWN:
scrollinfo.nPos += 1;
if (scrollinfo.nPos> scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,-10);
break;
case SB_PAGEUP:
scrollinfo.nPos -= 5;
if (scrollinfo.nPos <scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,10*5);
break;
case SB_PAGEDOWN:
scrollinfo.nPos += 5;
if (scrollinfo.nPos> scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,-10*5);
break;
case SB_ENDSCROLL:
// MessageBox( "SB_ENDSCROLL ");
break;
case SB_THUMBPOSITION:
// ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
// scrollinfo.nPos = nPos;
// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case SB_THUMBTRACK:
ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
scrollinfo.nPos = nPos;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
} CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
} // WM_HSCROLL 消息
void CXXXDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default SCROLLINFO scrollinfo;
GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
switch (nSBCode)
{
case SB_LEFT:
ScrollWindow((scrollinfo.nPos-scrollinfo.nMin)*10,0);
scrollinfo.nPos = scrollinfo.nMin;
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_RIGHT:
ScrollWindow((scrollinfo.nPos-scrollinfo.nMax)*10,0);
scrollinfo.nPos = scrollinfo.nMax;
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_LINELEFT:
scrollinfo.nPos -= 1;
if (scrollinfo.nPos <scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
ScrollWindow(10,0);
break;
case SB_LINERIGHT:
scrollinfo.nPos += 1;
if (scrollinfo.nPos> scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
ScrollWindow(-10,0);
break;
case SB_PAGELEFT:
scrollinfo.nPos -= 5;
if (scrollinfo.nPos <scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
ScrollWindow(10*5,0);
break;
case SB_PAGERIGHT:
scrollinfo.nPos += 5;
if (scrollinfo.nPos> scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
ScrollWindow(-10*5,0);
break;
case SB_THUMBPOSITION:
break;
case SB_THUMBTRACK:
ScrollWindow((scrollinfo.nPos-nPos)*10,0);
scrollinfo.nPos = nPos;
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_ENDSCROLL:
break;
} CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
把对话框的风格属性设成child
然后调用Create函数就可以创建啊
为哈不用listbox呢?
////////////////////////////////////////
资源里面,对话框属性里面可以设置Child
要用动态的方法,要点:
1)父窗口:对象指针数组
2)父窗口初始化:Create
3)对象:对象中执行语句:如Click(父窗口->postmessage (消息号,函数X))
4)父窗口: mapmessage(函数X,消息号)
5)父窗口:退出前清理释放:对象指针数组