Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.docx
Скачиваний:
8
Добавлен:
30.10.2018
Размер:
824.42 Кб
Скачать

10. Створити простішу програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід простих геометричних фігур у вікно.

11. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень wm_paint, wm_destroy, wm_create, wm_command. Другі повідомлення передати на обробку стандартній функції вікна.

Main.cpp

#include <windows.h>

HINSTANCE hInst;

LRESULT CALLBACK WinProc (HWND hWnd, UINT Message, UINT wParam, LONG lParam )

{

// обработка сообщений

switch(Message)

{

case WM_DESTROY:

PostQuitMessage(0);

return 0;

case WM_PAINT:

hDC=BeginPaint(hWnd,&ps);

GetClientRect(hWnd,&rect);

EndPaint(hWnd,&ps);

return 0;

case WM_COMMAND:

{ switch(wparam)

{ case ID_ABOUT:

{ MessageBox(hwnd,"Menu Click","Info",MB_OK);

return 0;

}

}

}

}

return DefWindowProc(hWnd,Message,wParam, lParam);

}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)

{

HWND hWnd;

WNDCLASS WndClass;

MSG Msg;

char szClassName[] = "ResourcesDemo";

hInst = hInstance;

// регистрация окного класса

WndClass.style = CS_HREDRAW | CS_VREDRAW;

WndClass.lpfnWndProc = WinProc;

WndClass.cbClsExtra = 0;

WndClass.cbWndExtra = 0;

WndClass.hInstance = hInst ;

WndClass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

WndClass.lpszMenuName = NULL;

WndClass.lpszClassName = szClassName;

if ( !RegisterClass(&WndClass) )

{

MessageBox(NULL,"Cannot register class", "Error", MB_OK);

return 0;

}

char szWinCaption[64];

LoadString(hInst, IDS_WINCAPTION, szWinCaption, 64);

// создает окно

hWnd = CreateWindow(szClassName, szWinCaption,

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance,NULL);

// сообщение об ошибке

if(!hWnd)

{

MessageBox(NULL,"Cannot create window", "Error",MB_OK);

return 0;

}

/* показует наше окно */

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

/* обработка сообщений */

while(GetMessage(&Msg, NULL, 0, 0))

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

return Msg.wParam;

}

№ 12 Стандартні елементи керування. Графічний список. Індикатор прогресу. Складальний лічильник.

Графический список (list view) является многофункциональным элементом управления, широко используемым, в частности, для вывода на экран содержимого каталогов. Графическим он называется потому, что позволяет включать в его состав не только тек стовые строки, но и значки (пиктограммы). Характерной чертой графического списка является наличие в его верхней части заголовка списка - самостоятельного стандартного элемента управления, который можно использовать и отдельно от графического списка, в сочетании с другими элементами управления. Заголовок списка содержит отдельные поля, совпадающие со столбцами списка. Размер полей заголовка и, соответственно, столбцов списка можно изменять, перетаскивая мышью вертикальные линейки, разделяющие поля заголовка. Щелчок мышью по основному (самому левому) элементу списка формирует сообщение Windows, обрабатывая которое можно выполнить любые запланированные действия над этим элементом.Графический список имеет встроенные средства динамического изменения его вида (таблица, список, мелкие значки, крупные значки), что делает его чрезвычайно удобным для просмотра содержимого дисков и каталогов (папок) и обслуживания файловой системы.

/*Создадим графический список*/

HWND hwndList=CreateWindowEx(0,WC_LISTVIEW,NULL, //Класс графического списка

WS_CHILD|WS_BORDER|WS_VISIBLE|LVS_REPORT, //СТИЛЬ: таблица (отчет)

20, 15, 222,150,hwnd,NULL,hlnstance,NULL);

/*3аполниы заголовок списка*/

LV_COLUMN lvc;//Структура для заголовка списка

ZeroMemory(&lvc,sizeof(lvc));11Обнуляем стрктуру

lvc.mask=LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;//Маска

lvc.fmt=LVCFMT_LEFT;//Выравнивание влево

lvc.cx=115;//Размер первого поля заголовка

lvc-pszText=szName;//Строка с текстом первого поля заголовка

ListView_InsertColumn(hwndList,0,&lvc);//Включаем поле в заголовок

lvc.cx=90;//Размер второго поля заголовка

lvc.pszText=szSize;//Строка с текстом второго поля заголовка

ListView_InsertColumn(hwndList,I,&lvc);//Включаем поле в заголовок

/*Подготавливаем структуру для заполнения списка*/

LV_ITEM lvi;//Структура для элементов списка

ZeroMemory (Stlvi , sizeof (lvi ) ) ; //Обнуляем структуру

lvi.mask=LVIF_TEXT;//Ma ска

lvi.pszText=szFileName;//Строка с текстом элемента

Индикатор прогресса (progress bar) представляет собой окно в виде линейки, заполняемое небольшими яркими полосками по мере продвижения некоторого процесса, например копирования файлов, установки системы или просто длительных вычислений

Для того чтобы индикатор прогресса мог выполнять свои функции, индицируемый процесс должен состоять из некоторого известного заранее количества шагов, завершение каждого из которых и будет продвигать индикатор прогресса на одно деление.

/*функция обработки сообщений от элементов управления*/

