Win32 api программирование
Скачать 0.78 Mb.
|
3.1. Панель инструментов Панель инструментов – это дочернее окно, расположенное под ме- ню приложения, содержащее одну или несколько кнопок. Сами по себе кнопки не являются окнами. Они имеют одинаковые размеры и реализо- ваны как графические объекты на поверхности окна панели инструмен- тов. Традиционно кнопки панели инструментов соответствуют некото- рым пунктам меню приложения, т.е. индентификаторы кнопок совпадают с идентификаторами дублируемых пунктов меню. Кнопка, выбранная на панели инструментов, посылает сообщение WM_COMMAND родительскому окну. Кнопка может содержать, кроме изображения, текстовую метку, которая может находиться правее или ниже картинки. Как правило, кноп- ки на панели инструментов содержат только растровые изображения, а их назначение поясняется с помощью всплывающих окон подсказок. Кроме кнопок, панель инструментов может содержать и другие до- черние окна элементов управления, например комбинированный список (combo box). Встроенные элементы управления создаются с помощью функции CreateWindowEx(). 59 Для добавления к приложению панели инструментов необходимо выполнить следующие действия: 1) определить ресурс растрового образа панели инструментов; 2) объявить и инициализировать массив структур типа TBBUTTON, со- держащий информацию о кнопках панели инструментов; 3) вызвать функцию CreateToolBarEx() для создания и инициа- лизации панели инструментов. Для определения ресурса растрового образа панели инструментов необходимо в главном меню Visual Studio выполнить команду Project −> Add Resource −> Toolbar и нажать кнопку New. В результате будет открыто окно редактора панели инструментов. Для создаваемой кнопки следует нарисовать картинку и определить идентификатор кноп- ки. Если кнопка дублирует некоторый пункт меню, то идентификатор кнопки должен быть таким же, как у этого пункта. Закончив проектирование панели инструментов, необхо- димо сохранить растровый образ в файле описания ресурсов(.rc) (будет также создан файл toolbar1.bmp). По умолчанию редактор присваива- ет растровому образу панели инструментов идентификатор IDR_TOOLBAR1. Если открыть файл(1112.rc) в текстовом режиме, то можно увидеть следующее определение панели инструментов: /////////////////////////////////////////////////////////// // // Toolbar // IDR_TOOLBAR1 TOOLBAR 16, 15 BEGIN BUTTON ID_BUTTON40001 BUTTON ID_BUTTON40002 BUTTON ID_BUTTON40003 END /////////////////////////////////////////////////////////// // // Bitmap // IDR_TOOLBAR1 BITMAP "toolbar1.bmp" /////////////////////////////////////////////////////////// Для создания панели инструментов перед вызовом функции CreateToolBarEx() необходимо заполнить массив структур типа TBBUTTON (объявление массива − TBBUTTON tbb [Num];). Структура TBBUTTON определена в файле commctrl.h следую- щим образом: typedef struct _TBBUTTON{ int iBitmap; //индекс изображения кнопки, а для //разделителей –нуль //(нумерация начинается с нуля) int idCommand; //идентификатор кнопки, который 60 //передается родительскому окну //с сообщением WM_COMMAND BYTE fsState; //флаг исходного состояния кнопки BYTE fsStyle; //стиль кнопки DWORD dwData; //дополнительные данные или 0L INT_PTR iString; //индекс текстовой метки, которую //необходимо написать на поверхности кнопки } TBBUTTON; Поле fsState структуры должно содержать флаг исходного со- стояния кнопки: • TBSTATE_CHECKED – кнопка (стиль TBSTYLE_CHECK), ис- пользуется для кнопок с фиксацией; • TBSTATE_PRESSED – кнопка любого стиля, изображается в нажатом состоянии; • TBSTATE_ENABLED – кнопка доступна, т.е. находится в раз- блокированном состоянии (реагирует на действие мышью), но если этот флаг не установлен, значит, кнопка заблокирована и отображается серым цветом; • TBSTATE_HIDDEN – скрытая кнопка (не отображается); • TBSTATE_INDETERMINATE – отображается серым цветом (не- доступна). • Поле fsStyle структуры может принимать комбинацию сле- дующих стилей: • TBSTYLE_BUTTON – стандартная кнопка, не может находиться в нажатом состоянии; • TBSTYLE_SEP – разделитель между группами кнопок, может использоваться для резервирования места для дочерних элемен- тов управления; • TBSTYLE_CHECK – кнопка с фиксацией, ведет себя как флажок (check box); • TBSTYLE_GROUP – стандартная кнопка, остается нажатой до тех пор, пока не нажата другая кнопка из той же группы, т.е. является членом группы кнопок переключателей (radio button); • TBSTYLE_CHECKGROUP – кнопка, объединяющая свойства стилей TBSTYLE_CHECK и TBSTYLE_GROUP. Поле dwData служит для передачи дополнительных данных. В противном случае в него можно записать нулевое значение. Содержание этого поля можно получить, послав сообщение TB_GETBUTTON. Поле iString содержит номер текстовой строки, которую необ- ходимо написать на поверхности кнопки (текстовая метка). В этом случае необходимо создать список текстовых строк и отправить сообщение TB_ADDSTRING, передав вместе с ним адрес буфера с текстовыми стро- ками (в параметре lParam). Строки в этом буфере должны заканчиваться двоичным нулем, а последняя строка – двумя двоичными нулями. Если текстовые строки не используются, в поле iString следует записать ну- левое значение. 61 Функция CreateToolBarEx() создает и инициализирует панель инструментов (перед первым вызовом этой функции необходимо вызвать функцию InitCommonControlsEx()). Прототип функции CreateToolBarEx(): HWND CreateToolBarEx( HWND hWnd, //дескриптор родительского окна DWORD ws, //стили панели инструментов UINT wID, //идентификатор панели инструментов int nBitmaps, //количество изображений кнопок HINSTANCE hInst, //дескриптор экземпляра //приложения UINT wBMID, //идентификатор ресурса растрового //образа LPCTBBUTTON lpButtons, //адрес массива структур //(TBBUTTON) int iNumButtons, //количество кнопок int dxButton, //ширина кнопок в пикселях int dyButtons, //высота кнопок в пикселях int dxBitmap, //ширина изображения кнопки в пикселях int dyBitmap, //высота изображения кнопки в пикселях UINT uSructSize //размер структуры }; Параметр ws определяет стили окна панели инструментов. Окно панели инструментов всегда является дочерним по отношению к создав- шему его окну. Поэтому параметр ws должен содержать флаг WS_CHILD. Для того чтобы окно панели инструментов было видимым и имело рамку, необходимо указать стили WS_VISIBLE и WS_BORDER, а для изменения внешнего вида панели инструментов − CCS ADJUSTABLE. Стиль TBSTYLE_TOOLTIPS задает поддержку всплывающих под- сказок для кнопок панели инструментов. Параметр wID должен содержать идентификатор панели инструментов. Можно использовать любой целочисленный идентификатор при условии, что его значение не сов- падает со значениями идентификаторов, определенных в Файле ресурсов resource.h. Если значения параметров dxButton, dyButton, dxBitmap и dyBitmap равны NULL, то используются соответственно следующие значения: 16,15,16,15. Создание органов управления toolbar обычно выполняется при- ложением при обработке функцией главного окна сообщения WM_CREATE. Размеры панели инструментов после её инициализации устанавливаются соответственно текущим размерам родительского окна. При изменении размера окна размер панели инструментов автоматически изменяться не будет. Для решения этой проблемы необходимо послать сообщение TB_AUTOSIZE панели инструментов сразу после ее создания и посылать каж- дый раз, когда изменяются размеры родительского окна. Это можно сделать при обработке сообщения WM_SIZE. Параметры wParam и lParam этого сообщения должны быть равны нулю, например: 62 SendMessage(hWndTb, TB_AUTOSIZE, 0, 0); Необходимо отметить, что панель инструментов зани- мает часть клиентской области главного окно приложения. Поэтому необходимо корректировать размеры и начало координат клиентской области при появлении панели инструментов . Экранные координаты в пикселях (относительно левого верхнего угла экрана) окна панели инструментов можно получить с по- мощью функции BOOL GetWindowRect( HWND hWnd, //дескриптор дочернего окна панели //инструментов LPRECT lpRect //адрес структурной переменной типа RECT ); 3.1.1. Приложение с главным меню и панелью инструментов /* Файл resource.h */ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by 1112.rc // #define IDR_TOOLBAR1 101 #define IDD_DIALOGBAR 103 #define IDC_BUTTON1 1002 #define IDC_STATIC_1 1003 #define ID_BUTTON40001 40001 #define ID_BUTTON40002 40002 #define ID_BUTTON40003 40003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1004 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif /*Файл описания ресаурсов 1112.rc частично приведен на стр. 59*/ /* Файл 1112.cpp */ /*#define UNICODE #ifdef UNICODE #define _UNICODE #endif */ #define STRICT #include #include #include 63 /* Файл 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 /*Прототип оконной функции*/ 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); /* Дескрипторы всплывающих меню и дескриптор главного меню */ HMENU hFileMenu, hHelpMenu, hMenu; /*Будет создан логический шрифт*/ HFONT hFont, hOldFont; /* Дескриптор панели инструментов. */ HWND 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) { 64 /* Произвольное имя класса */ 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)); /*Регистрируем класс главного окна*/ wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; /* Определяем оконную процедуру для главного окна */ wcex.lpfnWndProc= (WNDPROC)WndProc; //wcex.cbClsExtra = 0; //wcex.cbWndExtra = 0; wcex.hInstance = hInstance; //Дескриптор приложения /* Стандартная пиктограмма, которую можно загрузить функцией LoadIcon(hInstance, MAKEINTRESOURCE(IDI_?_?)) */ wcex.hIcon = (HICON)LoadImage(hInstance, IDI_APPLICATION, IMAGE_ICON,32,32,0); /*Стандартный курсор мыши*/ wcex.hCursor = LoadCursor(NULL, IDC_ARROW); /* Кисть фона и ее цвет можно определить выражениями: 65 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; /* Маленькую пиктограмму можно загрузить фукцией LoadImage()*/ 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 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")); /* 66 Добавляем в созданное меню конечный элемент "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 в очередь приложения, а там оно обрабатывается с самым низким приоритетом */ 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) 67 { /*Горизонтальный размер главного окна*/ int xSize=500; /*Верикальный размер главного окна*/ int ySize=300; /* PAINTSTRUCT - структура с характеристиками рабочей области(структура заполняется функцией BeginPaint). */ PAINTSTRUCT ps; /* TEXTMETRIC - структура для получения характеристик шрифта. */ TEXTMETRIC tm; /* LOGFONT - структура для для создания логических шрифтов. */ LOGFONT lf; Static HFONT hFont,hOldFont; /* RECT–структура, определяющая прямоугольник. */ RECT rect, rcTb; HDC hDc; /* Высота ранели инструментов HeightTb */ static UINT, HeightTb; /* Ширина width и высота height клиентской области окна в пикселях. */ UINT width,height; int aWidth[PartN],SbWidth; LPTSTR lpszFace=_TEXT("Times New Roman Cyr"); switch (message) { case WM_CREATE: /* Только здесь можно произвести модификацию класса окна Например , SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(200,160,255)); Значение дескриптор экземпляра приложения (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 создает системный таймер 68 с периодом 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; return TRUE; case WM_TIMER: /* Функция OutTimeDate запрашивает у системы текущие значения даты и времени, а затем организует их обработку в главном окне приложения. */ 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. */ 69 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) посы- лает сообщение WM_CLOSE; */ break; case ID_HELP_ABOUT: /* Функция DialogBox создает и выводит на экран мо- дальное диалоговое окно по шаблону IDD_ABOUTBOX, и не возвращает управление в 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); 70 /* Определяем размеры клиентской области окна c учетом окна панели инструментов . */ GetClientRect(hWnd,&rect); rect.top+=HeightTb; /* Функция 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) { /* Функция 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); break; 71 case WM_LBUTTONDOWN: if(wParam & MK_SHIFT) { MessageBox(hWnd,_T("Нажата клавиша\nShift"), _T("Уведомление!"), MB_OK | MB_ICONEXCLAMATION); } break; case WM_GETMINMAXINFO: lpmmi=(LPMINMAXINFO)lParam; /* Минимальный и максимальный размеры окна совпадают */ 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) { switch (message) { case WM_INITDIALOG: /* Для обрабатываемых сообщений процедура всегда возвращает TRUE. */ return (INT_PTR)TRUE; case WM_COMMAND: if(LOWORD(wParam)==IDOK || LOWORD(wParam)== IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; 72 } 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]); /*Разделяющий пробел*/ 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); 73 /*Разделяющее двоеточие*/ 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); } Результат работы программы приведен на рис. 4. Рис. 4. Окно приложения с главным меню и панелью инструментов |