Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Velikaya_shpora_lr_9.doc
Скачиваний:
3
Добавлен:
18.09.2019
Размер:
2.04 Mб
Скачать

Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)

{ MSG msg; HWND hwnd;

If (!RegClass(WndProc,szClassName,color_window))

return FALSE;

hwnd=CreateWindow(szClassName,"Сумма векторов",

WS_OVERLAPPEDWINDOW|WS_VISIBLE,

CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL);

If (!hwnd) return false;

while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);

return (int) msg.wParam;

}

BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)

{ WNDCLASS wc; wc.style=CS_HREDRAW|CS_VREDRAW;

wc.cbClsExtra=wc.cbWndExtra=0; wc.lpfnWndProc=Proc;

wc.hInstance=hInstance; wc.lpszClassName=szName;

wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);

wc.lpszMenuName=NULL;

return (RegisterClass(&wc)!=0);

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)

{ static HANDLE hThread;

switch(msg)

{ case WM_CREATE:

ts.hwnd=hwnd;

ts.v1[0]=2;

ts.v1[1]=5;

ts.v2[0]=7;

ts.v2[1]=1;

hThread=CreateThread(NULL,0,ThreadFunc,&ts,0,NULL);

If (!hThread)

MessageBox(hwnd,"Error of create hThread",NULL,MB_OK);

break;

case WM_DESTROY:

CloseHandle(hThread);

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd,msg,wParam,lParam);

}

return 0;

}

DWORD WINAPI ThreadFunc(PVOID pvParam)

{ ThreadStr* pTs = (ThreadStr*)pvParam;

HDC hdc;

PAINTSTRUCT ps;

COLORREF lineColor=RGB(0,255,0);

HPEN pen;

int v[2];

char str[10];

hdc=BeginPaint(pTs->hwnd,&ps);

pen=CreatePen(PS_SOLID,1,lineColor);

SelectObject(hdc,pen);

for(int i=0;i<2;i++)

{ v[i]=pTs->v1[i]+pTs->v2[i];

sprintf(str,"v[%d]=%d",i,v[i]);

TextOut(hdc,100,i*20+200,str,strlen(str));

}

DeleteObject(pen);

EndPaint(pTs->hwnd,&ps);

return 0;

}

. Создать в приложении вторичный поток, входная функция которого вычисляет значение многочлена в точке X и выводит результат в окно. Степень, коэффициенты многочлена, значение X и дескриптор окна передать входной функции вторичного потока в качестве параметра.

#include <windows.h>

#include <stdio.h>

#include <string.h>

#define ID_EDIT1 1001

#define ID_EDIT2 1002

#define ID_EDIT3 1003

#define ID_EDIT4 1004

#define ID_BUTTON 1004

#define NMAX 10

LONG MyWinP(HWND, UINT,WPARAM,LPARAM); //прототип оконной функции

DWORD WINAPI ThreadFunc(LPVOID data);

struct _Data{

HWND hWn;

int n;

float x;

float mas[NMAX];

_Data()

{

n = 0;

x = 0;

}

};

int WINAPI WinMain

(

HINSTANCE hInstance, // дескриптор текущего экземпляра окна

HINSTANCE hPrevInstance, // дескриптор предыдущего экземпляра окна

LPSTR lpCmdLine, // указатель на командную строку

int nCmdShow // показывает состояние окна

)

{

char ProgName[]="my window";

char Title[]="Заголовок окна";

HWND hWnd;

MSG msg; //структура, содержащая описание сообщений

WNDCLASS w; //структура атрибутов класса окна

//поля этой структуры:

w.lpszClassName=ProgName; //имя класса окна

w.hInstance=hInstance; // логический номер экземпляра приложения

w.lpfnWndProc=(WNDPROC)MyWinP; //указатель на оконную процедуру

w.hCursor=LoadCursor(NULL, IDC_ARROW); //форма курсора (NULL - курсор по умолчанию)

w.hIcon=LoadIcon(hInstance, ProgName); //загрузить иконку

w.lpszMenuName=NULL; //имя ресурса меню

w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);

w.style=CS_HREDRAW | CS_VREDRAW; //перерисовать все окно, если меняется ширина или длина

w.cbClsExtra=0; //задает число байт, которое необходимо дополнительно запросить у Windows под эту структуру для хранения собственных данных, присоединенных к классу

w.cbWndExtra=0; //задает число байт, которое необходимо дополнительно запросить у Windows для размещения всех структур, создаваемых совместно с данным классом, для хранения собственных данных, присоединенных к окну.

//регистрация оконного класса - связывания оконной процедуры с окном приложения

if(!RegisterClass(&w)) return false;

//Создание окна

hWnd=CreateWindow(ProgName, Title, WS_VISIBLE |WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,100, 100, 300, 300, NULL, NULL, hInstance, NULL);

