1

首先请原谅我,但我完全是新手。我正在尝试编写一个程序,当我单击屏幕时识别我的组合框选择(我选择我想要放置在那里的项目)。但是我不能,因为 SendMessage 函数总是返回 0。我怎样才能得到正确的结果?

HWND g_Combobox;

/* ... */

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    /* ... */

    switch (message)
    {
    case WM_CREATE:
    {
       HWND g_Combobox = CreateWindowEx( WS_EX_CLIENTEDGE, L"COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
            CBS_DROPDOWNLIST, 5, 25, 180, 200, hWnd, (HMENU) ID_MYCOMBO, hInst, NULL );
       SendMessage( g_Combobox, CB_ADDSTRING, 0,( LPARAM ) L"item 1" );
       SendMessage( g_Combobox, CB_ADDSTRING, 0,( LPARAM ) L"item 2" );
       SendMessage( g_Combobox, CB_ADDSTRING, 0,( LPARAM ) L"item 3" );

    /* ... */
    }
        break;
    case WM_LBUTTONDOWN:
    {
             switch (SendMessage(g_Combobox, CB_GETCURSEL, 0, 0))
             {
             case 0: //always picks this one
                 MessageBox( NULL, L"0", L"Oh noes!", MB_ICONEXCLAMATION );
                 break;
             default:
                 MessageBox( NULL, L"something diffrent than 0", L"Yeah...", MB_ICONEXCLAMATION );
                 break;
             }
    }

我究竟做错了什么?

4

1 回答 1

2
HWND g_Combobox = CreateWindowEx(...

用。。。来代替:

g_Combobox = CreateWindowEx(...

您当前的代码填充局部变量,保持全局变量不变。这就是为什么SendMessage使用全局变量会产生意想不到的结果。

以后要解决此类问题:

  1. 使用调试器。

  2. 使用最大可用编译器警告级别。

于 2013-09-11T12:45:44.420 回答