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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2012, 16:55   #1
Arigat0
Новичок
Джуниор
 
Регистрация: 27.02.2012
Сообщений: 2
По умолчанию Работа с графикой

Потиху изучаю WinAPI, и в последствии возникло пару проблем, которые пока не получается решить:
1) у меня есть 7 кнопок, каждая из них отвечает за свои действия. Как обрабатывать ситуации, когда нужны координаты мышки запомнить, причем для эллипса, круга, прямоугольника, и пр, для их рисования это необходимо?
2) как ограничить область рисования, не затрагивая панель, с кнопками?
3) Почему на фрагменте, связанном с рисованием линии, ее как таковую не рисует? Хотя перо создано, цвет задан также?

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

	ps.rcPaint.bottom=49;
	ps.rcPaint.left=134;
	// каждую итерацию цикла проверяется очередь сообщений приложения. 
	// И если в очереди сообщений есть сообщение, то оно вытаскивается из очереди.
	switch(message)
	{
		// разбор команды
		case WM_COMMAND:
			// реакция на нажатие одной из кнопок
			switch(LOWORD(wParam))
			{
				case 10000: 
					int cntPT=0;
					POINT begin,end;
					HDC hDC = ::GetDC(hWnd);
					HPEN hPen = CreatePen(PS_SOLID, 3, RGB(128, 128, 0));
					while(WM_LBUTTONDOWN && cnt!=2)
					{
						switch(cnt)
						{
							case 0:
								begin.x = LOWORD(lParam); //x
								begin.y = HIWORD(lParam); //y
								break;
							case 1:
								end.x = LOWORD(lParam);	  //x
								end.y = HIWORD(lParam);	  //y
								break;
						}
					}
					DrawLine(hDC,begin.x,begin.y,end.x,end.y);
					InvalidateRect(hWnd,NULL,1);
					::ReleaseDC(hWnd,hDC);
					break; /*
				case 10001: 
					break;
				case 10002: 
					break;
				case 10003: 
					break;
				case 10004: 
					break;
				case 10005: 
					break;
				case 10006: 
					break; */
            }
			// получаем параметры
			wmId    = LOWORD(wParam);
			wmEvent = HIWORD(wParam);
			// Выбор в меню:
			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);
			EndPaint(hWnd, &ps);
			break;
		// закрытие формы
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Arigat0 вне форума Ответить с цитированием
Старый 06.09.2012, 18:21   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

1. эммм... нужно выпить...
2. что такое "панель с кнопками" ?
3. потому что:
а) перо нужно выбрать в контекст устройства SelectObject
б) ты затираешь нарисованную линию, когда приходит WM_PAINT, поэтому рисовать нужно в памяти и в WM_PAINT выводить изображение из памяти

в WM_COMMAND вообще чудеса непонятные творятся...
counter вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с графикой, СИ Newb1e Помощь студентам 3 25.06.2012 16:51
работа с графикой shrek1993 Общие вопросы C/C++ 5 13.04.2012 18:58
работа с графикой mrCloud C# (си шарп) 3 17.06.2011 14:25
Работа с графикой фыф123 Помощь студентам 2 12.06.2011 18:59
Работа с графикой Dark Espeon Помощь студентам 1 06.04.2011 22:40