Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Безруков WIN API.pdf
Скачиваний:
61
Добавлен:
17.03.2018
Размер:
420.61 Кб
Скачать

BOOL GetWindowRect(

HWND hWnd, //дескриптор дочернего окна панели //инструментов

LPRECT lpRect //адрес структурной переменной

//типа RECT

);

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

/*Операторы препроцессора*/ #define STRICT

#include <windows.h> #include <windowsx.h> #include <commctrl.h>

#include "I:\\Msg1\\resource.h"

/*Прототип оконной функции, используемый в программе*/

LRESULT WINAPI WndProc(HWND,UINT,WPARAM,LPARAM); /*Идентификаторы панели инструментов и строки состояния*/

#define IDT_TOOLBAR 300 //#define ID_FILE_TEST 0 //#define ID_FILE_EXIT 1 //#define ID_HELP_ABOUT 2

/*Дескрипторы всплывающих меню и дескриптор главного меню*/

HMENU hFileMenu, hHelpMenu, hMenu; /*Дескриптор панели инструментов */ HWND hWndTb;

/*Массив структур типа 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}

};

/*Главная функция WinMain*/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE,

68

LPSTR lpCmdLine, int nCmdShow)

{

/* Произвольное имя класса */ char szClassName[]="qwerty";

//или LPCTSTR lpszClassName="qwerty"; /* Произвольный заголовок окна */ char szAppTitle[]="BGTU";

//или LPCTSTR lpszAppName="BGTU"; /*

Cтруктурная переменная wc типа WNDCLASSEX для задания характеристик окна

*/

WNDCLASSEX wc;

HWND hWnd; //дескриптор окна

/*

Структурная переменная Msg типа MSG для получения сообщений Windows

*/

MSG Msg;

/*Проверяем, было ли это приложение запущено ранее*/

if(hWnd=FindWindow(szClassName, NULL))

{

/*Поверяем, было ли это окно свернуто в пиктограмму */

if(IsIconic(hWnd)) ShowWindow(hWnd,SW_RESTORE);

/*Выдвигаем окно приложения на передний план*/

SetForegroundWindow(hWnd); return FALSE;

}

/*Регистрируем класс главного окна*/ memset(&wc,0,sizeof(wc)); wc.cbSize=sizeof(WNDCLASSEX); /*Стандартная пиктограмма*/

wc.hIcon =(HICON)LoadImage(hInstance, IDI_APPLICATION, IMAGE_ICON,32,32,0); /*Стандартный курсор мыши*/ wc.hCursor=LoadCursor(NULL, IDC_ARROW); wc.style=CS_HREDRAW|CS_VREDRAW;

/*Определяем оконную процедуру для главного окна*/

wc.lpfnWndProc=(WNDPROC)WndProc;

69

wc.cbClsExtra=0;

wc.cbWndExtra=0;

wc.hInstance= hInstance;//дескриптор приложения wc.hIconSm=NULL;

/*Определяем кисть фона и ее цвет*/ wc.hbrBackground=(HBRUSH)GetStockObject(

WHITE_BRUSH); //или макрос GetStockBrush(WHITE_BRUSH) //или (HBRUSH)(COLOR_APPWORKSPACE+1)

wc.lpszClassName=szClassName; if(!RegisterClassEx(&wc)) return FALSE; /*Инициализация библиотеки Common Control Library*/

INITCOMMONCONTROLSEX iCc; iCc.dwSize=sizeof(INITCOMMONCONTROLSEX); iCc.dwICC=ICC_WIN95_CLASSES; InitCommonControlsEx(&iCc);

/*Создаем главное окно*/ hWnd=CreateWindowEx(WS_EX_WINDOWEDGE,

szClassName,

szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,10, CW_USEDEFAULT,100, HWND_DESKTOP,

NULL,

hInstance,

NULL); if(!hWnd)return FALSE;

/*

Пересылаем содержимое сегментных регистров кода, данных и стека в переменные Reg1,Reg2 и Reg3

*/

char szTxt[80];

USHORT Reg1, Reg2, Reg3; __asm{

mov Reg1,CS mov Reg2,DS mov Reg3,SS

}

/*

Выводим окно сообщений со значениями сегментных регистров,

70

смещения (адреса) главной функции и смещения(адреса) строки с именем класса

*/

wsprintf(szTxt,"CS=%X DS=%xSS=%X\nWinMain=%X\n szClassName=%X", Reg1, Reg2, Reg3,WinMain, szClassName);

MessageBox(hWnd, szTxt, "Регистры", MB_ICONINFORMATION);

/*

Создаем пустое всплывающее меню самого низкого уровня hFileMenu=CreatePopupMenu() и добавляем в него конечный элемент "Test"

*/

AppendMenu((hFileMenu=CreatePopupMenu()), MF_ENABLED|MFT_STRING, ID_FILE_TEST,"&Test");

/*Добавляем в созданное меню конечный элемент

"Exit"*/ AppendMenu(hFileMenu,MF_GRAYED|MFT_STRING,

ID_FILE_EXIT,"E&xit");

/*

Создаем пустое меню самого низкого уровня

(hHelpMenu)

и добавляем в него конечный элемент "About" */ AppendMenu((hHelpMenu=CreatePopupMenu()),

MF_GRAYED|MFT_STRING, ID_HELP_ABOUT,"&About");

/*Создаем меню верхнего уровня - главное меню hMenu=CreateMenu()и присоединяем созданное подменю "File" к главному меню*/ AppendMenu((hMenu=CreateMenu()),

MF_ENABLED|MF_POPUP, UINT)hFileMenu,"&File");

