Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Лабораторная №2 "Системное программирование". Вариант №6.
- #include <Windows.h>
- #include <tchar.h>
- #include <string.h>
- #include <CommCtrl.h>
- #include <objbase.h>
- LRESULT CALLBACK Pr2_WndProc(HWND, UINT, WPARAM, LPARAM); //предварительное объявление (прототип) оконной процедуры для обработки сообщений главного окна.
- //глобальные переменные. По правилам хорошего тона, начинать с g_
- #define g_lpszClassName TEXT("sp_pr2_class") //переменная с именем g_lpszClassName для указателя на строку с именем класса окна. В качестве имени класса возьмите "sp_pr2_class"
- #define g_lpszAplicationTitle TEXT(" Главноеокно приложения. Програмист <Деменков Максим>") //переменную с именем g_lpszAplicationTitle для указателя на строку " Главное окно приложения. Програмист <Фамилилия, имя>", используемую для заголовка окна;
- #define g_lpszButtonDown TEXT("Обработка сообщения WM_LBUTTONDOWN, которое посылается в окно прищелчке левой кнопки мыши")
- #define g_lpszPaint TEXT("Вывод текста при обработке сообщения WM_PAINT. Это соообщение окно получает после того, как оно было закрыто другим окном и затем открыто.")
- #define g_lpszDestroyMessage TEXT("Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод.") //переменную именем g_lpszDestroyMessage для указателя на строку "Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод.". Этот текст необходимо использовать при выводе сообщения о закрытии окна;
- #define g_lpszMassage TEXT("Выполняется обработка WM_CREATE")
- #define ID_COMBODAY 202 //идентификатор комбобокса
- #define ID_LISTDAY 203 //идентификатор листбокса
- #define IDC_BTN_SAVE 100
- HINSTANCE hInst;//?Указатель на Парент окно
- HWND hComboBox;// //Идентификатор окон-элементов управления
- HWND hListBox;
- HWND hButtonSave;
- char strokalistbox[255]=""; //объявляем переменную текстовую, куда впоследствии будем записывать номер строки listbox'a и её содержимое
- static TCHAR colorlistboxstring[20];
- int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow)
- {
- WNDCLASSEX wc;
- MSG msg;
- HWND hWnd;
- hInst = hInstance;//Для комбобокса и листбокса
- memset(&wc, 0, sizeof(WNDCLASSEX));
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.lpszClassName = g_lpszClassName;
- wc.lpfnWndProc = Pr2_WndProc;
- wc.style = CS_VREDRAW | CS_HREDRAW;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION)); //по варианту иконка должна быть 6) IDI_INFORMATION - Asterisk icon.
- wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
- // wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- wc.hbrBackground = CreateSolidBrush(RGB(0,0,127));
- wc.lpszMenuName = NULL;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- if (!RegisterClassEx(&wc))
- {
- MessageBox(NULL, TEXT("Ошибка регистрации класса окна!"), TEXT("Ошибка"), MB_OK | MB_ICONERROR);
- return FALSE;
- }
- hWnd = CreateWindowEx(NULL, g_lpszClassName,
- g_lpszAplicationTitle,
- (WS_OVERLAPPEDWINDOW| WS_VISIBLE) ^WS_MAXIMIZEBOX^WS_MINIMIZEBOX, // В соответствии с Вашим вариантом исключите из стиля WS_OVERLAPPEDWINDOW флаги: 6) Обе кнопки - MaximizeBox и MinimizeBox
- 0,
- 0,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- NULL,
- NULL,
- hInstance,
- NULL
- );
- if (!hWnd)
- {
- MessageBox(NULL, TEXT("Окно не создано!"), TEXT("Ошибка"), MB_OK | MB_ICONERROR);
- return FALSE;
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- while (GetMessage(&msg, NULL, 0, 0))
- {
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- LRESULT CALLBACK Pr2_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //оконная процедура для обработки сообщений, поступающих в адрес главного окна приложения.
- {
- HDC hDC;
- switch (msg)
- {
- case WM_DESTROY: //если поступило сообщение о закрытии приложении
- MessageBox(NULL, g_lpszDestroyMessage, TEXT("Cообщение"), MB_OK); //При закрытии приложения, происходит уведомление в окне "сообщение", с текстом g_lpszDestroyMessage ("Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод."), так-же добавляется кнопка OK
- PostQuitMessage(0); //Это сообщение посылается когда необходимо уничтожить окно. После удалении его с экрана. Посылается сообщение сначала главному окну, а потом дочерним окнам. После принятия этого сообщения необходимо вызывать функцию PostQuitMessage(). Сообщение о разрушении окна поступит именно оконной процедуре, а не в стандартной очереди сообщения. Общий вид обработки этого сообщения такой:
- break;
- case WM_LBUTTONDOWN: //если поступило сообщение о нажатии клавиши мыши
- RECT click ; //RECT структура имеющаяя в своем описании координаты верхней левой и нижней правой точекпрямоугольника.
- click.left = LOWORD(lParam);
- click.top = HIWORD(lParam);
- click.right = LOWORD(lParam) + 10 * ARRAYSIZE(g_lpszButtonDown);
- click.bottom = HIWORD(lParam) + 15;
- hDC = GetDC(hWnd);
- DrawText(hDC, g_lpszButtonDown, ARRAYSIZE(g_lpszButtonDown), &click , DT_LEFT);
- ReleaseDC(hWnd, hDC);
- break;
- case WM_PAINT:
- PAINTSTRUCT ps;
- hDC = BeginPaint(hWnd, &ps); //в этом обработчике для получения контекста отображения используется функция BeginPaint
- TextOut(hDC, 20, 100, g_lpszPaint, ARRAYSIZE(g_lpszPaint)); //по заданию надо отрисовывать текст на форме, с координатами {20,100}
- TextOut(hDC, 50, 200, strokalistbox, ARRAYSIZE(strokalistbox)); //по заданию надо отрисовывать текст на форме, с координатами {20,100}
- EndPaint(hWnd, &ps);
- break;
- case WM_CREATE:
- hDC = GetDC(hWnd);
- MessageBox(NULL,g_lpszMassage,TEXT("MessageBox"),ARRAYSIZE(g_lpszMassage));
- hButtonSave=CreateWindowEx(0L,"Button","Выход",
- WS_CHILD|WS_BORDER|WS_VISIBLE,
- 20,
- 240,
- 80,
- 24,
- hWnd,
- (HMENU)(IDC_BTN_SAVE),
- hInst,
- NULL);
- //Создаем листбокс
- hListBox=CreateWindow("ListBox", //Далее хотим сделась Лист,тогда szWindowClass должен быть 'ListBox', соответственно либо strcpy(szWindowClass,'ListBox');
- NULL, //имя листбокса
- (WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_HASSTRINGS)^LBS_SORT,
- 10, //начало (левый угол)
- 10, //начало (верхний угол)
- 150, //продлить (правый угол)
- 150, //продлить (нижний угол)
- hWnd,
- (HMENU)ID_LISTDAY,
- hInst,
- NULL);
- //Заполнение строк листбокса
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Красный");
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Оранжевый");
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Желтый");
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Зелёный");
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Голубой");
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Синий");
- SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Фиолетовый");
- //Создаём окно-список цветов (Создание элемента управления:)
- hComboBox=CreateWindow("Combobox", NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_HASSTRINGS,
- 200,10,100,200, hWnd, (HMENU)ID_COMBODAY, hInst, NULL);
- //Заполнение строк комбобокса
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Красный");
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Оранжевый");
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Желтый");
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Зеленый");
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Голубой");
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Синий");
- SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Фиолетовый");
- SendMessage(hComboBox, CB_SETCURSEL, 0, 0L);//После создания списка вид у него неприглядный. Он начинается пустой строкой. Чтобы сделать активной первую строку, вызовите функцию:
- return 0; //Убедитесь, что для последующего успешного создания окна, обработчик WM_CREATE должен возвращать 0.
- //При возврате обработчиком этого сообщения значения (-1) главное окно не создается и функция CreateWndow (или CreateWindowEx) возвращает NULL
- case WM_SETFOCUS:
- SetFocus(hListBox);
- break;
- case WM_COMMAND: //отлов сообщений, например в ListBox'e
- {
- // тут LOWORD(wParam) = идентификатор листбокса, а lParam это HWND листбокса
- switch(LOWORD(wParam))
- {
- case IDC_BTN_SAVE:
- {
- MessageBox(hWnd,"Введите текст","Читаем Edit",MB_OK);
- }
- case ID_LISTDAY:
- if (HIWORD(wParam) == LBN_DBLCLK) //по двойному щелчку мыши
- {
- TCHAR lpszBuffer[MAX_PATH];
- int curSel; //переменная, показывающая номер строки ListBox'а
- curSel = SendMessage (hListBox, LB_GETCURSEL, 0, 0); //записываем номер строки ListBox'a
- itoa(curSel,strokalistbox,10);//конвертируем номер строки в текстовый формат
- //MessageBox(NULL, g_lpszDestroyMessage, TEXT(strokalistbox), MB_OK); //При закрытии приложения, происходит уведомление в окне "сообщение", с текстом g_lpszDestroyMessage ("Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод."), так-же добавляется кнопка OK
- RECT click; //RECT структура имеющаяя в своем описании координаты верхней левой и нижней правой точекпрямоугольника.
- //RECT okno;
- //GetWindowRect(hWnd, &okno); //получаем координаты окна программы
- //click.left = 10;
- //click.top = okno.bottom-100;
- //click.right = 100 * ARRAYSIZE(strokalistbox);
- //click.bottom = okno.bottom+10;
- click.left = 100;
- click.top = 500;
- click.right = 100 * ARRAYSIZE(strokalistbox);
- click.bottom = 500 + 20;
- hDC = GetDC(hWnd);
- switch (curSel)
- {
- case 0:
- SetTextColor(hDC, 0x000000FF); //0x00BBGGRR
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Красный\0");
- break;
- case 1:
- SetTextColor(hDC, 0x005AFF);
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Оранжевый\0");
- break;
- case 2:
- SetTextColor(hDC, 0x0000FFFF);
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Желтый\0");
- break;
- case 3:
- SetTextColor(hDC, 0x0000FF00);
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Зеленый\0");
- break;
- case 4:
- SetTextColor(hDC, 0xFFFF00);
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Голубой\0");
- break;
- case 5:
- SetTextColor(hDC, 0x00FF0000);
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Синий\0");
- break;
- case 6:
- SetTextColor(hDC, 0xFF00FF);
- for(int i=0;i<20;i++)colorlistboxstring[i]=0;
- strcpy(colorlistboxstring,"Фиолетовый\0");
- break;
- default:
- break;
- }
- DrawText(hDC, colorlistboxstring, ARRAYSIZE(colorlistboxstring), &click , DT_LEFT);
- ReleaseDC(hWnd, hDC);
- }
- break;
- }
- }
- default:
- return(DefWindowProc(hWnd, msg, wParam, lParam));
- }
- return FALSE;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement