Здравствуйте, Deviant.Developer, Вы писали:
DD>Здравствуйте, уважаемые форумчане. Мне очень нужна Ваша помощь. DD>Учусь писать GUI на Visual C++.
[...] DD>Вот такой код я набросал. DD>Что не получается: Edit в дочернем окне не активен и туда не вводится информация. DD>Если его родительским окном назначить основное, то всё ОК. DD>Вопросы: DD>Правильная ли логика и структура программы вообще? DD>Почему эдит неактивен и как это исправить? DD>Правильно ли, что дочернее окно и его элементы я создаю в WinMain или лучше запихнуть всё это в обработчик WM_CREATE основного окна? И почему лучше? DD>Ну и просто покритикуйте код, я ещё только учусь, мог допустить совершенно тупые ошибки именно в логике. DD>Очень надеюсь на дискуссию с Вами, спасибо.
Вы начали свой путь не с того конца.
На самом деле на данном этапе Вам не "помощь форумчан" и тем более "дискуссия" нужна, а изучение к.н. тутора по WIN API: "Простое окно", "Дочерние окна", "Диалоговое окно как основное" и пр. Т.е. не методом тыка вслепую, а взять работающий пример из тутора, и уже от него отталкиваться, модифицируя его код в разных направлениях, темы тутора их подскажут. Поверьте, так куда быстрее. (Я бы посоветовал начать с "Win32 API Tutorial" от Iczelion-а: во-первых — освоетесь на раз-два, а во-вторых — у самого Iczelion-а немало поучительных ошибок, которые, возможно, специально вкраплены в текст тутора в учебных целях, типа "Внимание, ввожу неисправность" ).
А то, что тем не менее на Ваш код тут отвечают, просто показывает, насколько интеллигентен наш форум
Для построения таких отношений, как в коде топикстартера, нужно прибегать к архитектуре MDI.
В MFC, кстати, разделение на фреймовые и клиентские окна тоже не зря сделано — фреймовое окно
управляет рамкой и системным меню, а за клиентскую область отвечает другая сущность.
Вот код, где делается попытка решить проблему чисто на диалогах:
Здравствуйте, Deviant.Developer, Вы писали:
DD>И всё же, WS_CAPTION отвечает за заголовок окна, если убрать, это будет тупо рамочка, что меня не совсем устраивает. Так что в ближайшее время буду думать над вариантами.
А что, если взять готовый контрол?
Например, BUTTON со стилем BS_GROUPBOX — рамочка с заголовком.
DD>Ну и, конечно, остается вопрос: как взаимосвязан этот флаг и "активность" Edit'а? DD>Убираешь флаг WS_CAPTION и получаешь рамку на форме и Edit в который можно вводить символы. Добавляешь флаг и получаешь отдельное окошко, но при этом Edit "умирает". В чем фокус ? Предстоит разобраться.
Прими как данность, что у дочерних окон ограниченные возможности по рисованию неклиентских элементов.
Было бы внезапно, например, ожидать там WS_SYSMENU или WS_MINIMIZEBOX.
Нет, конечно же, ты можешь написать собственное окно, которое реализует все WM_NCPAINT и т.п. так, как тебе это нужно...
но похоже, что в обычной жизни у дочернего окна наступило умопомрачение.
Впрочем, можно предположить, что это умопомрачение кратковременно: во время инициализации окошко задисаблило само себя (вместе с содержимым — эдитом).
Попробуй проверить — прочитать IsWindowEnabled(LogonWnd), и включить EnableWindow(LogonWnd,TRUE).
Вдруг поможет?
Здравствуйте, Deviant.Developer, Вы писали:
DD>К слову, если использовать popup окно, то получается то что я хочу — и edit активен и всё в отдельном окошечке. Это нормальный вариант для использования в программе и чем он лучше\хуже диалоговых окон?
Да ничем не хуже, просто собирать такие окошки по кусочкам в рантайм — путь для очень уж трудолюбивых людей
DD>Просто это интересно — писать интерфейс на WinAPI, я привык работать с VCL, MFC, а вот так чтобы вручную писать не пробовал, так что теперь идет тяжелый и забавный процесс обучения. Короче, я совсем deviant
Ну дык, DialogBox или там CreateDialogParam — самый что ни на есть WinApi
Здравствуйте, Deviant.Developer, Вы писали:
К>>Попробуй проверить — прочитать IsWindowEnabled(LogonWnd), и включить EnableWindow(LogonWnd,TRUE). К>>Вдруг поможет? DD>Это первое что мне пришло в голову. Возвращает что окно активно
Только, чтобы в терминах не путаться. Активно — это GetActiveWindow, текущее popup/overlapped окно системы. А IsWindowEnabled — это "включено" (или какой там официальный перевод?)
Я немножко поэкспериментировал с твоим кодом.
Если после создания сказать эдитбоксу SetFocus, то оно получает этот самый фокус. При том, что LogonWindow по-прежнему неактивно (имеет бледную рамку).
По-моему, нет большого смысла регистрировать новый класс окна ради такой маленькой задачи, как ввод пароля.
Лучше в обработчике WM_CREATE главного окна вызвать DialogBoxParam (или CreateDialogParam для немодального диалога).
На счет edit-а не знаю, возможно, указаны неправильные стили окна.
В любом случае, дочерние окна не предназначены для пользовательского ввода.
А код нормальный, только немного "сплюснутый" (воздуха по вертикали не хватает).
Блоки case лучше оформлять как-то по-другому, чтобы не забыть про break.
И еще хорошо бы придерживаться согласованного стиля именования — если одно окно называете hMainWnd,
то и второе должно называться hLogonWnd, а не LogonWnd.
Здравствуйте, Deviant.Developer, Вы писали:
DD>Здравствуйте, уважаемые форумчане. Мне очень нужна Ваша помощь. DD>Учусь писать GUI на Visual C++.
А где в приведённом коде используется C++?
А зачем Вам делать его чилдом? Почему-бы не использовать обычный модальный диалог? Нарисуйте его в ресурсах и показывайте DialogBox. Это куда удобнее, да и можно подготовить несколько диалогов для разных языков.
Здравствуйте, уважаемые форумчане. Мне очень нужна Ваша помощь.
Учусь писать GUI на Visual C++.
Логика моей задачи такая: появляется основное окно и тут же появляется диалоговое окно, в котором пользователю предлагается ввести данные.
Вот такой код я набросал.
Что не получается: Edit в дочернем окне не активен и туда не вводится информация.
Если его родительским окном назначить основное, то всё ОК.
Вопросы:
Правильная ли логика и структура программы вообще?
Почему эдит неактивен и как это исправить?
Правильно ли, что дочернее окно и его элементы я создаю в WinMain или лучше запихнуть всё это в обработчик WM_CREATE основного окна? И почему лучше?
Ну и просто покритикуйте код, я ещё только учусь, мог допустить совершенно тупые ошибки именно в логике.
okman, спасибо за ответ. Тогда посмотрю и реализую предложенный Вами вариант с DialogBoxParam.
O>В любом случае, дочерние окна не предназначены для пользовательского ввода.
Вероятно, я не совсем понимаю их предназначение... Везде написано, что дочерние окна делят рабочую область основного окна на функциональные области. Если не пользовательский ввод, то что там обычно отражают? Просто какую-то рабочую информацию или состояния?
Ну и проблема с неактивным Edit остается актуальной. Чуть позже ещё раз свежим взглядом посмотрю на код и подумаю, где могут быть грабли.
Здравствуйте, okman, Вы писали: O>На счет edit-а не знаю, возможно, указаны неправильные стили окна.
И действительно, дело оказалось именно в этом. Чтобы Edit "заработал", достаточно убрать флаг WS_CAPTION при создании дочернего окна.
Собственно, разобрался(после футбола голова как никогда свежая ) ещё раз спасибо.
И всё же, WS_CAPTION отвечает за заголовок окна, если убрать, это будет тупо рамочка, что меня не совсем устраивает. Так что в ближайшее время буду думать над вариантами.
Ну и, конечно, остается вопрос: как взаимосвязан этот флаг и "активность" Edit'а?
Убираешь флаг WS_CAPTION и получаешь рамку на форме и Edit в который можно вводить символы. Добавляешь флаг и получаешь отдельное окошко, но при этом Edit "умирает". В чем фокус ? Предстоит разобраться.
Здравствуйте, Кодт, Вы писали: К>Впрочем, можно предположить, что это умопомрачение кратковременно: во время инициализации окошко задисаблило само себя (вместе с содержимым — эдитом). К>Попробуй проверить — прочитать IsWindowEnabled(LogonWnd), и включить EnableWindow(LogonWnd,TRUE). К>Вдруг поможет?
Это первое что мне пришло в голову. Возвращает что окно активно
Здравствуйте, Jolly Roger, Вы писали: JR>А где в приведённом коде используется C++?
Нигде, изначально цель была попрактиковаться в написании интерфейса на WinAPI. Просто использую эту IDE. JR>А зачем Вам делать его чилдом? Почему-бы не использовать обычный модальный диалог? Нарисуйте его в ресурсах и показывайте DialogBox. Это куда удобнее, да и можно подготовить несколько диалогов для разных языков.
Скорее всего так и сделаю. Покурю приведенный тут пример и разберусь (спасибо, okman).
К слову, если использовать popup окно, то получается то что я хочу — и edit активен и всё в отдельном окошечке. Это нормальный вариант для использования в программе и чем он лучше\хуже диалоговых окон?
Просто это интересно — писать интерфейс на WinAPI, я привык работать с VCL, MFC, а вот так чтобы вручную писать не пробовал, так что теперь идет тяжелый и забавный процесс обучения. Короче, я совсем deviant