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

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;

}

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