Главная страница
Навигация по странице:

  • 3.2.1. Приложение с главным меню, панелью инструментов

  • Win32 api программирование


    Скачать 0.78 Mb.
    НазваниеWin32 api программирование
    Дата02.02.2018
    Размер0.78 Mb.
    Формат файлаpdf
    Имя файлаitmo426.pdf
    ТипУчебное пособие
    #35685
    страница7 из 8
    1   2   3   4   5   6   7   8
    3.2. Строка состояния
    Строка состояния (status bar) – дочернее окно, расположенное в нижней части главного окна приложения и предназначенное для вывода информации о состоянии программы или о выполняемых операциях. Ши- рина строки равна ширине клиентской области родительского окна, а вы-

    74
    сота устанавливается на основе метрик шрифта, выбранного по умолча- нию в контексте устройства элемента управления.
    Для создания строки состояния служит функция
    CreateStatusWindow(), которая имеет следующий прототип:
    HWND CreateStatusWindow(
    LONG style,
    //стиль – должны быть включены флаги
    //WS_CHILD
    |
    WS_VISIBLE
    LPCTSTR lpszText, //текст для первой области status bar
    HWND hWndParent, //идентификатор родительского окна
    UINT wID
    //идентификатор status bar
    );
    Функция CreateStatusWindow() создает дочернее окно и вы- водит в окно строки состояния текст, который задан вторым параметром lpszText
    . Возвращаемое значение функции при успешном ее заверше- нии – дескриптор строки состояния, а в противном случае – NULL.
    Строка состояния может работать в двух режимах:
    1) стандартном – строка состояния разбивается на несколько частей, для вывода в них текста или графической информации;
    2) упрощенном – строка состояния реализована как единый элемент, в который можно выводить только текстовую информацию.
    Переключение между режимами осуществляется при помощи со- общения SB_SIMPLE. Параметр lParam этого сообщения должен быть равен нулю, а параметр wParam может принимать следующие значения:
    TRUE – status bar переключается в упрощенный режим, FALSE – возвращается в стандартный режим. Например:
    SendMessage(hWndSb,SB_SETTEXT,0,
    Если строка состояния работает в стандартном режиме, то ее разде- ление на отдельные поля осуществляется посылкой сообщения
    SB_SETPARTS
    сразу после создания панели инструментов, например:
    SendMessage(hWndSb, SB_SETPARTS, 3, (LPARAM)ptWidth);
    Через параметр wParam передается количество полей, а через па- раметр lParam − адрес целочисленного массива, количество элементов которого равно количеству областей, на которые делится status bar.
    Элемент массива содержит значение ширины (в пикселях), отсчитывае- мой от левого края окна status bar до правой границы области, либо –1. В последнем случае правая граница области есть правая граница строки со- стояния.
    В любом поле строки состояния можно поместить и любой другой элемент управления, например индикатор процесса (progress bar). В этом случае необходимо знать клиентские координаты поля, которые можно получить посылкой сообщения SB_GETRECT, например:
    SendMessage(hWndSb, SB_GETRECT,2,(LPARAM)&rect);
    Параметр wParam − это номер поля, отсчитываемый от нуля, а lParam
    – адрес структуры типа RECT, принимающей координаты поля.
    Для записи текста в область строки состояния необходимо исполь- зовать сообщение SB_SETTEXT. Например:
    SendMessage(hWndSb,SB_SETTEXT,0,

    75
    (LPARAM)”\tStatus bar Part 1 ”); или
    SendMessage(hWndSb, SB_SETTEXT,1 | SBT_NOBORDERS,
    (LPARAM)””);
    Параметр wParam содержит номер области, которая может быть скомбинирована при помощи логической операции ИЛИ с одной из кон- стант, определяющих внешний вид области:
    • SBT_NOBORDERS – поле рисуется без рамки;
    • SBT_POPOUT – поле рисуется с выпуклой рамкой;
    • SBT_OWNERDRAW – текст (или графическое изображение) рисуется родительским окном во время обработки сообщения
    WM_DRAWITEM
    Параметр lParam содержит указатель на строку текста с нулевым символом в конце, которая должна быть записана в область. Текстовая строка может быть пустой. Для выравнивания текста по центру или по правому краю необходимо включить в текстовую строку символ табуля- ции \t. Текст, расположенный после первого символа табуляции, вырав- нивается по центру, после второго– по правому краю области.
    Изменить высоту строки можно, послав сообщение
    SB_SETMINHEIGHT
    , например:
    SendMessage(hWndSb, SB_SETMINHEIGHT, minHeight, 0);
    Параметр wParam (minHeight) − минимальная высота окна строки состояния в пикселях, а значение параметра lParam должно быть равно нулю.
    При каждом изменении размеров родительского окна, т.е. при по- лучении сообщения WM_SIZE , оконная процедура главного окна должна отправить строке состояния такое же сообщение (WM_SIZE), передав те- кущее значение параметров wParam и lParam, например:
    SendMessage(hWndSb, WM_SIZE, wParam, lParam);
    Необходимо отметить, что строка состояния занимает часть кли- ентской области главного окна приложения. Поэтому необходимо корректировать размеры и начало координат клиентской области при появлении строки состояния
    3.2.1. Приложение с главным меню, панелью инструментов
    и строкой состояния
    Модифицируем диалоговое окно, т.е. изменим шрифт в статическом элементе этого окна. Модификацию произведем в функции диалогового окна при обработки сообщения
    WM_INITDIALOG.
    Диалоговые окна бывают модальные(modal) и немодальные
    (modeless). Функция DialogBox создает и выводит на экран мо- дальное диалоговое окно по определенному шаблону.
    Для определения шаблона диалогового окна в файле ресурсов

    76
    необходимо в главном меню выполнить следующую команду
    Project->Add Resource->Dialog->New
    . В результате будет открыто окно редактора диалоговых окон.
    Проектирование шаблона диалогового окна начинается с уста- новки его свойств. Закончив проектирование шаблона его необходимо сохранить в файле описания ресурсов 1113.rc. Редактор присваивает шаблону идентификатор IDD_DIALOGBAR.
    Файлы resource.h и 1113.rc аналогичны файлам приложе- ния листинг 3.1.1.
    /*Файл 1113.cpp*/
    /*#define UNICODE
    #ifdef UNICODE
    #define _UNICODE
    #endif
    */
    #define STRICT
    #include
    #include
    #include
    /*
    Файл tchar.h состоит из макросов, которые ссылаются на UNICODE данные и функции, если определен макрос UNICODE, и на ANSI данные и функции, если этот макрос не определен, кроме того он полностью заменяет файл string.h
    */
    #include
    #include "resource.h"
    /*
    Идентификаторы пунктов меню приведены для наглядности, лучше всего их повестить в файл resource.h
    */
    #define ID_FILE_TEST 40001
    #define ID_FILE_EXIT 40002
    #define ID_HELP_ABOUT 40003
    /*
    Идентификаторы панели инструментов и строки состояния
    */
    #define IDT_TOOLBAR 400
    #define IDS_STATUSBAR 401
    #define PartN 3
    /*Прототип оконной функции*/
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    /*Прототип функции модального диалога*/
    INT_PTR CALLBACK AboutProc(HWND, UINT, WPARAM, LPARAM);
    /*
    Прототип функция обратного вызова обработки сообщений от таймера
    */
    VOID CALLBACK TimerProc(HWND,UINT,UINT_PTR,DWORD);
    /*
    Прототип функции получения текущего времени и преобразование его в символы
    */ void OutTimeDate(HWND);
    /*

    77
    Дескрипторы всплывающих меню и дескриптор главного меню
    */
    HMENU hFileMenu,hHelpMenu,hMenu;
    /*
    Дескрипторы панели инструментов и строки состояния
    */
    HWND hWndSb,hWndTb;
    /*Массив для формирования строки - текущие дата и время*/
    TCHAR szCurrentTime[40];
    /*Однократный интервал 5с*/
    int nTime=5;
    /*Массив структур типа TBBUTTON*/
    TBBUTTON tBb[]=
    {
    {0,ID_FILE_TEST,TBSTATE_ENABLED,TBSTYLE_BUTTON,0L,0},
    {1,ID_FILE_EXIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0L,0},
    {0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0L,1},
    {2,ID_HELP_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0L,0}
    }; int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    /* Произвольное имя класса */
    TCHAR szWindowClass[]=_TEXT("QWERTY");
    /* Произвольный заголовок окна */
    TCHAR szTitle[]=_TEXT("ИТМО");
    /*
    Структурная переменная Msg типа MSG для получения сообще- ний Windows
    */
    MSG msg;
    /*
    Cтруктурная переменная wcex типа WNDCLASSEX для задания характеристик окна
    */
    WNDCLASSEX wcex;
    HWND hWnd;
    //Дескриптор главного окна
    /*
    Проверяем, было ли это приложение запущено ранее.
    */ if(hWnd=FindWindow(szWindowClass,NULL))
    {
    /*
    Поверяем, было ли это окно свернуто в пиктограмму.
    */ if(IsIconic(hWnd))
    ShowWindow(hWnd,SW_RESTORE);
    /*
    Выдвигаем окно приложения на передний план
    */
    SetForegroundWindow(hWnd); return
    FALSE;
    }
    /*Обнуление всех членов структуры wcex*/ memset(&wcex,0,sizeof(WNDCLASSEX));
    /*Регистрируем класс главного окна*/

    78
    wcex.cbSize = sizeof(WNDCLASSEX); wcex.style =
    CS_HREDRAW | CS_VREDRAW;
    /*
    Определяем оконную процедуру для главного окна
    */ wcex.lpfnWndProc=
    (WNDPROC)WndProc;
    //wcex.cbClsExtra
    =
    0;
    //wcex.cbWndExtra
    =
    0; wcex.hInstance
    = hInstance;
    //Дескриптор приложения
    /*
    Стандартная пиктограмма, которую можно загрузить
    Функцией LoadImage().
    */ wcex.hIcon = (HICON)LoadImage(hInstance,
    IDI_APPLICATION, IMAGE_ICON,32,32,0);
    /*Стандартный курсор мыши*/ wcex.hCursor
    =
    LoadCursor(NULL, IDC_ARROW);
    /*
    Кисть фона и ее цвет можно определить выражениями: wcex.hbrBackground=(HBRUSH)(COLOR_APPWORKSPACE+1); wcex.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); или с помощью макроса GetStockBrush(), в этом случае необходимо подключить файл windowsx.h
    */ wcex.hbrBackground=GetStockBrush(LTGRAY_BRUSH);
    //wcex.lpszMenuName
    =
    MAKEINTRESOURCE(IDC_MSG_1);
    /*Имя класса главного окна*/ wcex.lpszClassName
    = szWindowClass; wcex.hIconSm
    = NULL;
    /* или так LoadIcon(wcex.hInstance,
    MAKEINTRESOURCE(IDI_SMALL));*/ if(!RegisterClassEx(&wcex)) return
    FALSE;
    /*
    Инициализация библиотеки Common Control Library
    */
    INITCOMMONCONTROLSEX iCc; iCc.dwSize=sizeof(INITCOMMONCONTROLSEX); iCc.dwICC=ICC_WIN95_CLASSES;
    InitCommonControlsEx(&iCc);
    /*Создаем главное окно и делаем его видимым*/ hWnd = CreateWindowEx(WS_EX_WINDOWEDGE,szWindowClass, szTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,0,CW_USEDEFAULT,0,
    NULL, NULL, hInstance, NULL); if
    (!hWnd) return
    FALSE;
    /*
    Исследуем адресное пространство приложения. Выведем содержимое сегментных регистров команд, данных и стека, а также смещение главной функции и строки с именем класса
    */
    TCHAR szAsm[80];
    USHORT regCS,regDS,regES,regSS;
    __asm{ mov regCS,CS mov regDS,DS

    79
    mov regES,ES mov regSS,SS
    } wsprintf((LPTSTR)szAsm,_T("CS=%X,DS=%X\nES=%X,SS=%X\n
    WinMain=%X\nszWindowClass=%X"), regCS,regDS,regES,regSS);
    MessageBox(NULL,(LPCTSTR)szAsm,_T("Регистры"),
    MB_ICONINFORMATION);
    /*
    Создаем пустое всплывающее меню самого низкого уровня hFileMenu=CreatePopupMenu()и добавляем в него конечный элемент "Test"
    */
    AppendMenu((hFileMenu=CreatePopupMenu()),
    MF_ENABLED | MFT_STRING,
    ID_FILE_TEST, _TEXT("&Test"));
    /*
    Добавляем в созданное меню конечный элемент "Exit"
    */
    AppendMenu(hFileMenu,MF_GRAYED | MFT_STRING,
    ID_FILE_EXIT,_TEXT("&Exit"));
    /*
    Создаем пустое всплывающее меню самого низкого уровня hHelpMenu=CreatePopupMenu()и добавляем в него конечный элемент "About"
    */
    AppendMenu((hHelpMenu=CreatePopupMenu()),
    MF_ENABLED|MFT_STRING,
    ID_HELP_ABOUT,_TEXT("&About"));
    /*
    Создаем меню верхнего уровня - главное меню hMenu=CreateMenu()и присоединяем созданное
    Подменю "File" к главному меню"
    */
    AppendMenu((hMenu=CreateMenu()),
    MF_ENABLED | MF_POPUP,
    (UINT_PTR)hFileMenu, _TEXT("&File"));
    /*
    Присоединяем созданное подменю "Help" к главному
    Меню
    */
    AppendMenu(hMenu,MF_ENABLED|MF_POPUP,
    (UINT_PTR)hHelpMenu,_TEXT("&Help"));
    /
    *Добавляем в конец главного меню конечный пункт "QUIT"
    */
    AppendMenu(hMenu,MF_GRAYED,(UINT_PTR)11,
    _TEXT("Quit"));
    /*Присоединяем созданное меню к окну приложения*/
    SetMenu(hWnd,hMenu);
    /*Делаем окно видимым на экране*/
    ShowWindow(hWnd, SW_SHOWNORMAL);
    /*
    Функция UpdateWindow() вызывает передачу сообщения WM_PAINT непосредственно оконной процедуре, а функция InvalidateRect()вызывает постановку сообщения WM_PAINT в очередь приложения, а там оно обрабатывается с самым низким приоритетом
    */

    80
    UpdateWindow(hWnd);
    /*Отображаем меню*/
    DrawMenuBar(hWnd);
    /*Цикл обработки сообщений*/ while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    /*Код возврата*/ return
    (int)msg.wParam;
    }
    /*Оконная функция главного окна*/
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
    WPARAM wParam,
    LPARAM lParam)
    { int xSize=500; int ySize=300;
    /* PAINTSTRUCT - структура с характеристиками рабочей области (заполняется функцией BeginPaint)
    */
    PAINTSTRUCT ps;
    /*
    TEXTMETRIC - структура для получения характеристик шрифта.
    */
    TEXTMETRIC tm;
    /*
    LOGFONT - структура для для создания логических шрифтов.
    */
    LOGFONT lf;
    /*Будет создан логический шрифт*/
    Static
    HFONT hFont,hOldFont;
    /*
    RECT–структура,определяющая прямоугольник.
    */
    RECT rect,rcSb,rcTb;
    HDC hDc;
    /*
    Высота панели инструментов HeightTb и вывсота строки состояния HeightSb в пикселях.
    */ static
    UINT
    HeightSb,HeightTb;
    /*
    Ширина width и высота height клиентской области окна в пикселях.
    */
    UINT width,height;
    /*Массив ширин для StatusBar*/ int aWidth[PartN],; int SbWidth;
    LPTSTR lpszFace=_TEXT("Times New Roman Cyr"); switch (message)
    { case
    WM_CREATE:
    /*
    Только здесь можно произвести модификацию класса окна
    Например
    ,
    SetClassLong(hWnd, GCL_HBRBACKGROUND,
    (LONG)CreateSolidBrush(RGB(200,160,255));

    81
    Значение дескриптор экземпляра приложения (hInstance) определяется, вызовом одной из следующих функций: hInst = GetModuleHandle(NULL); hInst = (HINSTANCE)GetClassLong(hWnd,GCL_HMODULE);
    */
    /*Обнуление всех членов структуры lf*/ memset(&lf,0,sizeof(lf));
    /*Устанавливаем размер шрифта*/ lf.lfHeight=30;
    /*Копируем в структуру имя шрифта*/ lstrcpy(lf.lfFaceName,lpszFace);
    /*Создаем шрифт*/ hFont=CreateFontIndirect(&lf);
    /*Первый немедленный вывод текущего времени*/
    OutTimeDate(hWnd);
    /*
    Функция SetTimer создает системный таймер с периодом 1с
    */
    SetTimer(hWnd,1,1000,(TIMERPROC)NULL);
    /*Создаем панель инструментов ToolBar*/ hWndTb=CreateToolbarEx(hWnd,
    WS_CHILD|WS_VISIBLE|WS_BORDER|TBSTYLE_TOOLTIPS,
    IDT_TOOLBAR,
    3,
    GetModuleHandle(NULL),
    IDR_TOOLBAR1,
    (LPCTBBUTTON)tBb,
    4,
    0,0,
    0,0, sizeof(TBBUTTON)); if(hWndTb==NULL) return
    FALSE;
    /*
    Определяем размеры прямоугольника ToolBar в экранных координатах(пикселях).
    */
    GetWindowRect(hWndTb,&rcTb);
    /* Высота ToolBar в пикселях.*/
    HeightTb=rcTb.bottom-rcTb.top;
    /*Создаем Statusbar*/ hWndSb=CreateStatusWindow(WS_CHILD|WS_VISIBLE,
    (LPTSTR)"
    ", hWnd,
    IDS_STATUSBAR); if(hWndSb==NULL) return
    FALSE;
    /*
    Определяем размеры прямоугольника StatusBar в экранных координатах(пикселях).
    */
    GetWindowRect(hWndSb,&rcSb);
    /* Высота StatusBar в пикселях */
    HeightSb=rcSb.bottom-rcSb.top; return
    TRUE; case
    WM_TIMER:
    /*
    Функция OutTimeDate запрашивает у системы текущие значения даты и времени, а затем организует

    82
    их обработку в главном окне приложения
    */
    OutTimeDate(hWnd); break; case
    WM_KEYDOWN: switch(wParam)
    /*Обрабатываем сообщение-нажатие клавиши*/ switch(wParam)
    { case
    VK_ESCAPE:
    /*
    Посылаем сообщение WM_CLOSE окну (hWnd), после того, как оконная процедура обработает это сооб- щение, система передаст управление инструкции следующей за SendMessage
    */
    SendMessage(hWnd,WM_CLOSE,0,0); break;
    } break; case
    WM_COMMAND: switch(LOWORD(wParam))
    //switch(wParam)
    { case ID_FILE_TEST:
    /*
    Изменяем статус пункта меню ID_FILE_EXIT
    */
    EnableMenuItem(hFileMenu,ID_FILE_EXIT,
    MF_BYCOMMAND|MF_ENABLED);
    /*Ставим отметку на пункте меню ID_FILE_TEST*/
    CheckMenuItem(hFileMenu,ID_FILE_TEST,
    MF_BYCOMMAND|MF_CHECKED);
    /*Изменяем статус пункта главного меню "QUIT"*/
    EnableMenuItem(GetMenu(hWnd),
    (UINT_PTR)11,MF_BYCOMMAND|MF_ENABLED);
    /*
    Так как изменился статус пункта главного меню, вызываем функцию DrawMenuBar для повторного отображения изменившейся полосы меню
    */
    DrawMenuBar(hWnd);
    /*Устанавливаем таймер на nTime секунд*/
    SetTimer(hWnd,2,nTime*1000,
    (TIMERPROC)TimerProc); break; case ID_FILE_EXIT:
    /*
    Без запроса на закрытие окна - функция
    PostQuitMessage посылает сообщение WM_QUIT
    */
    PostQuitMessage(0);
    /*
    С запросом на закрытие, т.е. окно еще не разруше- но SendMessage(hWnd,WM_CLOSE,0,0);
    */ break; case
    ID_HELP_ABOUT:
    /*
    Функция DialogBox создает и выводит на экран мо- дальное диалоговое окно по шаблону IDD_ABOUTBOX, и

    83
    не возвращает управление в WndProc пока окно диало- ка не бедет закрыто
    */
    DialogBox(GetModuleHandle(NULL),
    MAKEINTRESOURCE(IDD_DIALOGBAR), hWnd, (DLGPROC)AboutProc); break; case (UINT)11:
    /*
    Без запроса на закрытие окна - функция
    PostQuitMessage посылает сообщение WM_QUIT
    */
    PostQuitMessage(0); break;
    } break; case
    WM_PAINT:
    /*Получаем контекст устройства*/ hDc
    =
    BeginPaint(hWnd,
    &ps);
    /*Выбираем в контест созданный шрифт*/ hOldFont=SelectFont(hDc,hFont);
    /*Получим метрики текста при необходимости*/
    GetTextMetrics(hDc,&tm);
    /*
    Определяем размеры клиентской области окна c учетом окна панели инструментов и окна строки состояния
    */
    GetClientRect(hWnd,&rect); rect.top+=HeightTb; rect.bottom-=HeightSb;
    /*
    Функция SetBkMode устанавливает текущий режим фона.
    TRANSPARENT - в этом режиме вывода текста цвет фона гра- фического элемента игнорируется, т.е. символ выводится на существующем фоне
    */
    SetBkMode(hDc,TRANSPARENT);
    /*
    Функция SetTextColor устанавливает цвет текста для кон- текста устройства, по умолчанию применяется черный цвет.
    Цвет текста синий!
    */
    SetTextColor(hDc,RGB(0,0,128));
    DrawText(hDc,szCurrentTime,-1,&rect,
    DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    /*Освобождаем контекст устройства*/
    EndPaint(hWnd,
    &ps); break; case
    WM_CLOSE:
    /*
    Сообщение WM_CLOSE появляется при щелчке на кнопке закрытия окна - здесь предназначено для вывода преду- преждающего сообщения
    */ if(MessageBox(hWnd,_T("Вы уверены?"),
    _T("Предупреждение!"),
    MB_YESNO | MB_ICONQUESTION)==IDYES)
    {
    /*

    84
    Функция DestroyWindow разрушает указанное в ее па- раметре окно, т.е. она посылает окну сообщение
    WM_DESTROY. Затем вызывается функция
    PostQuitMessage, которая посылает сообщение WM_QUIT
    */
    DestroyWindow(hWnd);
    } break; case
    WM_SIZE:
    /*
    Ширина width и высота height клиентской области окна в пикселях.
    */ width=LOWORD(lParam); height=HIWORD(lParam);
    /*
    Изменяем размеры Toolbar в соответствии с новыми размерами окна,можно и так
    SendMessage(hWndTb,WM_SIZE,wParam,lParam);
    */
    SendMessage(hWndTb,TB_AUTOSIZE,0,0);
    /*
    Изменяем размеры Statusbar в соответствии с новыми размерами окна.
    */
    SendMessage(hWndSb,WM_SIZE,wParam,lParam);
    /*Рассчитывает размеры областей Statusbar*/
    SbWidth=width/PartN;; aWidth[0]=SbWidth; aWidth[1]=SbWidth*2; aWidth[2]=-1;
    /*Устанавливаем новые размеры областей Statusbar*/
    SendMessage(hWndSb,
    SB_SETPARTS,PartN,(LPARAM)aWidth);
    /*Инициализируем строкой 0-ю область Statusbar*/
    SendMessage(hWndSb,SB_SETTEXT,0,
    (LPARAM)_T("\tСПб ГУ ИТМО"));
    /*
    Инициализируем строкой 1-ю область Statusbar, поле рисуется без рамки
    */
    SendMessage(hWndSb,SB_SETTEXT,1
    |
    SBT_NOBORDERS,
    (LPARAM)_T("\tКафедра ПКС"));
    /*
    Клиентские координаты 2 поля можно определить так:
    SendMessage(hWndSb,SB_GETRECT,2,(LPARAM)&reSb);
    */ break; case
    WM_LBUTTONDOWN: if(wParam
    &
    MK_SHIFT)
    {
    MessageBox(hWnd,_T("Нажата клавиша\nShift"),
    _T("Уведомление!"),
    MB_OK
    |
    MB_ICONEXCLAMATION);
    } break; case
    WM_GETMINMAXINFO: lpmmi=(LPMINMAXINFO)lParam;

    85
    /*
    Минимальный и максимальный размеры окна совпадают
    */ lpmmi->ptMinTrackSize.x=xSize; lpmmi->ptMinTrackSize.y=ySize; lpmmi->ptMaxTrackSize.x=xSize; lpmmi->ptMaxTrackSize.y=ySize; break; case
    WM_DESTROY:
    /*
    Функция DeleteObject удаляет логический объект. К удаляе- мым объектам относятся перья, растровые изображения, кис- ти, области, палитры и шрифты.
    */
    /*Удаляем созданный шрифт*/
    DeleteObject(hFont);
    /*Функция KillTimer удаляет таймер*/
    KillTimer(hWnd,1);
    /*
    PostQuitMessage() выполняет только одно действие - ставит в очередь сообщение WM_QUIT. Параметр у этой функции - код возврата, который помещается в wParam
    */
    PostQuitMessage(0); break; default:
    /*Обработка прочих сообщений по умолчанию*/ return
    DefWindowProc(hWnd, message,wParam,lParam);
    } return
    0L;
    }
    /*Оконная функция диалогового окна*/
    INT_PTR CALLBACK AboutProc(HWND hDlg, UINT message,
    WPARAM wParam, LPARAM lParam)
    { static
    HWND hStatic;
    /*Объявление экземпляра структуры LOGFONT с одновременной инициализацией ее полей нулями*/ static
    LOGFONT lf1; static HFONT hFont3;
    /*Имя шрифта для элемента управления IDC_STATIC_1 в диалоговом окне */
    LPTSTR lpszFace1=_TEXT("Times New Roman Cyr"); switch (message)
    { case
    WM_INITDIALOG:
    /*Дескриптор элемента управления в диалого- вом окне (hDlg) получаем по его идентифика- тору (hDlg),вызывая функцию GetDlgItem*/ hStatic=GetDlgItem(hDlg,IDC_STATIC_1);
    /*Устанавливаем размер шрифта*/ lf1.lfHeight=23;
    /*Копируем в структуру имя шрифта*/ lstrcpy(lf1.lfFaceName,lpszFace1);
    /*Создаем шрифт*/ hFont3=CreateFontIndirect(&lf1);

    86
    /*Модифицируем шрифт элемента hStatic*/
    SendMessage(hStatic,WM_SETFONT,
    (WPARAM)hFont3,TRUE);
    /*
    Для обрабатываемых сообщений процедура всегда возвращает TRUE
    */ return (INT_PTR)TRUE; case
    WM_COMMAND: if(LOWORD(wParam)==IDOK || LOWORD(wParam)==
    IDCANCEL)
    {
    DeleteObject(hFont3);
    EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE;
    } break;
    }
    /*
    Для не обрабатываемых сообщений процедура всегда возвращает FALSE.
    */ return (INT_PTR)FALSE;
    }
    /
    *Функция получения текущего времени и преобразование его в символы
    */ void OutTimeDate(HWND hWnd)
    {
    LPTSTR szDay[]={_T("Вск."),_T("Пнд."),_T("Втр."),
    _T("Ср."),_T("Чтв."),
    _T("Птн."),_T("Суб.")
    };
    LPTSTR szMonth[]={_T(""),_T("Янв."),_T("Февр."),
    _T("Март"),_T("Апр."),
    _T("Май"),_T("Июнь"),
    _T("Июль"),_T("Авг."),
    _T("Сент."),_T("Окт."),
    _T("Нояб."),_T("Дек.")
    };
    TCHAR szT[20];
    SYSTEMTIME SystemTime;
    /*
    Функция GetLocalTime осуществляет выборку местного време- ни,на которое настроен компьютер, т.е. функция заполняет структуру типа SYSTEMTIME в числовом виде.
    */
    GetLocalTime(&SystemTime);
    /*День недели*/ lstrcpy(szCurrentTime, szDay[SystemTime.wDayOfWeek]);
    /*Разделяющий пробел*/ lstrcat((LPTSTR)szCurrentTime,_T(" "));
    /*Месяц*/ lstrcat((LPTSTR)szCurrentTime, szMonth[SystemTime.wMonth]);
    /*Разделяющий пробел*/

    87
    lstrcat((LPTSTR)szCurrentTime,_T("
    "));
    /*Дату переводим в символы*/ wsprintf((LPTSTR)szT,_T("%d"),
    SystemTime.wDay); lstrcat((LPTSTR)szCurrentTime,(LPTSTR)szT);
    /*Разделяющий пробел*/ lstrcat((LPTSTR)szCurrentTime,_T("
    "));
    /*Год переводим в символы*/ wsprintf((LPTSTR)szT,_T("%d"),
    SystemTime.wYear); lstrcat((LPTSTR)szCurrentTime,(LPTSTR)szT); lstrcat((LPTSTR)szCurrentTime,_T("---"));
    /*Часы переводим в символы*/ wsprintf((LPTSTR)szT,_T("%d"),
    SystemTime.wHour); lstrcat((LPTSTR)szCurrentTime,(LPTSTR)szT);
    /*Разделяющее двоеточие*/ lstrcat((LPTSTR)szCurrentTime,_T(":"));
    /*Минуты переводим в символы*/ wsprintf((LPTSTR)szT,_T("%d"),
    SystemTime.wMinute); lstrcat((LPTSTR)szCurrentTime,(LPTSTR)szT);
    /*Разделяющее двоеточие*/ lstrcat((LPTSTR)szCurrentTime,_T(":"));
    /*Секунды переводим в символы*/ wsprintf((LPTSTR)szT,_T("%d"),
    SystemTime.wSecond); lstrcat((LPTSTR)szCurrentTime,(LPTSTR)szT);
    /*Перерисовка окна*/
    InvalidateRect(hWnd,NULL,TRUE);
    }
    /*Функция обратного вызова обработки сообщений от таймера*/
    VOID CALLBACK TimerProc(HWND hWnd,UINT uMsg,
    UINT_PTR idEvent,DWORD dwTime)
    {
    TCHAR szTimer[100];
    KillTimer(hWnd,2); wsprintf(szTimer,
    _T("С момента выбора\nпункта меню Test\nпрошло %d c!"), nTime);
    MessageBox(NULL,(LPCTSTR)szTimer,
    _T("Предупреждение"),MB_ICONHAND);
    }
    Результат работы программы представлен на рис. 5.

    88
    Рис. 5. Окно приложения с главным меню, панелью инструментов и строкой состояния

    89
    П Р И Л О Ж Е Н И Е
    1   2   3   4   5   6   7   8


    написать администратору сайта