我在哪里放置代码来初始化我的控件?

时间:2016-01-01 18:42:29

标签: c++ mfc wtl

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

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()时似乎有效。仍然不确定那些"""溶液

1 个答案:

答案 0 :(得分:3)

您应该在InitList()中拨打MusicPlayerDialog::OnInitDialog(),这是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
}