sendmessage()不在函数内部工作

时间:2014-06-03 06:35:43

标签: winapi visual-c++ listbox

如果我这样做,它可以工作 - 它填充列表框:

BOOL CALLBACK MnDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
    case WM_INITDIALOG:
    {
        res = stmt->executeQuery("SELECT id FROM tremreg ORDER BY id DESC");
    while (res->next())
    {
    int i = res->getInt("ID");
    std::string str = boost::lexical_cast<std::string>(i);
    char *cstr = new char[10];
    strcpy_s(cstr, 10, str.c_str());
            SendMessage(GetDlgItem(hwnd, IDC_lbList), 
                              LB_ADDSTRING, 0, (LPARAM)cstr);
    }
    delete res;
}
break;

但是,如果我想整洁并将其放在一个函数中,就像这样,它将不再填充列表,即使函数本身已运行。:

VOID fRefreshListID()
{
res = stmt->executeQuery("SELECT id FROM tremreg ORDER BY id DESC");
while (res->next())
{
    int i = res->getInt("ID");
    std::string str = boost::lexical_cast<std::string>(i);
    char *cstr = new char[10];
    strcpy_s(cstr, 10, str.c_str());
    SendMessage(GetDlgItem(g_hMnDialog, IDC_lbList), LB_ADDSTRING, 0, (LPARAM)cstr);
}
delete res;
}



BOOL CALLBACK MnDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_INITDIALOG:
{
    fRefreshListID();
}
    break;

由于某种原因,SendMessage()拒绝在函数内部工作。 g_hMnDialog是主对话框的全局句柄,其中包含所有控件,包括列表框。

问题:SendMessage(),在函数外部工作并填充列表框。但是,该函数一旦调用就不会填充列表框,即使它包含相同的代码。

问题:为什么我的SendMessage()在函数内部不起作用,我应采取哪些步骤才能使其工作?

奖金问题:哪个地方最适合调用此功能(一次/如果),它可以不断刷新列表框?

1 个答案:

答案 0 :(得分:1)

显而易见的解释是,当您致电g_hMnDialog时,fRefreshListID()尚未初始化。就个人而言,我会尽可能避免使用全局变量。当您调用fRefreshListID()时,您可以使用窗口句柄将其作为参数传递给fRefreshListID()。该功能如下所示:

void fRefreshListID(HWND hwndDialog)
{
    ....
}

调用API函数时应该检查错误。我的期望是GetDlgItem返回NULL,因为g_hMnDialog无效。然后你盲目地将NULL传递给SendMessage。我建议你添加一些错误检查。

你的字符串处理也完全没了。你使它比需要的要复杂得多。你可以这样写:

HWND hwndList = GetDlgItem(hwndDialog, IDC_lbList);
if (hwndList == NULL)
    // deal with this error
std::string str = ...;
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)str.c_str());

如果您希望该功能重新填充列表,您需要清除列表,或至少替换项目。就目前而言,每次调用函数时,都会向现有函数添加更多项目。

在应用程序运行时调用该函数的最佳时间是什么时候?您提供的信息无法详细解答。这取决于您的应用程序正在做什么。你想要什么触发刷新?你想要它是基​​于计时器,所以是一个轮询方法?或者您是否想要收听一个事件,告诉您列表内容已过期。只有你能真正回答这些问题。