WinAPI FindWindow

Я создаю приложение win32 в Visual Studio 2012. У меня есть 4 отключенные кнопки, созданные с помощью следующего кода:

HWND hWndButton=CreateWindowEx(NULL, 
        L"BUTTON",
        L"APP1",
        WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON|WS_DISABLED|BS_ICON,
        40,
        40,
        180,
        140,
        hWnd,
        (HMENU)IDC_BUTTON1,
        GetModuleHandle(NULL),
        NULL);

Что я хочу сделать, это включить кнопки во время работы приложения. Я пытался использовать findwindow, чтобы найти и включить первую кнопку, но она не нашла ее. Мой код:

HWND hwB1 = FindWindow(L"BUTTON",L"APP1");
if (hwB1 !=0)   MessageBox(NULL,L"FOUND",L"Button Found",MB_OK);
EnableWindow(hwB1,true);

Я делаю что-то неправильно? Заранее спасибо.

2 ответа

Решение

FindWindow() находит окна верхнего уровня, а не дочерние окна.

Если вы действительно хотите посмотреть дочернее окно по имени, вы можете использовать FindWindowEx() функция, но использование идентификатора обычно более эффективно.

Функция, которая делает это GetDlgItem(), Это просматривает дочерние окна по их идентификатору, который вы предоставляете при создании.

HWND hwB1 = GetDlgItem(hWnd, IDC_BUTTON1);

hWnd это родительское окно, и IDC_BUTTON1 это идентификатор.

Другая альтернатива - просто сохранить дескриптор окна, который возвращается при создании дочернего окна - hWndButton в вашем примере кода - и тогда вам вообще не нужно его искать.

Использование FindWindowEx(),

HWND hwB1=FindWindowEx(hWnd/*Parent window*/,
                       hWndButton/*Child window*/,
                       "BUTTON"/*Class of the child window*/,
                       "APP1"/*Title of the child window*/);

Это лучший метод, когда идентификатор элемента управления неизвестен.

Другие вопросы по тегам