Создание окна с помощью CreateWindowEx без значка

С C# мне легко удалось добиться желаемого эффекта:

стандартное окно без значка в строке заголовка

Однако у меня возникли проблемы с выполнением того же самого с помощью Win32 API на языке C. Я не знаю, как создать окно с без значка (вообще), но с заголовком, кнопка свертывания и кнопка закрытия.

Я правильно зарегистрировал свой класс, но не могу понять, что поставить для стилей окна/расширенных стилей окна.

static const TCHAR lpctszTitle[] = TEXT("Stuff"), lpctszClass[] =
  TEXT("StuffClass");

HWND hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST, lpctszClass,
  lpctszTitle, WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
  CW_USEDEFAULT, 0, 250, 55, NULL, NULL, hThisInstance, NULL);

Приведенный выше код произвел:

стандартное окно СО значком в строке заголовка

у которого все еще есть значок в строке заголовка, и это не то, что я хотел.


person Neal P    schedule 05.02.2011    source источник


Ответы (2)


Стандартному окну требуется значок, потому что ему нужна некоторая форма представления на панели задач в нижней части экрана. Что должно отображаться при нажатии Alt+Tab в переключателе окон, если в одном из главных окон нет значка?

Вам необходимо указать WS_EX_DLGMODALFRAMEрасширенный стиль. Это тот же эффект, который WinForms устанавливает, когда вы отключаете значок в строке заголовка.

Вы также должны убедиться, что вы не указываете значок при регистрации класса окна. Вам нужно установить поля hIcon и hIconSm структуры WNDCLASSEX в 0.

Измените код на следующий:

static const TCHAR lpctszTitle[] = TEXT("Stuff"), lpctszClass[] =
  TEXT("StuffClass");

HWND hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST, lpctszClass,
  lpctszTitle, WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
  CW_USEDEFAULT, 0, 250, 55, NULL, NULL, hThisInstance, NULL);
person Cody Gray    schedule 05.02.2011
comment
Я пробовал это, но тогда у окна не было кнопки закрытия. localhostr.com/files/k3WzHR6/Stuff.png - person Neal P; 05.02.2011
comment
@myeviltacos: Полагаю, я упустил суть вопроса. Удаление системного меню фактически удаляет окно закрытия; это по дизайну. На самом деле вы ищете диалоговое окно для эмуляции подобного стиля в WinForms. Стандартное главное окно не будет делать то, на что вы надеетесь. Я обновил свой ответ. - person Cody Gray; 05.02.2011
comment
Спасибо, это было именно то, что мне было нужно! - person Neal P; 05.02.2011
comment
@myeviltacos: Извините, я запутался с тем, указали ли вы значок при регистрации класса окна. Это, очевидно, меняет поведение. Вы не показали этот код в своем вопросе. Я думаю, что я обратился к этому достаточно сейчас. - person Cody Gray; 05.02.2011
comment
WS_EX_DLGMODALFRAME это то, что я искал. - person rodrigocfd; 19.07.2020

Кстати, используйте Spy++ или другой подобный инструмент, чтобы увидеть стили, которые фактически использует любой данный HWND. Наведите его на окно C#, а затем продублируйте указанные стили в коде C.

person Remy Lebeau    schedule 05.02.2011