
- •Оглавление
- •1. Интерфейс графического устройства gdi. Обработка сообщений wm_paint.
- •2. Обмін інформацією між процесами та потоками. Обмін даними за допомогою файлів.
- •3.Створити програму у Windows (Win32 api), яка виводе одне (головне) вікно.
- •4. Обмін інформацією між процесами та потоками. Обмін повідомленнями.
- •5. Створити програму у Windows (Win32 api), яка демонструє основні стилі вікон (вікно верхнього рівня, спливаюче вікно з головним вікном та без нього, дочірнє вікно).
- •6. Процеси та потоки. Створення процесу. Створення потоку
- •7. Створити програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід текстових строк у вікно.
- •8) Створити програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід різноманітних типів ліній у вікно.
- •9. Робота з файлами. Асинхронні операції з файлами.
- •10. Створити простішу програму у Windows (Win32 api), яка забезпечує при отриманні повідомлення wm_paint вивід простих геометричних фігур у вікно.
- •11. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень wm_paint, wm_destroy, wm_create, wm_command. Другі повідомлення передати на обробку стандартній функції вікна.
- •№ 12 Стандартні елементи керування. Графічний список. Індикатор прогресу. Складальний лічильник.
- •13. Створити простішу програму у Windows (Win32 api), яка забезпечує обробку повідомлень миші (wm_lbuttondown, wm_rbuttondown) у вікні.
- •15. Базові команди. Класифікація команд. Команди передачі даних. Команди обміну процесора з пам'яттю. Команди передачі кодів між процесором і периферією.
- •16. Команди обробки даних. Базові арифметичні команди.
- •17. Створити програму у Windows (Win32 api), яка забезпечує обробку повідомлень клавіатури (wm_keyup, wm_keydown) у вікні.
- •18. ВікнаWindows.Процедура створенняд очірнього вікна. Повідомлення wm_create.
- •19. Створити програму у Windows (Win32 api), яка забезпечує роботу з таймером.
- •20.Таймери Windows і служба часу.
- •24. Інтерфейс графічних пристроїв gdi. Обробка повідомлень wm_paint.
- •26. Створити простішу програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - графічний список.
- •27. Основи розробки Windows-додатків. Головна функція WinMain(). Повідомлення Windows.
- •29 Створити програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - набірний лічильник.
26. Створити простішу програму у Windows (Win32 api), яка забезпечує роботу з стандартним елементом керування - графічний список.
Графический список – элемент управления, отображающий список, каждый элемент которого может быть представлен текстовой меткой и (необязательно) иконкой.
Примеры:
Стили графического списка слева направо соответственно: LVS_REPORT; LVS_LIST; LVS_ICON.
В программе для примера используется графический список со стелем LVS_ICON.
Окно программы выглядит так:
При нажатии на элементе левой или правой кнопкой мыши выводится сообщение о нажатии соответствующей кнопки мыши и текст элемента, над которым находился курсор мыши во время нажатия клавиши. Четным элементам соответствует рисунок с буквой «Ч», а нечетным – с буквой «Н».
Исходные тексты программы состоят из двух файлов: main.cpp и main.rc.
В файле main.rc происходит только подключение иконок, весь алгоритм работы программы описан в файле main.cpp.
Текст файла main.rc
//файл ресурсов
//загружаем иконку для четных элементов
ListViewEven ICON "/icons/even.ico"
//загружаем иконку для нечетных элементов
ListViewOdd ICON "/icons/odd.ico"
Текст файла main.cpp
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <stdio.h>
#define ID_LISTVIEW 101
HWND hListViewWnd;//дескриптор окна графического списка
int nIconEven,nIconOdd;//хранят номера изображений соответственно для четных и нечетных элементов
LRESULT CALLBACK MainWndProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
//функция обработки сообщений главного окна
//объявляем указатели и структуры, необходимые для работы с графическим списком
NMHDR FAR *lpnmhdr;
NMLISTVIEW *lpnmlistview;
NOTIFYICONDATA niData;
char szLBuf[20];
switch (uMsg) {
case WM_NOTIFY://если уведомление
switch LOWORD(wParam) {
case ID_LISTVIEW://если это уведомление от графического списка
lpnmhdr=LPNMHDR(lParam);
lpnmlistview=(LPNM_LISTVIEW)lpnmhdr;
if (lpnmlistview->iItem==-1) return 0;//если клик на пустой области - возврат из функции
if (lpnmhdr->code==NM_CLICK) {//если левая кнопка мыши
//получим текст выбранного элемента
ListView_GetItemText(hListViewWnd,lpnmlistview->iItem,0,szLBuf,sizeof(szLBuf));
//выведем сообщение с полученным текстом
MessageBox(hWnd,szLBuf,"Вы нажали левую кнопку мыши",MB_OK | MB_ICONINFORMATION);
}
else if (lpnmhdr->code==NM_RCLICK) {//если правая кнопка мыши
//получим текст выбранного элемента
ListView_GetItemText(hListViewWnd,lpnmlistview->iItem,0,szLBuf,sizeof(szLBuf));
//выведем сообщение с полученным текстом
MessageBox(hWnd,szLBuf,"Вы нажали правую кнопку мыши",MB_OK | MB_ICONINFORMATION);
}
return 0;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
}
void SetListViewImageList (HINSTANCE hInstance) {
//функция для прикрепления к графическому списку изображений
HIMAGELIST hImgList;
hImgList=ImageList_Create(48,48,ILC_MASK,1,0);//создаем список изображений размерами 48х48
nIconEven=ImageList_AddIcon(hImgList,LoadIcon(hInstance,"ListViewEven"));//загружаем из ресурсов программы иконку для четных элементов
nIconOdd=ImageList_AddIcon(hImgList,LoadIcon(hInstance,"ListViewOdd"));//для нечетных элементов
ListView_SetImageList(hListViewWnd,hImgList,LVSIL_NORMAL);//прикрепляем список изображений к графическому списку
}
void FillListView () {
//функция для заполнения графического списка значениями
LV_ITEM lvi;//структура, содержащая сведения об элементе графического списка
ZeroMemory(&lvi,sizeof(&lvi));//обнулим память во избежание ошибок
lvi.mask=LVIF_TEXT|LVIF_IMAGE;//устанавливаем маску - меняем только текст и изображения
lvi.iSubItem=0;
char szLBuf[20];
for (int nItemCounter=1; nItemCounter<=10; nItemCounter++) {
lvi.iItem=nItemCounter;//устанавливаем номер элемента в графическом списке
if ((nItemCounter%2)!=0) lvi.iImage=nIconOdd;//если число четное, то добавляем иконку соответствующую четному числу
else lvi.iImage=nIconEven;//иначе, добавляем иконку, соответствующую нечетному числу
sprintf(szLBuf,"элемент %d",nItemCounter);
lvi.pszText=szLBuf;//инициализируем указатель на текст
ListView_InsertItem(hListViewWnd,&lvi);//вставляем элемент в графический список
}
}
bool RegClassEx(HINSTANCE hInstance,LPCTSTR lpszClassName,WNDPROC WndProc) {
//функция для регистрации класса с переданными параметрами
WNDCLASSEX wce;
ZeroMemory(&wce,sizeof(wce));
wce.hInstance=hInstance;
wce.lpszClassName=lpszClassName;
wce.lpfnWndProc=WndProc;
wce.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wce.hCursor=LoadCursor(NULL,IDC_ARROW);
wce.hbrBackground=GetStockBrush(GRAY_BRUSH);
wce.cbSize=sizeof(WNDCLASSEX);
return (RegisterClassEx(&wce) != 0);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int nCmdShow) {
//подключим библиотеку для работы с графическим списком
InitCommonControls();
//зарегистрируем класс главного окна
if (!RegClassEx(hInstance,"MainWndClass",MainWndProc)) {
MessageBox(NULL,"Can not register main window class",NULL,MB_OK | MB_ICONERROR);
return 0;
}
//создадим главное окно
HWND hMainWnd;
if ((hMainWnd=CreateWindowEx(0,"MainWndClass","Работа с графическим списком",
WS_OVERLAPPED | WS_MINIMIZEBOX |WS_SYSMENU | WS_CLIPCHILDREN,
300,100,400,250,0,0,0,0))==0) {
MessageBox(NULL,"Can not create main window",NULL,MB_OK | MB_ICONERROR);
return 0;
}
//покажем главное окно, размер и видимость которого зависят от переданного параметра nCmdShow
ShowWindow(hMainWnd,nCmdShow);
//создадим графический список - LISTVIEW
if ((hListViewWnd=CreateWindowEx(0,WC_LISTVIEW,0,
WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_ICON | LVS_SHOWSELALWAYS,
10,10,375,200,hMainWnd,(HMENU)ID_LISTVIEW,hInstance,NULL))==0) {
MessageBox(hMainWnd,"Can not create LISTVIEW window",NULL,MB_OK | MB_ICONERROR);
DestroyWindow(hMainWnd);
return 0;
}
//прикрепим к графическому списку список иконок
SetListViewImageList(hInstance);
//заполним графический список текстом с изображениями
FillListView ();
//создадим цикл обработки сообщений
MSG msg;
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
return 0;
}