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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2011, 10:58   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию нарисовать линию по нажатию мыши

в вин32 прожект по нажатию ЛКМ надо нарисовать на окошке линию, нажали еще раз - стерли линию. и так до одурения. как сделать?

я написал чтобы при запуске приложения линия рисовалась, а как отловить нажатие ЛКМ и где это добавить?
Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...

		{
			HPEN hpen,hPenOld;
			hpen = CreatePen(PS_SOLID,3,RGB(255,0,0)) ;
			hPenOld = (HPEN)SelectObject(hdc,hpen);

			MoveToEx(hdc,0,0,NULL);
			LineTo(hdc,1005,460);

			SelectObject(hdc,hPenOld);
			DeleteObject(hpen);
		}

		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Kukurudza вне форума Ответить с цитированием
Старый 26.09.2011, 13:59   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK
counter вне форума Ответить с цитированием
Старый 27.09.2011, 08:50   #3
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	static int i = 0;

	switch (message)
	{
	case WM_LBUTTONDOWN:
		{
			hdc = BeginPaint(hWnd, &ps);
			{
				HPEN hpen,hPenOld;
				if ( i )
				{
					i = 0;
					hpen = CreatePen(PS_SOLID,3,RGB(255,0,0)) ;
				}
				else
				{
					i = 1;
					hpen = CreatePen(PS_SOLID,3,RGB(255,255,255)) ;
				};
				hPenOld = (HPEN)SelectObject(hdc,hpen);

				MoveToEx(hdc,0,0,NULL);
				LineTo(hdc,1005,460);

				SelectObject(hdc,hPenOld);
				DeleteObject(hpen);
			}
			EndPaint(hWnd, &ps);
			break;
		}
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...

		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
не работает
Kukurudza вне форума Ответить с цитированием
Старый 27.09.2011, 11:57   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Код рисования должен остаться в секции case WM_PAINT, а в секции case WM_LBUTTONDOWN должен быть флаг, проверка которого осуществляется в case WM_PAINT, примерно так:
Код:
...
static bool lineEnabled = false;
...
case WM_LBUTTONDOWN:
{
    lineEnabled = true;
    break;
}
case WM_LBUTTONUP:
{
    lineEnabled = false;
    break;
}
case WM_PAINT:
{
    if (lineEnabled)
    {
        // код рисования
    }
    break;
}
...
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 27.09.2011, 14:25   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

BeginPaint(hWnd, &ps) только для сообщения WM_PAINT, в остальных случаях нужно использовать GetDC/ReleaseDC, но делать надо как Blade.
counter вне форума Ответить с цитированием
Старый 27.09.2011, 14:43   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Кстати, я судя по всему немного не так понял задание, в моем варианте линия будет нарисована только пока нажата ЛКМ, как только отпустили перестанет рисоваться.
Для исправления нужно изменить секцию case WM_LBUTTONDOWN
Код:
...
case WM_LBUTTONDOWN:
{
    lineEnabled = !lineEnabled;
    break;
}
...
а секция case WM_LBUTTONUP не нужна
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 27.09.2011, 15:36   #7
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

сделал. но так тоже на работает
Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	static bool lineEnabled = false;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;

	case WM_LBUTTONDOWN:
	{
		lineEnabled = !lineEnabled;
		break;
	}

	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		if (lineEnabled)
		{
				HPEN hpen,hPenOld;
				hpen = CreatePen(PS_SOLID,3,RGB(255,0,0)) ;
				hPenOld = (HPEN)SelectObject(hdc,hpen);
				MoveToEx(hdc,0,0,NULL);
				LineTo(hdc,1005,460);
				SelectObject(hdc,hPenOld);
				DeleteObject(hpen);
		}
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Kukurudza вне форума Ответить с цитированием
Старый 27.09.2011, 16:49   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
RECT rct;
...

case WM_LBUTTONDOWN:
	{
		lineEnabled = !lineEnabled;
                      GetClientRect(hWnd,&rct);
                      InvalidateRect(hWnd,&rct);
		break;
	}
а так?
counter вне форума Ответить с цитированием
Старый 27.09.2011, 20:00   #9
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

Да, спасибо заработало. что это вы сделали?
Kukurudza вне форума Ответить с цитированием
Старый 27.09.2011, 20:07   #10
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Перерисовал окно.
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как нарисовать необычную линию Marsel737 Общие вопросы Delphi 2 17.05.2011 20:03
Delphi7 помогите нарисовать линию AlexandЯ Помощь студентам 15 12.05.2009 12:23
Как нарисовать линию по пикселям DenLab Общие вопросы Delphi 4 03.12.2008 09:34
Нарисовать на координатной площади линию a*x+b*y+c=0 НУБ!!! Общие вопросы Delphi 4 13.05.2008 22:48
Нарисовать линию под указанным градусом nikleb Паскаль, Turbo Pascal, PascalABC.NET 7 06.02.2008 15:22