我应该把初始化控件的代码放在哪里

Where do I put the code to initialize my controls?

本文关键字:代码 在哪里 控件 初始化 我应该      更新时间:2023-10-16

我现在已经多次尝试找到一个可以插入代码部分的地方,该代码部分基本上只向对话框中的控件添加一列:

void MusicPlayerDialog::InitList()
{
    m_trackList.InsertColumn(0, "Tracks");
    m_trackList.SetColumnWidth(0, 60);
}

然而,到目前为止,我尝试插入的每一点都会导致::IsWindow(m_hWnd)断言失败。

我很确定这是由于对话框尚未初始化或已被破坏所致。

然而,我现在想知道我可以把它插入哪里,这样它就可以安全地执行。

这是我创建对话框的片段:

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
    LPSTR szCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(szCmdLine);
    UNREFERENCED_PARAMETER(hInstPrev);
    MusicPlayerDialog myDialog;
    MSG msg;
    myDialog.Create(NULL, NULL);
    myDialog.ShowWindow(nCmdShow);
    myDialog.UpdateWindow();
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

在这里,我在消息列表之前和之后都尝试过,但都给了我错误。循环之后的那个有点明显,但我认为它前面的那个效果很好。

此外,我在对话框构造函数中尝试过,但预计也会失败。

我想到目前为止最好的想法是使用消息图,类似于这样的东西:

MESSAGE_HANDLER(WM_INITDIALOG, OnInit);

但是,我找不到WM_。。。。消息,该消息将在窗口创建之后被触发。我浏览了MSDN上的列表,但从我的阅读来看,没有一个适合我的。

然后,连接到它的方法将调用我的所有控件初始化方法。

有人能给我指一个解决方案吗?

编辑:

当我把它放在OnInit()中并在它前面执行DoDataExchange()时,它似乎是有效的。仍然不确定这是否是的"解决方案"

您应该在MusicPlayerDialog::OnInitDialog()中调用InitList(),这是CDialog:的虚拟函数

.h:

virtual BOOL OnInitDialog();

.cpp:

BOOL MusicPlayerDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    // more code
    // TODO: Add extra initialization here
    InitList();
    return TRUE;  // return TRUE  unless you set the focus to a control
}