SDI工程,我创建了一个基于CDialogBar的工具条,用资源管理在上边放置了一个CListBox控件,我想程序运行起来后自动为ListBox设置好题头,应该在那里设置?我直接在CDialogBar类的create事件里面设置出错,跟踪发现是断言错误,好像是句柄不存在(分析是程序没有运行起来,工具条还没建立),哪我该在那里对他进行初始化工作那?
另,我该在那里控制ListBox大小和位置?我想让程序启动后,listbox充满整个工具条
20 个解决方案
没有哪个事件,重写里面都没。你说的是那种基于对话框的才有onInitialDialog
MSDN:
Knowledge Base
HOWTO: How to Initialize Child Controls in a Derived CDialogBar
ON_MESSAGE(WM_INITDIALOG, OnInitDialog)
跟CDialog中的OnInitDialog虚函数不一样,CDialogBar中主动响应WM_INITDIALOG消息,然后在响应函数里初始化控件,但是一定在记得在你自己的响应函数中先调用CDialogBar原先的响应函数。
to Mackz :
那文档是讲如何把Cdialog变成CdialogBar的,我都实现了,我是问在那里初始化CdialogBar上的CListCtrl的标题,位置及大小。没说到点子上
if (!m_dlgBar.Create(this, IDD_DIALOGBAR1,
CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_VIEWSELECT))
{
TRACE0("Failed to create DlgBar\n");
return -1; // fail to create
}
在后面加上
(CListBox*) pListBox=(CListBox*)m_dlgBar.GetDlgItem(IDC_LISTBOX1);
if(pListBox)
{
在这里操作Listbox就行了
}
也就是说在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里面初始化拉。
我就是想知道是在主CMainFrame里面还是在CDialogBar里面初始化
还一个问题啊:我现在要把LISTbox最大化到整个CDialogBar。我怎样得到CDialogBar的工作区大小,在在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里面用GetClientRect(&rect)得到的不是
CDialogBar的大小阿
应该m_dlgBar.GetClientRect(&rect)
我做了一个初始化函数在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里面调用,可是显示不出来题头
void CMainFrame::InitWarnList(void)
{
(CListCtrl *) pListCtrl=(CListCtrl*)m_wndWarnDlgBar.GetDlgItem(IDC_LISTWARN);
if(pListCtrl)
{
CRect rect;
m_wndWarnDlgBar.GetClientRect(&rect);
rect.left =0;
rect.top =0;
rect.bottom =200;
rect.right =200;
pListCtrl->ScreenToClient(rect);
pListCtrl->ModifyStyleEx(0, WS_EX_CLIENTEDGE|WS_EX_RIGHTSCROLLBAR);
int i;
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
CString strTemp[6] = {"序号", "设备号","组号","报警类型","报警描述","报警时间"};
int size[6] = {40,60,40,80,260,80};
for(i = 0; i < 6; i++)
{
lvc.iSubItem = i;
lvc.pszText = (char*)(LPCTSTR)strTemp[i];
lvc.cx = size[i];
lvc.fmt = LVCFMT_LEFT;
pListCtrl->InsertColumn(i, &lvc);
}
}
}
最大化到客户区咋办阿?用那个函数m_wndWarnDlgBar.GetClientRect(&rect);取出来的rect.left=-600多,
其他的数值也不对
改变大小应该在CMainFrame::OnSize里面处理,创建的时候不用管
你的代码在我这里没问题,可以显示标题
onsize里面应该判断一下工具条是否已经建立了吧,要不程序一开始会报错