void DlgOnCommand(HWND hwnd,int id,HWND,UINT){

char szStopText[]="3аполнение памяти завершено";

switch(id){

case ID_START:{//Начнем заполнение памяти

for(int i=0;i<NMAX;i++){//Внешний цикл

for(int j=0;j<100000;j++)//Внутренний цикл

nTes t [ j ] =random(1000000000) , - //Случайные числа в память

SendMessage(hwndBar,PBM_STEPIT,0,0);//Шаг индикатора

}//Конец внешнего for

SetWindowText(GetDlgItem(hwnd,ID_TEXT),szStopText);11 Текст на экран

break;

}//Конец case ID_START

case ID_CLOSE:

case IDCANCEL:

EndDialog(hwnd,0);

}11 Конец switch (id)

}//Конец DlgOnCommand

Наборный счетчик (up-down control или spin control) (рис. 10.7) представляет собой пару кнопок со стрелками, с помощью которых можно увеличивать или уменьшать значение некоторой величины и использовать затем это значение в программе. Часто рядом со стрелками располагают небольшое окно ввода, в котором фиксируется выбранное с помощью стрелок значение и которое можно также использовать для ввода требуемого значения с клавиатуры. Поскольку это окно тесно связано с основным окном счетчика, его называют "приятелем счетчика" (buddy).

Создать наборный счетчик можно разными способами: предложениями файла ресурсов (как обычный элемент управления), вызовом функции CreateWindowEx(), как это мы делали для графического списка, и, наконец, с помощью функции CreateUpDownControl(). Мы использовали последний вариант.

Прототип функции CreateUpDownControl() выглядит следующим образом:

HWND CreateUpDownControl(

DWORD dwStyle,//Набор констант стиля наборного счетчика

int х,//Горизонтальная координата верхнего левого угла счетчика

int у,//Вертикальная координата верхнего левого угла счетчика

int ex,/ /^Ширина наборного счетчика в пикселах

int су,//Высота наборного счетчика в пикселах

HWND hParent,//Дескриптор родительского окна

int nID,//Идентификатор наборного счетчика

HINSTANCE hlnst,//Дескриптор экземпляра приложения

HWND hBuddy,//Дескриптор окна-"приятеля"

int nUpper,//Верхний предел значений наборного счетчика

int nLower,//Нижний предел значений наборного счетчика

int nPos//Начальная позиция наборного счетчика

) I

Среди многочисленных параметров этой функции на первом месте задается комбинация стилей. В нашем примере кроме обычных для любых элементов управления стилей WS_CHILD, WSJVISIBLE и WSBORDER указаны специфические для наборного счетчика стили: UDSALIGNRIGHT задает расположение окна счетчика справа от "приятеля" (константа UDSALIGNLEFT - слева), UDSARROWKEYS позволяет выполнять инкремент или декремент числа в окне-"приятеле" щелчками по стрелкам счетчика, a UDS_SETBUDDYINT приводит к отображению в окне-"приятеле" нового значения, ЕС ли оно изменено с помощью наборного счетчика.

Следующие 4 параметра определяют положение и размеры наборного счетчика. Они нужны, только если наборный счетчик используется без окна-"приятеля"; при наличии последнего размеры счетчика подстраиваются под размеры "приятеля". Далее следуют дескриптор родительского окна (в данном случае дескриптор окна диалога, переданный из Windows через параметр функции DlgOnlnitDialogO), произвольный идентификатор счетчика, дескриптор экземпляра приложения.

В качестве девятого параметра функции CreateUpDownControl() выступает дескриптор окна-"приятеля". Нам этот дескриптор неизвестен, и мы находим его с помощью функции GetDlgItem(), в качестве входного параметра которой указывается идентификатор окна-приятеля", определенный нами в файле ресурсов.

Наконец, последние 3 параметра обозначают максимальную и минимальную границы задаваемого с помощью счетчика значения и значение по умолчанию, устанавливаемое в

окне-"приятеле" при запуске программы.

Как уже отмечалось, все содержательные действия описаны в функции обработки сообщений от элементов управления DlgOnCommand() и выполняются после нажатия пользователем кнопки "Пуск" (идентификатор ID_START). С помощью функции SendDlgltemMessage() обоим наборным счетчикам посылаются предусмотренные для них сообщения UDM_GETPOS для чтения состояния счетчиков (или, что то же самое, содержимого окон ввода). Поскольку объем создаваемого в программе массива случайных чисел заранее неизвестен, память под этот массив выделяется динамически из кучи процесса. Сначала с помощью функции GetProcessHeap() определяется дескриптор кучи, затем функцией НеарА11ос() выделяется память в количестве nNumber*4 байт (случайные числа являются целыми, и каждое занимает 4 байта). Полученная от системы память в цикле заполняется случайными числами с помощью функции C++ randomQ. Эта функция генерирует равномерно распределенные псевдослучайные числа; нетрудно ввести в программу изменение закона распределения с помощью соответствующих математических преобразований

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

После заполнения массива исходными случайными числами можно приступить к вычислению требуемых статистических характеристик полученной выборки, например среднего, дисперсии, среднеквадратического отклонения и др. Мы в нашем примере ограничились вычислением суммы чисел и их среднего значения.

После преобразования полученных числовых характеристик в символьную форму результаты вычислений с помощью функции SetWindowText() посылаются соответствующим статическим элементам управления диалога класса LTEXT и отображаются в окне диалога.

Перед завершением функции DlgOnCommand() выполняется обязательное действие возврат системе с помощью функции HeapFreeQ выделенной памяти.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]