
- •Файл Laba12.Cpp:
- •Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
- •If (!RegClass(WndProc,szClassName,color_window))
- •If (!hwnd) return false;
- •Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
- •If (!RegClass(WndProc,szClassName,color_window))
- •If (!hwnd) return false;
- •Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
- •If (!RegClass(WndProc,szClassName,color_window))
- •If (!hwnd) return false;
- •If (!hThread)
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;
}