如果我这样做,它可以工作 - 它填充列表框:
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()在函数内部不起作用,我应采取哪些步骤才能使其工作?
奖金问题:哪个地方最适合调用此功能(一次/如果),它可以不断刷新列表框?
答案 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());
如果您希望该功能重新填充列表,您需要清除列表,或至少替换项目。就目前而言,每次调用函数时,都会向现有函数添加更多项目。
在应用程序运行时调用该函数的最佳时间是什么时候?您提供的信息无法详细解答。这取决于您的应用程序正在做什么。你想要什么触发刷新?你想要它是基于计时器,所以是一个轮询方法?或者您是否想要收听一个事件,告诉您列表内容已过期。只有你能真正回答这些问题。