ShowWindow(hWnd, nCmdShow);

//Перерисовка окна

UpdateWindow(hWnd);// посылается сообщение WM_PAINT, которое заставляет перерисовывать окно

//цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

//Оконная процедура

LONG MyWinP(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){

static HWND edit[4], but;

static float mas[NMAX], x= 1.0;

static int n = NMAX;

switch(msg){

case WM_CREATE:

edit[0]=CreateWindow( "edit" ,NULL,

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 10, 30, 65, 25, hWnd, (HMENU)(ID_EDIT1), NULL, NULL);

edit[1]=CreateWindow( "edit" ,NULL,

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 150, 30, 65, 25, hWnd, (HMENU)(ID_EDIT2), NULL, NULL);

edit[2]=CreateWindow( "edit" ,NULL,

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 10, 70, 205, 25, hWnd, (HMENU)(ID_EDIT3), NULL, NULL);

but=CreateWindow( "button" ,"Посчитать",

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 100, 205, 25, hWnd, (HMENU)(ID_BUTTON), NULL, NULL);

/*for (int i=0; i < n; i++)

mas[i] = i;*/

break;

case WM_COMMAND:

switch(LOWORD(wParam)){

case ID_BUTTON: {

_Data data = _Data();

char s[10], s2[10], s3[100];

double l;

DWORD rez;

HANDLE hThread;

GetDlgItemText(hWnd, ID_EDIT1, s, strlen(s));

data.n = atoi(s);

GetDlgItemText(hWnd, ID_EDIT2, s2, strlen(s2));

data.x = atof(s2);

GetDlgItemText(hWnd, ID_EDIT3, s3, strlen(s3));

int j = 0, k;

for (int i=0; i<= data.n; i++){

k = 0;

strcpy(s, "");

while (s3[j] !=' ' && j < strlen(s3)){

s[k] = s3[j];

j++;

k++;

}

j++;

data.mas[i] = atof(s);

}

data.hWn = hWnd;

hThread = CreateThread( NULL, 0, ThreadFunc, &data, 0, &rez);

WaitForSingleObjectEx(hThread, 1000, false);

CloseHandle(hThread);

return 1;

// break;

}

}

break;

case WM_DESTROY: //сообщение на уничтожение окна

PostQuitMessage(0);

return 0;

break;

default: //все сообщения, не обрабатываемые в данной функции, направляются на обработку по умолчанию

return DefWindowProc(hWnd, msg, wParam, lParam);

}

return 0;

}

DWORD WINAPI ThreadFunc( LPVOID data) {

// создание мьютекса в занятом состоянии

HANDLE hMut = CreateMutex( NULL, TRUE, NULL);

float Res = 0;

char s[10];

_Data *tdata = (_Data*) data;

//нахождение значения многочлена

for (int i = 0; i <= tdata->n; i++){

Res = Res * tdata->x;

Res = Res + tdata->mas[i];

}

sprintf(s,"%f",Res);

MessageBox(tdata->hWn, s, "Результат", MB_OK);

// освобождение мьютекса

ReleaseMutex(hMut);

return 1;

}

Создать в приложении вторичный поток, входная функция которого рисует окружность. Координаты центра, радиус, дескрипторы окна и контекста устройства передать входной функции вторичного потока в качестве параметра.

#include <windows.h>

#include <WindowsX.h>

#include <string>

#include <conio.h>

#include <gdiplus.h>

using namespace std;

using namespace Gdiplus;

#pragma comment(lib, "gdiplus.lib")

#define ID_BUTTONDRAW 1001

#define ID_EDITX 1002

#define ID_EDITY 1003

#define ID_RADIUS 1004

HWND mainWindow;

HWND buttonDraw;

HWND editX;

HWND editY;

HWND rad;

HINSTANCE hInstance;

ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

DWORD WINAPI _DrawEllipse(LPVOID data);

static CRITICAL_SECTION criticalSection;

struct _TData

{

HDC dc;

int ox;

int oy;

int radius;

_TData()

{

dc = 0;

ox = oy = radius = 0;

}

};

DWORD WINAPI _DrawEllipse(LPVOID data)

{

EnterCriticalSection( &criticalSection );

_TData *tdata = (_TData*) data;

Graphics gr(tdata->dc);

gr.DrawEllipse (new Pen( Color (1 , 1, 0)), tdata->ox, tdata->oy, tdata->radius, tdata->radius);

LeaveCriticalSection( &criticalSection );

return 1;

}

HWND createMainWindow()

