У меня есть две кнопки. Каждая кнопка выделена, а не только первая. Как сделать, чтобы первая кнопка была только выделенной?
Кстати, это код для двух кнопок:
openFileButton = CreateWindowA("button", "Open File and start hashing", WS_VISIBLE | WS_CHILD | SS_CENTER, 220, 210, 200, 50, hWnd,
(HMENU)BUTTON_OPEN_FILE, NULL, NULL);
SendMessage(openFileButton, WM_SETFONT, my_font, true);
hashFileButton = CreateWindowA("button", "Get the File hash", WS_VISIBLE | WS_CHILD | SS_CENTER, 220, 270, 200, 50, hWnd,
(HMENU)BUTTON_HASH_FILE, NULL, NULL);
SendMessage(hashFileButton, WM_SETFONT, my_font, true);
Пытался использовать SetFocus, но не повезло.





Во-первых, перестаньте вызывать A версии функций WinAPI. Они устарели еще в 90-х. Вместо этого используйте версии W с префиксами L в строковых литералах и wchar_t в качестве типа символа.
Во-вторых, вы передаете неправильные флаги стиля для кнопок. В частности, вы проходите SS_CENTER. Это стиль для статических элементов управления (отсюда и префикс SS_), а не для кнопок. SS_CENTER определяется в файлах заголовков Windows как значение 0x1, что эквивалентно стилю кнопки BS_DEFPUSHBUTTON. (Обратите внимание, что макросы #define не являются типобезопасными, поэтому компилятор не знает и не может предупредить вас, что вы указываете стиль статического элемента управления при создании элемента управления кнопки.)
Наличие этого ошибочного стиля BS_DEFPUSHBUTTON является причиной того, что ваши кнопки выделены, как если бы они были кнопками по умолчанию в диалоговом окне. Для стандартных кнопок вам нужен BS_PUSHBUTTON, который # определяется как значение 0x0 и, таким образом, эквивалентен тому, чтобы не передавать никакие флаги стиля в вашу функцию CreateWindow. Но для удобочитаемости и самодокументируемого кода я бы настоятельно рекомендовал явно передавать BS_PUSHBUTTON.
Итак, ваш исправленный код становится:
openFileButton = CreateWindowW(L"button",
L"Open File and Start Hashing",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
220, 210, 200, 50,
hWnd,
(HMENU)BUTTON_OPEN_FILE,
NULL,
NULL);
SendMessage(openFileButton, WM_SETFONT, my_font, true);
hashFileButton = CreateWindowW(L"button",
L"Get the File Hash",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
220, 270, 200, 50,
hWnd,
(HMENU)BUTTON_HASH_FILE,
NULL,
NULL);
SendMessage(hashFileButton, WM_SETFONT, my_font, true);
Возможно, вы захотите сделать одну (и только одну) из ваших кнопок кнопкой «по умолчанию», используя стиль BS_DEFPUSHBUTTON. Поведение легко реализовать, вызвав функцию IsDialogMessage в вашем основном цикле сообщений (поведение, которое вы получили бы «бесплатно», создав диалоговое окно с дополнительным преимуществом редактора ресурсов для размещения элементов управления и установки стилей. ).
Он работал правильно после перехода на
BS_PUSHBUTTON. Не заметил, чтоSS_CENTERбыл виновником.