На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (4) 1 [2] 3 4  все  ( Перейти к последнему сообщению )  
> Создание приложения Win32API с использованием диалогов
    Цитата tumanovalex @
    А если в редакторе диалогов можно указать, что окно нужно развернуть на весь экран, то можно редакторе задать положение кнопок (и других контролов), чтобы они были на нужном месте при развернутом окне?

    С точки зрения редактора ресурсов, описание диалога лишь текстовая структура в *.rc-файле. Посмотри https://msdn.microsoft.com/ru-ru/library/wi...p/aa381002.aspx, там указаны все возможные поля структуры, а конкретно то, что ты хочешь, должно делаться заданием стиля WS_MAXIMIZE в параметре STYLE. Что касается размещения элементов управления на диалоге, то тут два варианта: либо сразу создать диалог размером с предполагаемый экран и разместить стандартными средствами конструктора все элементы, либо кодом, после инициализации выполнить перемещение, а что бы было проще, можно сгруппировать элементы по дочерним диалогам-контейнерам
      Спасибо за ответ. Когда был такой код:
      ExpandedWrap disabled
            case WM_INITDIALOG:
            {
              //ShowWindow(hwnd, SW_MAXIMIZE);
              return FALSE;
            }
      диалог появлялся (причем при раскоментировании строки диалог максимизировался), а когда в файле .rc сделал так:
      ExpandedWrap disabled
        STYLE WS_MAXIMIZE | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
      окно мелькнуло и пропало. Поскольку разрешение экрана может быть разное, я хотел бы следовать по второму пути - разместить на диалоге нужные элементы, а после инициализации диалога (максимизации диалога) контролы диалога переместить в нужное положение в зависимости от текущего разрешения экрана. При этом хотелось бы максимально использовать возможности редактора ресурсов.
      Сообщение отредактировано: tumanovalex -
        Цитата tumanovalex @
        окно мелькнуло и пропало

        Добавь WS_VISIBLE.
          ExpandedWrap disabled
            STYLE WS_MAXIMIZE | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
          Все равно окно мелькнуло и пропало. Попробовал
          ExpandedWrap disabled
                case WM_INITDIALOG:
                {
                  ShowWindow(hwnd, WS_VISIBLE);
                  return FALSE;
                }
          тот же результат.
            Цитата tumanovalex @
            ExpandedWrap disabled
              STYLE WS_MAXIMIZE | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
            Все равно окно мелькнуло и пропало. Попробовал
            ExpandedWrap disabled
                  case WM_INITDIALOG:
                  {
                    ShowWindow(hwnd, WS_VISIBLE);
                    return FALSE;
                  }
            тот же результат.

            Может это ?:
            ExpandedWrap disabled
              WS_MINIMIZEBOX | WS_MAXIMIZEBOX

            Процесс исследований может быть таким:
            Запускаем некое приложение, разворачиваем окно и WinSpy-ем смотрим его стили.
            Их и будем пробовать использовать.
            ---
            А вообще эти опыты у меня кончились полным провалом - мне никак не удалось, используя
            стили окна показать его при запуске приложения полностю развёрнутым или свёрнутым.
            Иногда при использовании WS_MAXIMIZE приложение начинало мерзко глючить.
            Поэтому я устанавливаю размеры окна исключительно после запуска.
            Попробуй найти, в чём дело, но по моему тема тухлая.
            ---
            Однако эта тема имеет полезное продолжение.
            Обычно юзер стремится выбрать некие параметры удобные для него.
            В том числе размеры окна и его расположение на скрине.
            Поэтому неплохим свойством приложения можно считать установку при запуске
            местоположения и размеров, выбраннх юзером предыдущим запуском.
            По крайней мере для окошек, непрерывно отображающих чего-то.
            (За исключением свёрнутого положения - запускать так, это уже перебор.)
            Сообщение отредактировано: ЫукпШ -
              нельзя! нет совместимости флажков WS_POPUP и WS_MAXIMIZE. MFC рулит! :D
                Убрал WS_POPUP, все равно ничего не получилось. Проект прикрепил, может быть я где-то что-то перепутал?
                Прикреплённый файлПрикреплённый файлWin32dialog.zip (3,73 Кбайт, скачиваний: 103)
                  tumanovalex, похоже ответ спрятан в сообщении ЫукпШ. Рекомендую перечитать его внимательно.
                    пропустил break в switch WM_SIZE :D
                    MFC рулит! :wild:
                    Сообщение отредактировано: Cfon -
                      Спасибо, получилось. Только если в rc файле указать:
                      ExpandedWrap disabled
                        STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_VISIBLE | WS_MAXIMIZE | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZE | WS_VISIBLE
                      все равно не разворачивается
                        Чтобы ответить почему, надо знать релизацию Win32 API функции CreateWindow(Ex) :)
                        ИМХО как я уже писал флажок WS_MAXIMIZE игнорится при установленом стиле WS_POPUP, хотя вроде он игнориться и при WS_OVERLAPPED :D
                        вообще надо делать через ShowWindow(SW_MAXIMIZE)
                        Сообщение отредактировано: Cfon -
                          Цитата B.V. @
                          либо кодом, после инициализации выполнить перемещение, а что бы было проще, можно сгруппировать элементы по дочерним диалогам-контейнерам

                          Подскажите, пожалуйста,как создать дочерний диалог-контейнер для контролов, например, для кнопок ОК и Отмена.
                          Сообщение отредактировано: tumanovalex -
                            Цитата tumanovalex @
                            Все равно окно мелькнуло и пропало.

                            Открыл твой проект. У тебя неправильно составлена процедура диалога. Во-первых, в случае обработки сообщения следует возвращать TRUE, согласно спецификации обработчика. Во-вторых, каждый case должен заканчиваться break-ом или return-ом, иначе управление безусловно перейдет на нижестоящий case. Что у тебя и происходит: со всех вышестоящих case управление переходит на case WM_CLOSE с последующим закрытием диалога.

                            Что касается WS_MAXIMIZE. Возможно, диалоговые функции игнорируют данный стиль. Окно, созданное таким образом
                            ExpandedWrap disabled
                                  hWnd = CreateWindowEx(0, WCEX.lpszClassName, NULL, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
                                      512, 512, NULL, NULL, hInstance, NULL);

                            успешно отображается развернутым.

                            Цитата tumanovalex @
                            Подскажите, пожалуйста,как создать дочерний диалог-контейнер для контролов, например, для кнопок ОК и Отмена.

                            Точно так же, как и родительский диалог. Добавь еще один диалог в ресурсы и помести на него кнопки, а в его обработчике выполняй обработку WM_COMMAND и его результат проверяй в WinMain. Ну и создание, соответственно, должно быть через CreateDialog после родительского (так же не-модального), с указанием родителя..
                              Я никогда не работал с диалогами, а тем более с диалогами в диалоге. Поэтому у меня возникли трудности в реализации того, что Вы, B.V. посоветовали. У меня возникли следующие вопросы:
                              1. Исправил оконную процедуру DlgProc. Однако если в последнем операторе return CALLBACK DlgProc вместо FALSE указать TRUE, программа зависает. Почему так происходит?
                              2. Как определить хендл основного диалога для указания его в CreateDialog второго диалога?
                              3. Попробовал размер диалога с кнопками уменьшить до размера кнопок - не получилось. Можно ли это сделать? А то размер второго диалога, гораздо больший размера кнопок, может наложиться на другие контролы основного диалога.
                              Проект с двумя диалогами и двумя колбек функциями прикрепил. В связи с возникшими вопросами проект не доделан, прошу не судить строго.
                              Прикреплённый файлПрикреплённый файлWin32dialog.zip (3,7 Кбайт, скачиваний: 103)
                              Сообщение отредактировано: tumanovalex -
                                Цитата B.V. @
                                Что касается WS_MAXIMIZE. Возможно, диалоговые функции игнорируют данный стиль. Окно, созданное таким образом
                                ExpandedWrap disabled
                                      hWnd = CreateWindowEx(0, WCEX.lpszClassName, NULL, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
                                          512, 512, NULL, NULL, hInstance, NULL);

                                успешно отображается развернутым.

                                Специально попробовал - не получается.
                                Использовал исходник из Петзольда (то-же самое, что и в MSDN).
                                Если это действительно устойчиво работает, значит есть что-то ещё.
                                -----
                                Не так всё просто, как казалось, с функцией ShowWindow.
                                Там вообше автомат состояний, его работа зависит от запускающего приложения.
                                Возможно игнорирование 2-го параметра при первом вызове этой функции.
                                -----
                                Вероятно, все эти "проблемы" - результат того, что запускающее
                                приложение Виндус должно иметь возможность запустить приложение
                                в любом виде. И это можно настроить в "свойствах" - правой кнопкой
                                мыши по ярлыку на рабочем столе->свойства->окно.
                                Сообщение отредактировано: ЫукпШ -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0541 ]   [ 19 queries used ]   [ Generated: 2.05.24, 06:43 GMT ]