Приложение STUpload. Отображение окна Select Fund поверх остальных окон

   
На этом шаге мы рассмотрим функцию, используемую для отображения окна поверх всех окон.

   
Диалоговое окно Select Fund считается ключевым элементом пользовательского интерфейса приложения STUpload. Оно постоянно
находится на виду для переключения от одной ценной бумаги к другой при просмотре данных из файла. Однако сейчас
это окно становится невидимым, если пользователь щелкает главное окно приложения (например при обращении к
основному меню). Из-за своих небольших размеров диалоговое окно Select Fund может быть скрыто другим
большим по размеру окном.

   
Решают эту проблему достаточно просто - задают отображение диалового окна Select Fund всегда поверх
остальных окон. Тогда оно не исчезает даже при отсутствии в нем фокуса ввода.

   
Отображаемое поверх остальных окно имеет стиль WS_EX_TOPMOST. В MFC-приложении для
установки этого стиля надо вызвать функцию CWnd::SetWindowPos() с адресом константы wndTopMost
в качестве первого параметра.

  • Отображение диалогового окна Select Fund поверх остальных окон.
  • На вкладке ClassView дважды щелкните значок функции CMainFrame::OnCreate(), чтобы открыть
    редактор кода.
  • В конце функции сразу после строки:
      m_wndFundDialog.Create(IDD_FUNDDIALOG);
    

    и перед оператором return добавьте следующую строку:

      m_wndFundDialog.SetWindowPos(&wndTopMost, 0, 0, 0, 
                  0, SWP_NOMOVE|SWP_NOSIZE);
    


    Рис.1. Добавление строки

   
Этого достаточно, чтобы диалоговое окно Select Fund всегда отображалось поверх главного окна приложения.
К сожалению, у этого свойства есть нежелательный побочный эффект. Дело в том, что такое диалоговое окно
перекрывает окна других приложений, даже когда приложение STUpload неактивно. Если Вы соберете и
запустите приложение, то увидите, что диалоговое окно Select Fund остается видимым и после сворачивания
приложения STUpload.

   
Для решения этой проблемы необходимо скрыть диалоговое окно (если оно видимо), когда приложение в целом теряет
фокус ввода, а затем показывать его вновь, когда фокус возвращается в приложение. Для этого нужно обработать
сообщение WM_ACTIVATEAPP, возникающее при переключении между приложениями. Обработчик,
перегружающий метод CWnd:: OnActivateApp(), создадим средствами ClassWizard. Эта функция
вызывается каркасом и получает от него булев параметр, свидетельствующий об активности приложения.

  • Добавление обработчика сообщения WM_ACTIVATEAPP.
  • Нажмите CTRL+W, чтобы открыть ClassWizard. Щелкните вкладку Message Maps.
  • В списке Class Name выберите CMainFrame.
  • В списке Object IDs щелкните CMainFrame.
  • В списке Messages выберите WM_ACTIVATEAPP.
  • Щелкните Add Function.
  • Щелкните Edit Code. Откроется файл MainFrm.cpp, и курсор будет установлен в начало функции.
  • Реализация функции CMainFrame::OnActivateApp().
  • В теле функции OnActivateApp() после вызова версии базового класса добавьте следующий код:
    if( bActive )
    {
      if( AreFundsVisible()) 
    	m_wndFundDialog.ShowWindow( SW_SHOW );
    }
    else
    {
       if( AreFundsVisible()) 
    	m_wndFundDialog.ShowWindow( SW_HIDE );
    }
    


    Рис.2. Добавление кода

  • Соберите приложение и убедитесь, что диалоговое окно Select Fund перекрывает окно приложения
    STUpload и исчезает, как только фокус ввода перемещается в другое приложение.

       
    Текст измененного приложения можно взять здесь (60,2 Кб).

       
    На следующем шаге мы рассмотрим отображение данных приложения STUpload.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий