Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Лабораторная работа №1
по дисциплине «_____________________________________________________»
на тему______________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________
Студент_____________________________________________________________
Группа________________________
Оценка ________________________ (в баллах)
Проверил ________________________ _____________________ (подпись и дата подписания) (инициалы и фамилия)
Волжский, 2014 г.
Цель работы: Изучение структуры приложений Windows, способов их взаимодействия с операционной системой и основных приемов программирования в API Win32. Вариант задания: 18. Формируется список для выбора стилей простого редактора текста (ES_AUTOHSCROLL, ES_AUTOVSCROLL, ES_LEFT, ES_RIGHT, ES_CENTER, ES_LOWERCASE, ES_UPPERCASE, ES_PASSWORD, ES_NUMBER, ES_OEMCONVERT), две кнопки и статическое окно. Нажатие на первую кнопку приводит к созданию многострочного текстового редактора с заданными стилями. Нажатие на вторую кнопку отображает выделенный пользователем текст в статическом окне. 18. Формируется 3 радиокнопки и статическое окно. Радиокнопки определяют содержимое статического окна (12ти часовой формат времени, 24х часовой формат времени, текущая дата).
Ход решения: Задача №1
#include < windows.h> HINSTANCE hInstance; HWND hWnd; HWND hlistbox, hedit, hedit1, Hstatic; int ultem; #define ID_edit 40 BYTE chBuff[80]; LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM LParam) Функция CallWindowProc передает информацию сообщения процедуре заданного окна { switch (msg) { case WM_COMMAND: Сообщение WM_COMMAND отправляется тогда, когда пользователь выбирает командный пункт из меню, когда орган управления отправляет уведомительное сообщение своему родительскому окну, или когда транслируется нажатие клавиши - ускорителя if(wParam == 20) { WORD cbText; * (WORD *) chBuff = sizeof (chBuff) - 1; hedit1=CreateWindow(TEXT(" edit"), TEXT(" "), ES_MULTILINE | ES_AUTOHSCROLL | WS_DLGFRAME | WS_CHILD | WS_VISIBLE, 0, 0, 1, 1, hWnd, (HMENU)ID_edit, hInstance, 0); На мой взгляд эта функция является одной из главной. Ведь именно она создаёт окна в системе. SendMessage(hedit, WM_COPY, 0, 0); Посылает сообщение оконной функции указанного окна. Возвpат из функции осуществляется только после обpаботки сообщения. SendMessage(hedit1, WM_PASTE, 0, 0); SendMessage(hedit1, EM_GETLINE, 0, (LPARAM)(LPSTR)chBuff); MessageBox(hWnd, (LPCWSTR)(LPARAM)(LPSTR)chBuff, TEXT(" содержимое буфера"), MB_OK); Функция MessageBox создает, отображает на экране и оперирует окном сообщений. Окно сообщений содержит определяемое программой сообщение и заголовок, плюс любую комбинацию предопределенных пиктограмм и командных кнопок. }
if (wParam==10) { MessageBox(hWnd, TEXT(" Привет я кнопка! Зачем ты меня нажал? "), TEXT(" Монолог"), 0); ultem=(int)SendMessage(hlistbox, LB_GETCURSEL, 0, 0L);
if (ultem==0) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_MULTILINE | ES_AUTOHSCROLL | WS_DLGFRAME | WS_CHILD | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==1) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_AUTOVSCROLL | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==2) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_LEFT | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==3) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_RIGHT | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==4) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_CENTER | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==5) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_LOWERCASE | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==6) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_UPPERCASE | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==7) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_PASSWORD | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==8) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_NUMBER | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
if (ultem==9) hedit=CreateWindow(TEXT(" edit"), TEXT(" "), ES_OEMCONVERT | WS_DLGFRAME | WS_CHILD | ES_MULTILINE | WS_VISIBLE, 250, 10, 200, 100, hWnd, (HMENU)ID_edit, hInstance, 0);
break; }
if (wParam==20) { MessageBox(hWnd, TEXT(" Привет я кнопка! хорош!!! "), TEXT(" Монолог"), 0); Hstatic=CreateWindow(TEXT(" static"), (LPCWSTR)(LPARAM)(LPSTR)chBuff, WS_DLGFRAME | WS_CHILD | WS_VISIBLE, 250, 210, 200, 25, hWnd, (HMENU)50, hInstance, 0); }
break;
case WM_DESTROY: Это сообщение посылается когда необходимо уничтожить окно. PostQuitMessage(0); В ответ на это сообщение мы должны поместить в очередь сообщение WM_QUIT. Это и делает функция PostQuitMessage() посылая в очередь это сообщение и говоря, что процесс должен быть завершен. break; } return DefWindowProc(hWnd, msg, wParam, LParam); Обеспечивает стандаpтную обpаботку сообщений для сообщений, котоpые явно не обpабатываются пpикладной задачей. }
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE h2, LPSTR cmd, int cmShaw) { WNDCLASS wc={0}; wc.lpszClassName=TEXT(" Myclass"); wc.lpfnWndProc=WndProc; RegisterClass(& wc);
hWnd=CreateWindow(wc.lpszClassName, TEXT(" Моя форма"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, 0, 0, hInstance, 0); она создаёт окна в системе CreateWindow(TEXT(" button"), TEXT(" Кнопка Сергея"), WS_CHILD | WS_VISIBLE, 250, 100, 200, 100, hWnd, (HMENU)10, hInstance, 0); CreateWindow(TEXT(" button"), TEXT(" Ещё одна кнопка Сергея"), WS_CHILD | WS_VISIBLE | WM_COPY, 10, 100, 200, 100, hWnd, (HMENU)20, hInstance, 0);
hlistbox=CreateWindow(TEXT(" listbox"), NULL, LBS_WANTKEYBOARDINPUT | WS_VSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE, 10, 10, 200, 100, hWnd, (HMENU)30, hInstance, 0); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_AUTOHSCROLL")); Посылает сообщение оконной функции указанного окна. Возвpат из функции осуществляется только после обpаботки сообщения SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_AUTOVSCROLL")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_LEFT")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_RIGHT")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_CENTER")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_LOWERCASE")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_UPPERCASE")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_PASSWORD")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_NUMBER")); SendMessage(hlistbox, LB_ADDSTRING, 0, (LPARAM)TEXT(" ES_OEMCONVERT")); MSG msg; while (GetMessage(& msg, NULL, 0, 0)) Эта функция извлекает сообщение из очереди { TranslateMessage(& msg); Эта функция переводит сообщения формата виртуальных клавиш в сообщения символы DispatchMessage(& msg); Эта функция пересылает сообщение оконной процедуре } return 0; }
Задача №2
#include < windows.h> #include < ctime> HINSTANCE hInstance; HWND hWnd; HWND Hstatic; #define ID_button1 10 HWND hbutton1; HWND hbutton2; HWND hbutton3; int a=0;
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM LParam) { switch (msg) { case WM_COMMAND: if(wParam == 10) { SendMessage(hbutton1, BM_SETCHECK, BST_CHECKED, 0); SendMessage(hbutton2, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage(hbutton3, BM_SETCHECK, BST_UNCHECKED, 0); a=1; }
if(wParam == 20) { SendMessage(hbutton1, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage(hbutton2, BM_SETCHECK, BST_CHECKED, 0); SendMessage(hbutton3, BM_SETCHECK, BST_UNCHECKED, 0); a=2; }
if(wParam == 30) { SendMessage(hbutton1, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage(hbutton2, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage(hbutton3, BM_SETCHECK, BST_CHECKED, 0); a=3; }
switch (a) { case 1: { char buffer[80]; TCHAR a11; time_t seconds = time(NULL); способен представлять время и поддерживает арифметические операции. tm* timeinfo = localtime(& seconds); преобразует число секунд типа t_time в структуру типа tm char* format = " %H: %M: %S"; strftime(buffer, 80, format, timeinfo); помещает информацию о времени и дате в строку, адресуемую параметром str a11=(LPARAM)(TCHAR)buffer; long uLen = MultiByteToWideChar(CP_ACP Система Windows по умолчанию кодовую страницу ANSI, 0, buffer, -1, NULL, NULL); уют строку однобайтовых символов в строку Unicode WCHAR * lpszW = new WCHAR[uLen]; MultiByteToWideChar(CP_ACP, 0, buffer, uLen, lpszW, uLen); MessageBox(hWnd, (LPCWSTR)lpszW, TEXT(" Монолог"), 0);
Hstatic=CreateWindow(TEXT(" static"), (LPCWSTR)lpszW, WS_DLGFRAME | WS_CHILD | WS_VISIBLE, 250, 210, 200, 25, hWnd, (HMENU)50, hInstance, 0); } break; case 2: { char buffer[80]; time_t seconds = time(NULL); tm* timeinfo = localtime(& seconds); char* format = " %I: %M: %S"; strftime(buffer, 80, format, timeinfo); long uLen = MultiByteToWideChar(CP_ACP, 0, buffer, -1, NULL, NULL); WCHAR * lpszW = new WCHAR[uLen]; MultiByteToWideChar(CP_ACP, 0, buffer, uLen, lpszW, uLen); MessageBox(hWnd, (LPCWSTR)lpszW, TEXT(" Монолог"), 0);
Hstatic=CreateWindow(TEXT(" static"), (LPCWSTR)lpszW, WS_DLGFRAME | WS_CHILD | WS_VISIBLE, 250, 210, 200, 25, hWnd, (HMENU)50, hInstance, 0); } break; case 3: { char buffer[80]; time_t seconds = time(NULL); tm* timeinfo = localtime(& seconds); char* format = " %A, %B, %d, %Y, %H: %M: %S"; strftime(buffer, 80, format, timeinfo); long uLen = MultiByteToWideChar(CP_ACP, 0, buffer, -1, NULL, NULL); WCHAR * lpszW = new WCHAR[uLen]; MultiByteToWideChar(CP_ACP, 0, buffer, uLen, lpszW, uLen); MessageBox(hWnd, (LPCWSTR)lpszW, TEXT(" Монолог"), 0); Hstatic=CreateWindow(TEXT(" static"), (LPCWSTR)lpszW, WS_DLGFRAME | WS_CHILD | WS_VISIBLE, 250, 210, 200, 25, hWnd, (HMENU)50, hInstance, 0); } break;
default: MessageBox(hWnd, TEXT(" Привет вы нечего не нажали! Зачем вы так? "), TEXT(" Монолог"), 0); break; } break;
case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wParam, LParam); }
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE h2, LPSTR cmd, int cmShaw) { WNDCLASS wc={0}; wc.lpszClassName=TEXT(" Myclass"); wc.lpfnWndProc=WndProc; RegisterClass(& wc);
HWND hWnd=CreateWindow(wc.lpszClassName, TEXT(" Моя форма"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, 0, 0, hInstance, 0); hbutton1=CreateWindow(TEXT(" button"), TEXT(" 24 x"), BS_RADIOBUTTON | WS_VISIBLE | WS_CHILD, 10, 100, 200, 15, hWnd, (HMENU)10, hInstance, 0); hbutton2=CreateWindow(TEXT(" Button"), TEXT(" 12 x"), BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 10, 115, 200, 15, hWnd, (HMENU)20, hInstance, 0); hbutton3=CreateWindow(TEXT(" Button"), TEXT(" Ещё одна кнопка Сергея"), BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 10, 130, 200, 15, hWnd, (HMENU)30, hInstance, 0);
MSG msg; while (GetMessage(& msg, NULL, 0, 0)) { TranslateMessage(& msg); DispatchMessage(& msg); } return 0; }
|