Win32 api программирование
Скачать 0.78 Mb.
|
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. Окно приложения с главным меню, панелью инструментов и строкой состояния |