Программирование для Windows NT (том 2)

Функция WndProc_OnCommand


Функция WndProc_OnCommand обрабатывает сообщение WM_COMMAND, поступающее от главного меню приложения. Для обработки мы использовали макрокоманду HANDLE_MSG, описанную в предыдущем томе “Библиотеки системного программиста”.

Если пользователь выберет из меню File строку Convert, будет выполняться преобразование файла. Для этого функция WndProc_OnCommand вызовет функцию StartConversion, передав ей в качестве единственного параметра идентификатор главного окна приложения.

При выборе из меню File строки Options приложение выведет на экран диалоговую панель Conversion Options, вызвав для этого функцию DialogBox:

DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);

Диалоговая панель имеет идентификатор IDD_DIALOG1 и определена в файле описания ресурсов приложения.


Эта функция обрабатывает сообщение WM_COMMAND, поступающее от главного меню приложения.

Выбирая строки меню Options, вы можете изменить внешний вид окна органа управления List View, выбрав один из четырех режимов отображения. Соответствующие процедуры мы описали в 22 томе “Библиотеки системного программиста”.




Эта функция обрабатывает сообщение WM_COMMAND, которое приходит от главного меню приложения.

Когда пользователь выбирает из меню File строку Find App Window, с помощью функции DialogBox на экран выводится диалоговая панель, предназначенная для ввода заголовка окна, которое нужно найти.

Если пользователь ввел заголовок и нажал в диалоговой панели кнопку OK, функция WndProc_OnCommand выполняет поиск окна, вызывая соответствующую функцию из DLL-библиотеки DLLDemo.DLL, исходные тексты которой мы только что рассмотрели.



В листинге мы подготовили два способа подключения DLL-библиотеки - прямой с использованием библиотеки экспорта и динамический.

Первый способ достаточно прост, однако предполагает, что в проект приложения DLLCALL будет включен файл библиотеки экспорта DLLDemo.LIB. Этот файл создается автоматически системой Microsoft Visual C++ при сборке проекта DLL-библиотеки.

Фрагмент кода, использующий прямое подключение, закрыт в листинге 3.4 символами комментария:

if(FindApplicationWindow(szWindowTitle) != NULL)

  MessageBox(NULL, "Application window was found",

    szAppTitle, MB_OK | MB_ICONINFORMATION);

else

  MessageBox(NULL, "Application window was not found",

    szAppTitle, MB_OK | MB_ICONINFORMATION);

В этом фрагменте мы выполняем простой вызов функции FindApplicationWindow, определенной в DLL-библиотеке DLLDemo.DLL. Прототип функции FindApplicationWindow мы поместили в файл dllcall.h.

Второй фрагмент загружает DLL-библиотеку при помощи функции LoadLibrary, а в случае успеха затем получает указатель на функцию FindApplicationWindow. Для получения указателя здесь применяется функция GetProcAddress:

hDLL = LoadLibrary("DLLDEMO.DLL");

if(hDLL != NULL)

{

  GetAppWindow =

   (MYDLLPROC)GetProcAddress(hDLL, "FindApplicationWindow");

  if(GetAppWindow != NULL)

  {

    if(GetAppWindow(szWindowTitle) != NULL)

      MessageBox(NULL, "Application window was found",

        szAppTitle, MB_OK | MB_ICONINFORMATION);




Функция WndProc_OnCommand обрабатывает сообщение WM_COMMAND, поступающее в функцию главного окна приложения от меню.

Для установки текущего набора национальных символов в этой функции используется описанная нами ранее функция SetThreadLocale, а также макрокоманды MAKELCID и MAKELANGID:

fRc = SetThreadLocale(MAKELCID(

  MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), SORT_DEFAULT));

Для получения значений отдельных национальных параметров мы вызываем функцию GetLocaleInfo:

GetLocaleInfo(GetThreadLocale(), LOCALE_SLANGUAGE,

  szBuf1, 512);

В качестве идентификатора набора национальных параметров мы указываем идентификатор текущего набора параметров для основной задачи приложения, полученный от функции GetThreadLocale.

Имя текущей раскладки клавиатуры определяется при помощи функции GetKeyboardLayoutName:

GetKeyboardLayoutName(szKbLayoutName);

Для получения форматированной текстовой строки даты и времени мы вызываем функции GetDateFormat и GetTimeFormat:

GetDateFormat(GetThreadLocale(),

  LOCALE_NOUSEROVERRIDE | DATE_LONGDATE,

  NULL, NULL, szBuf1, 512);

GetTimeFormat(GetThreadLocale(),

  LOCALE_NOUSEROVERRIDE,  NULL, NULL, szBuf1, 512);



Содержание раздела