Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2014, 11:51   #1
aysium
Новичок
Джуниор
 
Регистрация: 19.04.2014
Сообщений: 4
По умолчанию WinAPI. рисовалка

Должна меняться толщина и цвет линии по нажатию правой кнопки мыши, но не меняется
aysium вне форума Ответить с цитированием
Старый 19.04.2014, 11:53   #2
aysium
Новичок
Джуниор
 
Регистрация: 19.04.2014
Сообщений: 4
По умолчанию

Код:

LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0, 0, 0);
HDC hDC;
RECT rcClient;                 
POINT ptClientUL;             
POINT ptClientLR;              
static POINTS ptsBegin;       
static POINTS ptsEnd;         
static POINTS ptsPrevEnd;      
static BOOL fPrevLine = FALSE; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MessageBox(NULL, TEXT("Вход"), TEXT("Начать"), 0);


	WNDCLASSEX WindowClass;

	static LPCTSTR szAppName = L"WinApi";
	HWND hWnd;
	MSG msg;
	WNDCLASSEX wc;

	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(0, IDI_HAND);
	wc.hCursor = LoadCursor(0, IDC_ARROW);
	wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITENESS));
	wc.lpszMenuName = 0;
	wc.lpszClassName = szAppName;
	wc.hIconSm = 0;

	RegisterClassEx(&wc);
	hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	hDC = GetDC(hWnd);
	while (GetMessage(&msg, 0, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return static_cast<int>(msg.wParam);
}

LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

	PAINTSTRUCT PaintSt;
	RECT aRect;
	switch (message)

	{

	case WM_PAINT:
	{
		hDC = BeginPaint(hWnd, &PaintSt);
		GetClientRect(hWnd, &aRect);
		SetBkMode(hDC, TRANSPARENT);
		DrawText(hDC, L"Рис", -1, &aRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
		RECT widthRect = { 300, 0, 480, 50 }, widthValueRect = { 480, 0, 520, 50 },
		colorRect = { 520, 0, 630, 50 }, colorValueRect = { 630, 0, 900, 50 };

		RECT infoRect = { 300, 0, 900, 50 };
		FillRect(hDC, &infoRect, (HBRUSH)(COLOR_WINDOW + 1));
		DrawText(hDC, L"Текущая толщина линии:", -1, &widthRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
		DrawText(hDC, std::to_wstring(lineWidth).c_str(), -1, &widthValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
		DrawText(hDC, L"Текущий цвет:", -1, &colorRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
		std::wstringstream wss;
		wss << L"R: " << GetRValue(lineColor) << L" | " << L"G: " << GetGValue(lineColor) << L" | " << L"B: " << GetBValue(lineColor);
		DrawText(hDC, wss.str().c_str(), -1, &colorValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);


		HBRUSH hBrush;
		CreateSolidBrush(RGB(255, 0, 67));
		hBrush = CreateHatchBrush(HS_FDIAGONAL, RGB(255, 10, 20));
		SelectObject(hDC, hBrush);
		Ellipse(hDC, 100, 100, 200, 300);


		HPEN hPen1, hPen2, hPen3;
		hPen1 = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));
		hPen2 = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
		hPen3 = CreatePen(PS_DOT, 1, RGB(0, 128, 256));

		SelectObject(hDC, hPen1);
		Rectangle(hDC, 10, 10, 100, 100);

		SelectObject(hDC, hPen2);
		Arc(hDC, 10, 20, 30, 40, 50, 60, 300, 400);

		SelectObject(hDC, hPen3);
		RoundRect(hDC, 200, 100, 140, 150, 160, 170);
		EndPaint(hWnd, &PaintSt);
	}
		break;
	case WM_LBUTTONDOWN:
	
		SetCapture(hWnd);
		
		GetClientRect(hWnd, &rcClient);
		ptClientUL.x = rcClient.left;
		ptClientUL.y = rcClient.top;

		ptClientLR.x = rcClient.right + 1;
		ptClientLR.y = rcClient.bottom + 1;
		ClientToScreen(hWnd, &ptClientUL);
		ClientToScreen(hWnd, &ptClientLR);

		SetRect(&rcClient, ptClientUL.x, ptClientUL.y, ptClientLR.x, ptClientLR.y);
		ClipCursor(&rcClient);

		ptsBegin = MAKEPOINTS(lParam);
		return 0;

	case WM_RBUTTONDOWN:
	{
			lineWidth = rand() % 19 + 1;
			lineColor = RGB(rand() % 255, rand() % 255, rand() % 255);
			InvalidateRect(hWnd, NULL, TRUE);
	}
		break;
	case WM_MOUSEMOVE:
		
		if (wParam & MK_LBUTTON)
		{

			hDC = GetDC(hWnd);

			SetROP2(hDC, R2_NOTXORPEN);

			if (fPrevLine)
				{
					MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
					LineTo(hDC, ptsPrevEnd.x, ptsPrevEnd.y);
				}

			ptsEnd = MAKEPOINTS(lParam);
			MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
			LineTo(hDC, ptsEnd.x, ptsEnd.y);

			fPrevLine = TRUE;
			ptsPrevEnd = ptsEnd;
			ReleaseDC(hWnd, hDC);
		}
		break;
	case WM_LBUTTONUP:
	{
					//
						 ptsEnd.x = LOWORD(lParam);
						 ptsEnd.y = HIWORD(lParam);
						 //
						 
						 HPEN linePen;
						 linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
						 HGDIOBJ prevObj = SelectObject(hDC, linePen);
						 LineTo(hDC, ptsEnd.x, ptsEnd.y);
						 SelectObject(hDC, prevObj);
						 DeleteObject(linePen);
						 InvalidateRect(hWnd, NULL, TRUE);
						
						 
	}
		
		return 0;

	case WM_DESTROY:
		
		PostQuitMessage(0);
		return 0;

	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}



}
aysium вне форума Ответить с цитированием
Старый 19.04.2014, 23:34   #3
aysium
Новичок
Джуниор
 
Регистрация: 19.04.2014
Сообщений: 4
По умолчанию

никто не поможет ?
aysium вне форума Ответить с цитированием
Старый 20.04.2014, 09:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Слей коды из WM_LBUTTONUP и WM_RBUTTONDOWN в один обработчик в WM_RBUTTONDOWN к примеру.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.04.2014, 12:39   #5
aysium
Новичок
Джуниор
 
Регистрация: 19.04.2014
Сообщений: 4
По умолчанию

Stilet, не помогло
aysium вне форума Ответить с цитированием
Старый 20.04.2014, 13:38   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну я так не скажу. У меня не на чем тестить код увы...
А на глаз не определю ошибку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.04.2014, 17:14   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Да тут на глаз столько ошибок, что дальше ехать некуда.

Например, подсчитайте, сколько раз получается DC и посмотрите сколько переменных для хранения есть?

А кто будет удалять созданные объекты?

Если рисовать в коде WM_MOUSEMOVE то что будет если окно изменится (и выполнится WM_PAINT)? Весь код рисования должен быть в одном месте, сообщения должны только делать InvalidateRect().

Надо иметь очень хорошую причину делать return 0 из обработчика сообщений. Если не знаете что делаете, надо передавать все сообщения в DefWindowProc()
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простая рисовалка Name1ess C# (си шарп) 7 19.11.2012 00:48
Интересная рисовалка rpy3uH Свободное общение 7 15.11.2012 08:56
Рисовалка на рабочем столе Downloads Общие вопросы Delphi 10 27.06.2012 23:12
Рисовалка, Операционные системы sharick Помощь студентам 2 11.05.2011 16:41
Рисовалка на сайте П@вел HTML и CSS 2 03.04.2009 11:55