Advertisement
Guest User

Lab2SP

a guest
May 31st, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Лабораторная №2 "Системное программирование". Вариант №6.
  2. #include <Windows.h>
  3. #include <tchar.h>
  4. #include <string.h>
  5. #include <CommCtrl.h>
  6. #include <objbase.h>
  7.  
  8.  
  9. LRESULT CALLBACK Pr2_WndProc(HWND, UINT, WPARAM, LPARAM); //предварительное объявление (прототип) оконной процедуры для обработки сообщений главного окна.
  10.  
  11. //глобальные переменные. По правилам хорошего тона, начинать с g_
  12. #define g_lpszClassName TEXT("sp_pr2_class")  //переменная с именем g_lpszClassName для указателя на строку с именем класса окна. В качестве имени класса возьмите "sp_pr2_class"
  13. #define g_lpszAplicationTitle TEXT(" Главноеокно приложения. Програмист <Деменков Максим>") //переменную с именем g_lpszAplicationTitle для указателя на строку " Главное окно приложения. Програмист <Фамилилия, имя>", используемую для заголовка окна;
  14. #define g_lpszButtonDown TEXT("Обработка сообщения WM_LBUTTONDOWN, которое посылается в окно прищелчке левой кнопки мыши")
  15. #define g_lpszPaint TEXT("Вывод текста при обработке сообщения WM_PAINT. Это соообщение окно получает после того, как оно было закрыто другим окном и затем открыто.")
  16. #define g_lpszDestroyMessage TEXT("Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод.") //переменную именем g_lpszDestroyMessage для указателя на строку "Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод.". Этот текст необходимо использовать при выводе сообщения о закрытии окна;
  17. #define g_lpszMassage TEXT("Выполняется обработка WM_CREATE")
  18. #define ID_COMBODAY 202 //идентификатор комбобокса
  19. #define ID_LISTDAY 203 //идентификатор листбокса
  20. #define IDC_BTN_SAVE 100
  21.  
  22. HINSTANCE hInst;//?Указатель на Парент окно
  23. HWND hComboBox;// //Идентификатор окон-элементов управления
  24. HWND hListBox;
  25. HWND hButtonSave;
  26. char strokalistbox[255]=""; //объявляем переменную текстовую, куда впоследствии будем записывать номер строки listbox'a и её содержимое
  27. static TCHAR  colorlistboxstring[20];
  28.  
  29. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow)
  30. {
  31.     WNDCLASSEX wc;
  32.     MSG msg;
  33.     HWND hWnd;
  34.     hInst = hInstance;//Для комбобокса и листбокса
  35.     memset(&wc, 0, sizeof(WNDCLASSEX));
  36.     wc.cbSize = sizeof(WNDCLASSEX);
  37.     wc.lpszClassName = g_lpszClassName;
  38.     wc.lpfnWndProc = Pr2_WndProc;
  39.     wc.style = CS_VREDRAW | CS_HREDRAW;
  40.     wc.hInstance = hInstance;
  41.     wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));  //по варианту иконка должна быть 6) IDI_INFORMATION - Asterisk icon.
  42.     wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
  43. //  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  44.     wc.hbrBackground = CreateSolidBrush(RGB(0,0,127));
  45.  
  46.     wc.lpszMenuName = NULL;
  47.     wc.cbClsExtra = 0;
  48.     wc.cbWndExtra = 0;
  49.  
  50.     if (!RegisterClassEx(&wc))
  51.     {
  52.         MessageBox(NULL, TEXT("Ошибка регистрации класса окна!"), TEXT("Ошибка"), MB_OK | MB_ICONERROR);
  53.         return FALSE;
  54.     }
  55.  
  56.     hWnd = CreateWindowEx(NULL, g_lpszClassName,
  57.     g_lpszAplicationTitle,
  58.     (WS_OVERLAPPEDWINDOW| WS_VISIBLE) ^WS_MAXIMIZEBOX^WS_MINIMIZEBOX, // В соответствии с Вашим вариантом исключите из стиля WS_OVERLAPPEDWINDOW флаги: 6) Обе кнопки - MaximizeBox и MinimizeBox
  59.     0,
  60.     0,
  61.     CW_USEDEFAULT,
  62.     CW_USEDEFAULT,
  63.     NULL,
  64.     NULL,
  65.     hInstance,
  66.     NULL
  67.     );
  68.  
  69.     if (!hWnd)
  70.     {
  71.         MessageBox(NULL, TEXT("Окно не создано!"), TEXT("Ошибка"), MB_OK | MB_ICONERROR);
  72.         return FALSE;
  73.     }
  74.  
  75.     ShowWindow(hWnd, nCmdShow);
  76.     UpdateWindow(hWnd);
  77.  
  78.     while (GetMessage(&msg, NULL, 0, 0))
  79.     {
  80.         DispatchMessage(&msg);
  81.     }
  82.     return msg.wParam;
  83. }
  84.  
  85.  
  86.  
  87.  
  88.  
  89. LRESULT CALLBACK Pr2_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //оконная процедура для обработки сообщений, поступающих в адрес главного окна приложения.
  90. {
  91.     HDC hDC;
  92.     switch (msg)
  93.     {
  94.  
  95.         case WM_DESTROY: //если поступило сообщение о закрытии приложении
  96.         MessageBox(NULL, g_lpszDestroyMessage, TEXT("Cообщение"), MB_OK); //При закрытии приложения, происходит уведомление в окне "сообщение", с текстом g_lpszDestroyMessage ("Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод."), так-же добавляется кнопка OK
  97.         PostQuitMessage(0); //Это сообщение посылается когда необходимо уничтожить окно. После удалении его с экрана. Посылается сообщение сначала главному окну, а потом дочерним окнам. После принятия этого сообщения необходимо вызывать функцию PostQuitMessage(). Сообщение о разрушении окна поступит именно оконной процедуре, а не в стандартной очереди сообщения. Общий вид обработки этого сообщения такой:
  98.         break;
  99.  
  100.         case WM_LBUTTONDOWN: //если поступило сообщение о нажатии клавиши мыши
  101.         RECT click ; //RECT структура имеющаяя в своем описании координаты верхней левой и нижней правой точекпрямоугольника.
  102.         click.left = LOWORD(lParam);
  103.         click.top = HIWORD(lParam);
  104.         click.right = LOWORD(lParam) + 10 * ARRAYSIZE(g_lpszButtonDown);
  105.         click.bottom = HIWORD(lParam) + 15;
  106.         hDC = GetDC(hWnd);
  107.         DrawText(hDC, g_lpszButtonDown, ARRAYSIZE(g_lpszButtonDown), &click , DT_LEFT);
  108.         ReleaseDC(hWnd, hDC);
  109.  
  110.  
  111.         break;
  112.  
  113.         case WM_PAINT:
  114.         PAINTSTRUCT ps;
  115.         hDC = BeginPaint(hWnd, &ps);  //в этом обработчике для получения контекста отображения используется функция BeginPaint
  116.         TextOut(hDC, 20, 100, g_lpszPaint, ARRAYSIZE(g_lpszPaint)); //по заданию надо отрисовывать текст на форме, с координатами {20,100}
  117.    
  118.         TextOut(hDC, 50, 200, strokalistbox, ARRAYSIZE(strokalistbox)); //по заданию надо отрисовывать текст на форме, с координатами {20,100}
  119.         EndPaint(hWnd, &ps);
  120.         break;
  121.  
  122.         case WM_CREATE:
  123.         hDC = GetDC(hWnd);
  124.         MessageBox(NULL,g_lpszMassage,TEXT("MessageBox"),ARRAYSIZE(g_lpszMassage));
  125.        
  126.  
  127.         hButtonSave=CreateWindowEx(0L,"Button","Выход",
  128.         WS_CHILD|WS_BORDER|WS_VISIBLE,
  129.         20,
  130.         240,
  131.         80,
  132.         24,
  133.         hWnd,
  134.         (HMENU)(IDC_BTN_SAVE),
  135.         hInst,
  136.         NULL);
  137.  
  138.         //Создаем листбокс
  139.         hListBox=CreateWindow("ListBox", //Далее хотим сделась Лист,тогда szWindowClass должен быть 'ListBox', соответственно либо strcpy(szWindowClass,'ListBox');
  140.         NULL, //имя листбокса
  141.         (WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_HASSTRINGS)^LBS_SORT,
  142.         10, //начало (левый угол)
  143.         10, //начало (верхний угол)
  144.         150, //продлить (правый угол)
  145.         150, //продлить (нижний угол)
  146.         hWnd,
  147.         (HMENU)ID_LISTDAY,
  148.         hInst,
  149.         NULL);
  150.  
  151.         //Заполнение строк листбокса
  152.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Красный");
  153.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Оранжевый");
  154.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Желтый");
  155.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Зелёный");
  156.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Голубой");
  157.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Синий");
  158.         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Фиолетовый");
  159.  
  160.         //Создаём окно-список цветов (Создание элемента управления:)
  161.         hComboBox=CreateWindow("Combobox", NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_HASSTRINGS,
  162.         200,10,100,200, hWnd, (HMENU)ID_COMBODAY, hInst, NULL);
  163.         //Заполнение строк комбобокса
  164.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Красный");
  165.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Оранжевый");
  166.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Желтый");
  167.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Зеленый");
  168.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Голубой");
  169.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Синий");
  170.         SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)"Фиолетовый");
  171.         SendMessage(hComboBox, CB_SETCURSEL, 0, 0L);//После создания списка вид у него неприглядный. Он начинается пустой строкой. Чтобы сделать активной первую строку, вызовите функцию:
  172.  
  173.  
  174.  
  175.         return 0; //Убедитесь, что для последующего успешного создания окна, обработчик WM_CREATE должен возвращать 0.
  176.         //При возврате обработчиком этого сообщения значения (-1) главное окно не создается и функция CreateWndow (или CreateWindowEx) возвращает NULL
  177.        
  178.         case WM_SETFOCUS:
  179.         SetFocus(hListBox);
  180.         break;
  181.  
  182.  
  183.  
  184.  
  185.         case WM_COMMAND: //отлов сообщений, например в ListBox'e
  186. {
  187.  
  188.  
  189.     // тут LOWORD(wParam) = идентификатор листбокса, а lParam это HWND листбокса
  190.    switch(LOWORD(wParam))
  191.    {
  192.  
  193.         case IDC_BTN_SAVE:
  194.         {
  195.  
  196.             MessageBox(hWnd,"Введите текст","Читаем Edit",MB_OK);
  197.         }
  198.  
  199.         case ID_LISTDAY:
  200.             if (HIWORD(wParam) == LBN_DBLCLK) //по двойному щелчку мыши
  201.             {
  202.                 TCHAR lpszBuffer[MAX_PATH];
  203.  
  204.         int curSel; //переменная, показывающая номер строки ListBox'а
  205.         curSel = SendMessage (hListBox, LB_GETCURSEL, 0, 0); //записываем номер строки ListBox'a
  206.         itoa(curSel,strokalistbox,10);//конвертируем номер строки в текстовый формат
  207.  
  208.  //MessageBox(NULL, g_lpszDestroyMessage, TEXT(strokalistbox), MB_OK); //При закрытии приложения, происходит уведомление в окне "сообщение", с текстом g_lpszDestroyMessage ("Разрушается окно. В связи с этим поступило сообщение WM_DESTROY, из обработчика которого и выполнен данный вывод."), так-же добавляется кнопка OK
  209.  
  210.         RECT click; //RECT структура имеющаяя в своем описании координаты верхней левой и нижней правой точекпрямоугольника.
  211.         //RECT okno;
  212.         //GetWindowRect(hWnd, &okno); //получаем координаты окна программы
  213.         //click.left = 10;
  214.         //click.top = okno.bottom-100;
  215.         //click.right = 100 * ARRAYSIZE(strokalistbox);
  216.         //click.bottom = okno.bottom+10;
  217.  
  218.         click.left = 100;
  219.         click.top = 500;
  220.         click.right = 100 * ARRAYSIZE(strokalistbox);
  221.         click.bottom = 500 + 20;
  222.  
  223.                         hDC = GetDC(hWnd);
  224.  
  225.         switch (curSel)
  226.         {
  227.         case 0:
  228.         SetTextColor(hDC, 0x000000FF); //0x00BBGGRR
  229.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  230.         strcpy(colorlistboxstring,"Красный\0");
  231.  
  232.         break;
  233.         case 1:
  234.         SetTextColor(hDC, 0x005AFF);
  235.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  236.         strcpy(colorlistboxstring,"Оранжевый\0");
  237.         break;
  238.         case 2:
  239.         SetTextColor(hDC, 0x0000FFFF);
  240.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  241.         strcpy(colorlistboxstring,"Желтый\0");
  242.         break;
  243.         case 3:
  244.         SetTextColor(hDC, 0x0000FF00);
  245.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  246.         strcpy(colorlistboxstring,"Зеленый\0");
  247.         break;
  248.         case 4:
  249.         SetTextColor(hDC, 0xFFFF00);
  250.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  251.         strcpy(colorlistboxstring,"Голубой\0");
  252.         break;
  253.         case 5:
  254.         SetTextColor(hDC, 0x00FF0000);
  255.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  256.         strcpy(colorlistboxstring,"Синий\0");
  257.         break;
  258.         case 6:
  259.         SetTextColor(hDC, 0xFF00FF);
  260.         for(int i=0;i<20;i++)colorlistboxstring[i]=0;
  261.         strcpy(colorlistboxstring,"Фиолетовый\0");
  262.         break;
  263.  
  264.  
  265.         default:
  266. break;
  267.         }
  268.  
  269.  
  270.  
  271.         DrawText(hDC, colorlistboxstring, ARRAYSIZE(colorlistboxstring), &click , DT_LEFT);
  272.         ReleaseDC(hWnd, hDC);
  273.        
  274.             }
  275.         break;
  276.     }
  277.  
  278. }
  279.  
  280.  
  281.         default:
  282.         return(DefWindowProc(hWnd, msg, wParam, lParam));
  283.     }
  284.     return FALSE;
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement