Текст приложения WINDOWS на языке Cи


38
ПРИЛОЖЕНИЕ 2
ПРИЛОЖЕНИЕ WINDOWS

П2.1. Текст приложения WINDOWS на языке Cи

#include
#include
#pragma argsused
//—————— Команды выбора пункта меню ———————
#define ITEM_1 1
#define ITEM_A 2
#define ITEM_B 3
//—————— Прототипы функций приложения ——————-
long FAR PASCAL WndProc( HWND, WORD, WORD, LONG);
void FAR PASCAL CommandProc(HWND, WORD, LONG);
void FAR PASCAL PaintProc(HWND, WORD, LONG);
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°°° Главная фукция приложения °°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
int PASCAL WinMain
(
HANDLE hInstance, // Дескриптор текущей копии
HANDLE hPrevInstance, // Дескриптор предыдущей копии
LPSTR lpCmdLine, // Командная строка запуска
int nCmdShow // Состояние окна
)
{
//———- Локальные переменные приложения ———————
HWND hWnd; // Дескриптор главного окна
MSG Message; // Выделить память для сообщения
LPMSG lpMessage=&Message; // Указатель на сообщение
HMENU hMenu, hMenuPopUp; // Дескрипторы меню приложения
char szCaption[60]; // Буфер для преобразования строк

if( !hPrevInstance ) // Если нет предыдущего приложения
{ // то зарегистрировать класс окна
//——— Локальные переменные регистрации ————————
PWNDCLASS pWndClass; // Указатель на класс окна
HANDLE hMemory; // Дескриптор блока памяти
BOOL bSuccess; // Флаг успешной регистрации
//——— Получить память под структуру данных класса окна ———
hMemory=LocalAlloc(LMEM_DISCARDABLE, sizeof(WNDCLASS));
if(hMemory==NULL) return 0; // Если нет памяти, то возврат
//——— Заполнить поля структуры класса окна ———————
pWndClass=(PWNDCLASS)LocalLock(hMemory); //Зафиксировать блок
pWndClass->style = CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS;
pWndClass->lpfnWndProc = WndProc;
pWndClass->cbClsExtra = NULL;
pWndClass->cbWndExtra = NULL;
pWndClass->hInstance = hInstance;
pWndClass->hIcon = LoadIcon( NULL, IDI_APPLICATION);
pWndClass->hCursor = LoadCursor( NULL, IDC_ARROW );
pWndClass->hbrBackground = GetStockObject( WHITE_BRUSH );
pWndClass->lpszMenuName = (LPSTR)0;
pWndClass->lpszClassName = «OS»;
//——— Зарегистрировать окно ————————————
bSuccess=RegisterClass( pWndClass );
LocalUnlock(hMemory); LocalFree(hMemory); //Освободить блок
if(!bSuccess) return 0;
}

39

// ——- Создать дескрипторы меню приложения ———————
hMenuPopUp=CreateMenu();
if(!AppendMenu(hMenuPopUp, MF_STRING, ITEM_A, «Item_A»)) return 0;
if(!AppendMenu(hMenuPopUp, MF_STRING, ITEM_B, «Item_B»)) return 0;
hMenu=CreateMenu();
if( !AppendMenu(hMenu, MF_STRING, ITEM_1, «Item_1») ) return 0;
if( !AppendMenu(hMenu, MF_POPUP, hMenuPopUp, «Item_2») ) return 0;
//———- Создать основное окно приложения ———————-
hWnd = CreateWindow
(
«OS», // Имя класса окна
«Simple Application», // Заголовок окна
WS_OVERLAPPEDWINDOW, // Тип окна: перекрывающееся
CW_USEDEFAULT, // Х-координата окна
CW_USEDEFAULT, // Y-координата окна
CW_USEDEFAULT, // Ширина окна
CW_USEDEFAULT, // Высота окна
NULL, // Дескриптор копии родителя
hMenu /*NULL*/, // Дескриптор главного меню
hInstance, // Дескриптор копии приложения
(LPSTR) NULL // Дополнительные данные
);
if ( hWnd==NULL ) return( FALSE );
//———- Вывести заголовок основного окна ———————-
sprintf(szCaption,»Лаб.раб.N3:Прилож.=%X,Окно=%X»,hInstance,hWnd);
SetWindowText(hWnd, szCaption);
ShowWindow(hWnd, nCmdShow ); // Отобразить окно
UpdateWindow(hWnd); // Обновить окно: WM_PAINT
//———- Цикл сообщений —————————————-
while( GetMessage(lpMessage, NULL, NULL, NULL))//Пока не WM_DECTROY
{
TranslateMessage(lpMessage); // Перекодировать сообщение
DispatchMessage(lpMessage); // Передать сообщение функции окна
}
return (lpMessage->wParam);
};
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°°° Функция окна приложения °°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
long FAR PASCAL WndProc
(
HWND hWnd, // Дескриптор окна фокуса ввода
unsigned iMessage, // Идентификатор сообщения
WORD wParam, // Параметр-слово сообщения
LONG lParam // Параметр-двойное_слово сообщения
)
{
//—————— Обработка сообщений из очереди ——————
switch (iMessage)
{
case WM_CREATE: break;
case WM_PAINT: PaintProc(hWnd, wParam, lParam); break;
case WM_INITMENU: SetWindowText(hWnd, «ITEM_2»); break;
case WM_COMMAND: CommandProc(hWnd, wParam, lParam); break;
case WM_DESTROY: PostQuitMessage( 0 ); break;
default:
return DefWindowProc( hWnd, iMessage, wParam, lParam );
};
return 0;
}