/*Присоединяем созданное подменю "Help" к главному меню*/ AppendMenu(hMenu,MF_ENABLED|MF_POPUP,

(UINT)hHelpMenu,"&Help"); /*Добавляем в конец главного меню конечный пункт

"Quit"*/ AppendMenu(hMenu,MF_GRAYED,(UINT)11,"QUIT"); /*Присоединяем созданное меню к окну приложения*/

SetMenu(hWnd,hMenu);

71

/*Делаем главное окно видимым на экране*/ 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 Msg.wParam;//Код возврата

}

/*Оконная функция главного окна*/

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam,LPARAM lParam)

{

HDC hDc; PAINTSTRUCT ps; RECT rect, rcTb;

static UINT HeightTb; UINT width,height;

/*Строка текста для вывода в главное окно*/ LPCTSTR lpszTxt="Б Г Т У";

switch(msg)

{

/*Переход по значению кода сообщения(msg)*/ case WM_CREATE:

/*Создаем панель инструментов Toolbar*/ hWndTb=CreateToolbarEx(hWnd, //дескриптор

//окна

WS_CHILD|WS_VISIBLE|WS_BORDER|TBSTYLE_TOOLTIPS, IDT_TOOLBAR, //идентификатор панели инструмен-

//тов 3, //количество изображений (пиктограмм) кнопок

GetModuleHandle(NULL), //функция возвращает

//дескриптор экземпляра приложения

72

IDR_TOOLBAR1,//идентификатор ресурса растрового //образа

(LPCTBBUTTON)tBb, //адрес массива структур типа

//TBBUTTON 4, //количество кнопок

0,0, //ширина и высота кнопок в пикселях 0,0, //ширина и высота изображений пиктограмм

//кнопок в пикселях

sizeof(TBBUTTON) //размер структуры в байтах

);

if(hWndTb==NULL)return FALSE; SendMessage(hWndTb,TB_AUTOSIZE,0,0); /*

Определяем размер прямоугольника окна ToolBar в экранных координатах(пикселях).

*/

GetWindowRect(hWndTb,&rcTb); /* Высота ToolBar в пикселях.*/ HeightTb=rcTb.bottom-rcTb.top; return TRUE;

case WM_KEYDOWN:

/*Обрабатываем сообщение - нажатие клавиши*/ switch(wParam)

{

/*Клавиша Esc*/ case VK_ESCAPE:

/*

Посылаем сообщение WM_CLOSE окну (hWnd), после того, как оконная процедура обработает это

сообщение, система передаст управление инструкции следующей за SendMessage

*/ SendMessage(hWnd,WM_CLOSE,0,0); break;

}

break;

case WM_COMMAND: switch(wParam)

{

case ID_FILE_TEST:

/*Изменяем статус пункта меню

ID_FILE_EXIT*/ EnableMenuItem(hFileMenu,ID_FILE_EXIT,

73

MF_BYCOMMAND|MF_ENABLED); /*Ставим отметку на пункте меню

ID_FILE_TEST*/ CheckMenuItem(hFileMenu,ID_FILE_TEST,

MF_BYCOMMAND|MF_CHECKED); /*Изменяем статус пункта главного меню

"QUIT"*/

EnableMenuItem(GetMenu(hWnd),(UINT)11, MF_BYCOMMAND|MF_ENABLED);

/*

Так как изменился статус пункта главного меню, вызываем функцию DrawMenuBar для повторного отображения изменившейся полосы меню

*/

DrawMenuBar(hWnd);

break;

case ID_FILE_EXIT: /*

Без запроса на закрытие окнафункция

PostQuitMessage посылает сообщение WM_QUIT */

PostQuitMessage(0);

/*

С запросом на закрытие, т.е. окно еще не разрушено

SendMessage(hWnd,WM_CLOSE,0,0); */

break;

case ID_HELP_ABOUT: //...

break;

case (UINT)11: //...

/*

Без запроса на закрытие окна - функция

PostQuitMessage посылает сообщение WM_QUIT

*/

PostQuitMessage(0);

break;

}

break;

case WM_PAINT:

74

/*Получаем контекст устройства*/ hDc=BeginPaint(hWnd,&ps);

/*

Определяем размеры клиентской области окна c учетом окна панели инструментов

*/

GetClientRect(hWnd,&rect);

rect.top+=HeightTb;

/*

TRANSPARENT - в этом режиме вывода текста цвет фона графического элемента игнорируется, т.е. символ выводится на существующем фоне.

*/

SetBkMode(hDc,TRANSPARENT); DrawText(hDc,lpszTxt, -1,&rect,

DT_SINGLELINE|DT_CENTER|DT_VCENTER); /*Освобождаем контекст устройства*/ EndPaint(hWnd,&ps);

break;

case WM_CLOSE: /*

Сообщение появляется при щелчке на кнопке закрытия окна - здесь предназначено для вывода предупреждающего сообщения

*/

if(MessageBox(hWnd,"Вы уверены???","",

MB_YESNO | MB_ICONQUESTION)==IDYES) 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;

75

case WM_LBUTTONDOWN: /*нажата клавиша Shift ?*/ if(wParam & MK_SHIFT)

{

MessageBox(hWnd,

"Нажата клавиша\nShift", "Shift,Ctrl", MB_ICONINFORMATION);

}

break;

case WM_DESTROY: PostQuitMessage(0);

/*PostQuitMessage() выполняет только одно действие - ставит в очередь сообщение WM_QUIT. Параметр у этой функции - код возврата, который помещается в wParam

*/

break;

default:

/*Обработка прочих сообщений по умолчанию*/ return DefWindowProc(hWnd,msg,wParam,lParam);

}

return 0L;

}

Результат работы программы приведен на рис. 4.

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

76

Соседние файлы в предмете Программирование