Назад | Начало урока |
Содержание


День 3 (продолжение 2)

  • Библиотека MFC .Метобы-члены класса CWnd
  • Запуск другого приложения
  • Резюме
  • Вопросы и ответы
  • Упражнения


    Язык С++ Указатели на объекты
    (Материал пропущен)
    Библиотека MFC .Методы-члены класса CWnd.

    CWnd* GetDlgItem(int nID) const;
    BOOL EnableWindow(BOOL bEnable = TRUE);
    BOOL ShowWindow(int nCmdShow);

    Первый метод GetDlgItem() возвращает указатель на дочернее окно. Возвращаемый указатель представляет собой указатель на тип CWnd. Данному методу передается только один параметр -Идентификатор (ID) дочернего окна. Функция GetDlgItem() обычно применяется для того, чтобы получить указатель на элемент управления в диалоговом окне, но может использоваться и для того, чтобы получить указатель на любое дочернее окно.

    Метод EnableWindow() включает или отключает возможность взаимодействовать с тем окном, для которого вызван данный метод. В качестве единственного параметра передается булево значение. Если значение TRUE - окно (или элемент управления) будет разблокировано, и пользователь получает возможность взаимодействовать с окном.

    Третий метод ShowWindow() позволяет отобразить или скрыть окно. Если параметр TRUE -окно отображается.

    Вверх

    Запуск другого приложения
    Ранее мы добавили название трех приложений Windows в комбинированный список Combo Box (в поле Data из Properties). Когда наше приложение выполняется, названия этих приложений Windows видны в раскрывающемся списке. Можно выбрать любое из них, и в области значений поля со списком появится название выбранного приложения.

    АВ:(Почему-то видно только первое название программы из трех, которые я вводил)

    Теперь уже видны в раскрывающемся списке все три названия которые мы ввели. Просто первоначально при вводе этого управляющего элемента в окно я не расширил его до нужных размеров. Потому поместилось только первое название программы.

    К этой, работающей как и надо, части нужно только добавить код, связав его с кнопкной Run Program. Фактически данный код должен извлечь значение из области значений поля со списком и запустить соответствующую программу. Создайте функцию для кнопки Run Program.на событие OnClick и добавьте к ней код из следующего листинга :

    Листинг 3.7 CONTROLSDLG.CPP - запуск другого Windows приложения

    void CControlsDlg::OnBnClickedRunprg() {
    //получить текущие значения от экрана
    UpdateData(TRUE);

    //объявить локальную переменную,в которой будет
    //храниться название программы
    CString strPgmName;

    //эту переменную - m_strProgToRun - надо было объявить заранее и привязать ее
    //к элементу (поле со списком) Combo Box проверь это
    // CString m_strProgToRun и инициализировать ее названием
    //программы пользователь будет интерактивно ;

    //копировать название программы, которое считано функцией
    //UpdateData(TRUE) в переменную m_strProgToRun, в локальную переменную
    //strPgmName

    strPgmName = m_strProgToRun;

    //перевести название программы на верхний регистр
    strPgmName.MakeUpper();

    //запуск выбранной пользователем программы :

    if(strPgmName == "PAINT")
    WinExec("mspaint.exe ",SW_SHOW);
    if(strPgmName == "NOTEPAD")
    WinExec("notepad.exe ",SW_SHOW);
    if(strPgmName == "SOLITAIRE")
    WinExec("sol.exe ",SW_SHOW);
    }


    Как и следовало ожидать в этой функции сначала вызывается UpdateData(TRUE), чтобы сохранить в переменных значения, хранящиеся в элементах управления диалогового окна. (Чтобы поместить название программы, введенной пользователем в элемент ComboBox, в переменную m_strProgToRun)

    Следующий шаг может показаться вроде бессмысленным: мы объявляем новую переменную типа CString и копируем в нее значение, хранящееся в поле со списком.Действительно ли это необходимо - ведь значение уже и так хранится в переменной типа CString m_strProgToRun?

    На самом деле это зависит от того, как должно вести себя приложение. В следующей строке кода обнаруживается вызов функции MakeUpper() для переменной типа CString, которая связана с полем со списком. Эта функция преобразовывает все символы строки в прописные(заглавные -символы верхнего регистра).

    Если функцию вызвать для той переменной типа CString, которая связана с полем со списком, то следующий вызов UpdateData() с параметром FALSE приведет к тому, что символы в области значений поля со списком преобразуются в прописные. Хотя такое вероятно можно считать досадной случайностью, все же подобное поведение приложения скорее всего нежелательно. Именно поэтому мы использовали в указанной функции дополнительную переменную типа CString. (Чтобы случайно не повредить переменную ассоциированную с полем со списком.)

    За вызовом функции преобразования всех символов строки в прописные размещается ряд условных операторов, сравнивающих строку с названием различных программ. Когда находится соответствие, вызывается функция WinExec(), выполняющая запуск приложения. Если теперь скомпилировать и запустить наше приложение, то в раскрывающемся списке можно выбрать одно из Windows-приложений и запустить его, щелкнув на кнопке Run program.

    Функция WinExec() - устаревшая функция Windows.Вместо нее нужно использовать функцию CreateProcess(). Однако функции CreateProcess() необходимо передать ряд параметров, смысл которых трудно понять тем программистам, кто только начинает программировать. Функция WinExec() все еще доступна и реализована в виде макрокоманды, вызывающей функцию CreateProcess(). Благодаря этому для запуска приложения системы Windows из нашего приложения можно использовать более простую функцию WinExec().

    Для запуска приложения системы Windows из нашего приложения можно использовать также еще одну API-функцию - ShellExecute(). Эта функция первоначально предназначалась для открытия и печати файлов, но может использоваться и для запуска другой программы.

    Откомпилируйте и запустите приложение.




    Проверил. приложение работает так как надо. Программы из комбинированного списка Combo Box тоже запускаются все три!.

    АВ:Здесь опять мы использовали интерактивную связь с пользователем. Пользователь выбирает из комбинированного списка нужное название программы, а мы программно при нажатии кнопки Run Program запускаем эту программу на исполнение. При этом естественно происходит считывание данных из комбинированного списка и присвоение этих данных строковой переменной. Эта строковая переменная в дальнейшем используется для запуска программы.

    Вверх

    Резюме

    Сегодня мы научились :

  • использовать стандартные элементы управления в приложениях.
  • Мы научились объявлять переменные и связывать их с элементами управления.
  • а так же синхронизировать значения, хранящиеся в элементах управления и переменных.(То есть присваивать строковой переменной значение введенное пользователем интерактивно в элемент управления - например в Combo Box или Edit Box ).
  • Научились отыскивать элементы управления по их идентификатору.
  • Научились рассматривать элементы управления как окна и обращаться к ним как к окнам.
  • Научились в диалоговом окне определять порядок перехода от одного элемента к другому по клавише табуляции(порядок переноса фокуса) .
  • Научились добавлять к элементам управления функции, выполняющие различные действия в процессе взаимодействия пользователя с элементами управления.
  • Наконец мы научились из своего собственного приложения запускать другие приложения Windows.


    Вверх

    Вопросы и ответы

    Вверх

    Упражнения
    1. Добавьте код к кнопке Default Message чтобы отобразить Enter a Message here в окне редактирования.
    2. Добавьте код чтобы включать, отключать, отображать, скрывать элементы управления, предназначенные для выбора и запуска других приложений.
    3. Усовершенствуйте функцию OnBnClickedRunprg() чтобы пользователь мог ввести имя любой программы и запустить ее.
    Заметки

    Назад | Вверх |
    Содержание

    Hosted by uCoz