На этом шаге мы рассмотрим функцию, используемую для отображения окна поверх всех окон.
Диалоговое окно Select Fund считается ключевым элементом пользовательского интерфейса приложения STUpload. Оно постоянно находится на виду для переключения от одной ценной бумаги к другой при просмотре данных из файла. Однако сейчас это окно становится невидимым, если пользователь щелкает главное окно приложения (например при обращении к основному меню). Из-за своих небольших размеров диалоговое окно Select Fund может быть скрыто другим большим по размеру окном.
Решают эту проблему достаточно просто - задают отображение диалового окна Select Fund всегда поверх остальных окон. Тогда оно не исчезает даже при отсутствии в нем фокуса ввода.
Отображаемое поверх остальных окно имеет стиль WS_EX_TOPMOST. В MFC-приложении для установки этого стиля надо вызвать функцию CWnd::SetWindowPos() с адресом константы wndTopMost в качестве первого параметра.
m_wndFundDialog.Create(IDD_FUNDDIALOG);
m_wndFundDialog.SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
Рис.1. Добавление строки
Этого достаточно, чтобы диалоговое окно Select Fund всегда отображалось поверх главного окна приложения. К сожалению, у этого свойства есть нежелательный побочный эффект. Дело в том, что такое диалоговое окно перекрывает окна других приложений, даже когда приложение STUpload неактивно. Если Вы соберете и запустите приложение, то увидите, что диалоговое окно Select Fund остается видимым и после сворачивания приложения STUpload.
Для решения этой проблемы необходимо скрыть диалоговое окно (если оно видимо), когда приложение в целом теряет фокус ввода, а затем показывать его вновь, когда фокус возвращается в приложение. Для этого нужно обработать сообщение WM_ACTIVATEAPP, возникающее при переключении между приложениями. Обработчик, перегружающий метод CWnd:: OnActivateApp(), создадим средствами ClassWizard. Эта функция вызывается каркасом и получает от него булев параметр, свидетельствующий об активности приложения.
if( bActive ) { if( AreFundsVisible()) m_wndFundDialog.ShowWindow( SW_SHOW ); } else { if( AreFundsVisible()) m_wndFundDialog.ShowWindow( SW_HIDE ); }
Рис.2. Добавление кода
Текст измененного приложения можно взять здесь (60,2 Кб).
На следующем шаге мы рассмотрим отображение данных приложения STUpload.