40

//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°° Обработка выбора в меню °°°°°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
void FAR PASCAL CommandProc
(
HWND hWnd, // Дескриптор окна фокуса ввода
WORD wParam, // Параметр-слово сообщения
LONG lParam // Параметр-двойное_слово сообщения
)
{
switch (wParam)
{
case ITEM_1: SetWindowText(hWnd, «ITEM_1»); break;
case ITEM_A: SetWindowText(hWnd, «ITEM_A»); break;
case ITEM_B: SetWindowText(hWnd, «ITEM_B»); break;
default:;
};
return;
}
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°° Перерисовка окна приложения °°°°°°°°°°°°°°°°°°°°°
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
#include
void FAR PASCAL PaintProc
(
HWND hWnd, // Дескриптор окна фокуса ввода
WORD wParam, // Параметр-слово сообщения
LONG lParam // Параметр-двойное_слово сообщения
)
{
//————— Массив строк для вывода в окно ———————
static char * szText[4]={ // Массив строк для вывода в окно
«Лабораторная работа N 3»,
«по курсу Операционные системы»,
«для студентов 5 курса»,
«инженерно-технического факультета»};
//————— Локальные данные для перерисовки ——————
PAINTSTRUCT paint; // Структура данных для перерисовки
TEXTMETRIC text; // Характеристики текущего шрифта
HDC hDC; // Дескриптор управления устройством
//————— Получить данные для перерисовки ——————-
hDCѕginPaint(hWnd, &paint); // Параметры области обновления
GetTextMetrics(hDC, &text); // Характеристики текста
//————— Нарисовать рамку текста —————————
Rectangle
(
hDC, // Дескриптор устройства (дисплей)
text.tmMaxCharWidth, // Х-координата левого верхнего угла
text.tmHeight, // Y-координата левого верхнего угла
20*text.tmMaxCharWidth, // Х-координата правого нижнего угла
7*text.tmHeight // Y-координата правого нижнего угла
);
//————— Вывести текст в рабочую область окна —————
for( int i=0; i<4; i++) { TextOut ( hDC, // Дескриптор устройства (дисплей) 5*text.tmMaxCharWidth, // Х-координата строки 41 i*text.tmHeight, // Y-координата строки szText[i], // Выводимая строка strlen(szText[i])); // Размер строки в символах } EndPaint(hWnd, &paint); // Завершение обновления return; } //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° П2.2. Файл определения модуля для приложения WINDOWS NAME OS03 ; Имя программы DESCRIPTION 'Пример приложения' ; Описание приложения EXETYPE WINDOWS ; Тип выполняемого модуля (только ; для компилятора Microsoft C 6.0) STUB 'winstub.exe' ; Имя программы, которая запуска- ; при запуске приложения в MS-DOS CODE PRELOAD MOVEABLE ; Описание сегмента кода DATA MOVEABLE MULTIPLE ; Описание сегмента данных HEAPSIZE 1024 ; Размер динамической памяти STACKSIZE 5120 ; Размер стека приложения EXPORTS ; Экспортируемые функции ExpWndProc1 ; (если необходмо, то перечислить ExpWndProc2 ; функции динамически подгружаем- ExpWndProc3 ; ых библиотек (*.dll)