{

LPCTSTR lpzClass = TEXT("My Window Class");

if(!RegMyWindowClass(hInstance, lpzClass))

return (HWND)0;

RECT screen;

GetWindowRect(GetDesktopWindow(), &screen);

int width, height;

width = 600;

height = 480;

int x = screen.right/2 - 155, y = screen.bottom/2 - 150;

HWND hWnd = CreateWindow(lpzClass, L"Лабораторная работа №9",

WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,

x, y, width, height, NULL, NULL, hInstance, NULL);

return hWnd;

}

ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)

{

WNDCLASS wcWindowClass = {0};

wcWindowClass.lpfnWndProc = (WNDPROC)WndProc; //Функция обработки сообщений

wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;//Стиль

wcWindowClass.hInstance = hInst;//Дескриптор экземпляра приложения

wcWindowClass.lpszClassName = lpzClassName;//Имя класса

wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);//Установка курсора

wcWindowClass.hbrBackground = (HBRUSH) COLOR_APPWORKSPACE;//Цвет фона

return RegisterClass(&wcWindowClass);//Регистрация класса

}

HWND createButton(LPCWSTR caption, int x, int y, int width, int height, HWND aHWND, unsigned int id)

{

HWND button = CreateWindow(L"button", caption,

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

x, y, width, height,

aHWND, (HMENU) id,

hInstance, NULL);

return button;

}

HWND createLabelLeftAlign(LPCWSTR caption, int x, int y, int width, int height, HWND aHWND, unsigned int id)

{

HWND hWndStatic = CreateWindow(L"static", caption,

WS_CHILD | WS_VISIBLE | SS_LEFT | CS_PARENTDC,

x,y,width,height,

aHWND,(HMENU) id, hInstance,NULL);

return hWndStatic;

}

HWND createEdit(int x, int y, int width, int height, HWND aHWND, unsigned int id)

{

HWND hWndEdit = CreateWindow(L"edit", NULL,

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_NUMBER,

x, y, width, height,

aHWND,(HMENU) id, hInstance, NULL);

Edit_LimitText(hWndEdit, 20);

return hWndEdit;

}

void addStringToListBox(HWND aHWND, LPCWSTR str)

{

ListBox_AddString(aHWND, str);

}

void setText(HWND aHWND, LPCWSTR text)

{

SetWindowText(aHWND, text);

}

int getIntegerFromControl(HWND aHWND)

{

LPWSTR lpString;

lpString = new WCHAR[GetWindowTextLength(aHWND) + 1];

GetWindowText(aHWND, lpString, GetWindowTextLength(aHWND) + 1);

wstring s;

s.append(lpString);

int number = _wtoi(s.c_str());

return number;

}

void UpdateMainWindow ( )

{

RECT r = { 0 };

::GetClientRect ( mainWindow, &r );

::InvalidateRect ( mainWindow, &r, TRUE );

::UpdateWindow ( mainWindow );

}

int APIENTRY WinMain(HINSTANCE ahInstance,//Адрес начала кода программы в ее адресном пространстве

HINSTANCE hPrevInstance,//не пригодится

LPSTR lpCmdLine,//указатель на начало командной строки

int nShowCmd)//вид отображение окна

{

hInstance = ahInstance;

mainWindow = createMainWindow();

InitializeCriticalSection( &criticalSection );

GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR gdiplusToken;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

editX = createEdit(130, 400, 80, 20, mainWindow, ID_EDITX);

editY = createEdit(270, 400, 80, 20, mainWindow, ID_EDITY);

rad = createEdit(410, 400, 80, 20, mainWindow, ID_RADIUS);

buttonDraw = createButton(L"DRAW", 180, 425, 280, 20, mainWindow, ID_BUTTONDRAW);

if(!mainWindow) return 2;

MSG msg = {0};//Структура сообщения

int iGetOk = 0;//Переменная состояния

while((iGetOk = GetMessage(&msg, NULL, 0, 0)) != 0)

{

if(iGetOk == -1) return 3;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

GdiplusShutdown(gdiplusToken);

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch(message)

{

case WM_COMMAND:

{

switch(LOWORD(wParam))

{

case ID_BUTTONDRAW:

{

UpdateMainWindow();

break;

}

}

break;

}

case WM_PAINT:

{

PAINTSTRUCT ps = { 0 };

HDC dc = ::BeginPaint (mainWindow, &ps);

_TData tdata = _TData ();

tdata.dc = dc;

tdata.ox = getIntegerFromControl(editX);

tdata.oy = getIntegerFromControl(editY);

tdata.radius = getIntegerFromControl(rad);

DWORD id;

HANDLE hThread = ::CreateThread( 0, 0, _DrawEllipse, &tdata, 0, &id);

WaitForSingleObjectEx(hThread, 1000, false);

::EndPaint(mainWindow, &ps);

return 1;

}

case WM_DESTROY:

{

PostQuitMessage(0);

break;

}

default:

{

return DefWindowProc(hWnd, message, wParam, lParam);

}

}

return 0;

}

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