Графика в MS Visual 2005 C++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

31 окт 2008, 08:45

Ты меня невнимательно читаешь, вот в чём главная проблема. Когда я писал CDocument, я имел ввиду именно этот класс, а не его наследника, который был сгенерирован студией. CDocument является базовым для всех классов-документов, в том числе и для твоего класса-документа - CdevelopingDoc.

Если в твоем классе-документе уже переопределён метод OnNewDocument (что, на самом деле, так и есть, исходя из твоего предыдущего поста), то в этом случае ничего никуда не нужно копировать. Достаточно только отимплементить тело метода.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

31 окт 2008, 15:02

Достаточно только отимплементить тело метода.
А это как? оО впервые слышу такое слово
Си ++
Здоровье --
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

01 ноя 2008, 10:14

&quot писал(а):Достаточно только отимплементить тело метода.
А это как? оО впервые слышу такое слово
Аааа! Где смайл, где человечек бьётся головой о стену?

По этому и предыдущему моему посту должно быть понятно, что алгоритм по заполнению массива нужно размесить в теле метода OnNewDocument и всё, больше ничего не требуется. Для понимания этого достаточно наличия обычный логики, даже не нужно знать что такое implementation (хотя это и смешно не знать).

Пробуй эксперементировать. Ты же программистом собираешься быть. Ожидание детальных разъяснений и разжевываний - удел слабых духом. Из таких редко получаются путёвые программисты. Не уподобляйся им и стремись расти над собой!
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

21 ноя 2008, 22:18

Итак. Я плюнул на MFC и как мне тут раньше советовали умные люди начал писать тоже самое в Win32. Получилось.
Теперь мне нужно узнать последнюю вещь: как сделать задержку (переключение) между множеством точек которые я вывел на экран и гистограммой, которая рисуется после точек (но так чтобы точки можно было успеть рассмотреть).
Си ++
Здоровье --
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

22 ноя 2008, 09:42

Используй таймер. Смотри API функции SetTimer, KillTimer.

P.S. Зря от MFC отказался, совсем без библиотек сейчас уже не пишут. Как вариант можно было использовать ATL + WTL.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

22 ноя 2008, 13:08

Я тут пыталс ясделать следующее: в меню File сделать новую кнопку "Гистограмма" по нажатию которой стирались бы точки и рисовалась гистограмма.
Я в .рс эдиторе добавил туда новую кнопку, но я не понимаю какой ID для нее лучше выбрать... там есть дофига всяких: IDI, IDM... никак не могу понять что это значит и для чего каждый нужен.
Я от балды сделал название: ID_FILE, потом в switcha'x после WM_COMMAND добавил новый Case с таким названием. В него записал: WM_PAINT а потомбегин паинт и т.д.
НЕ работает.
Как мне заставить кнопку заработать? Мне уже тупо интересно)))
Си ++
Здоровье --
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

23 ноя 2008, 11:05

Вот поэтому я тебе и сказал, что зря ты отказался от MFC. Чтобы писать на чистом Win32 API нужно очень хорошу понимать архитектуру приложений Win и подробности процессов маршрутизации сообщений.

Правильно делать так:

Код: Выделить всё

case WM_COMMAND: 
{
   switch(wparam)
   {
      case ID_FILE:
         bGisto = true;
         InvalidateRect(NULL);
         break;
   }
}
case WM_PAINT:
{
   if (bGisto)
   {
      // Рисуем гистограмму
   }
   else
   {
      // Рисуем точки
   }
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

23 ноя 2008, 15:06

Да я почему от MFC отказался. Я тупой и никак не получалось заставить код, который находился в обьекте документа работать в в классе onDraw.
Я делал все как писар Холзнер в своей книге про MS Visual С++ 6 но не работало.
Почему то комманда GetDocument() не работала. Вот я и перешел на просто Win32.
Си ++
Здоровье --
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

23 ноя 2008, 15:20

Romeo писал(а):Вот поэтому я тебе и сказал, что зря ты отказался от MFC. Чтобы писать на чистом Win32 API нужно очень хорошу понимать архитектуру приложений Win и подробности процессов маршрутизации сообщений.

Правильно делать так:

Код: Выделить всё

case WM_COMMAND: 
{
   switch(wparam)
   {
      case ID_FILE:
         bGisto = true;
         InvalidateRect(NULL);
         break;
   }
}
case WM_PAINT:
{
   if (bGisto)
   {
      // Рисуем гистограмму
   }
   else
   {
      // Рисуем точки
   }
}

Добавил твой код следующим образом:

Код: Выделить всё

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;
		case ID_FILE:
			bGisto = true;
			InvalidateRect(NULL);
         break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:           /////////////////////////////////////////////
		if (bGisto)
   {
      // Рисуем гистограмму
   }
   else
   {
      hdc = BeginPaint(hWnd, &ps);
		random(hdc);
		EndPaint(hWnd, &ps);
   }
		
		break;
Выдает 2 ошибки:
error C2065: 'bGisto' : undeclared identifier
error C2660: 'InvalidateRect' : function does not take 1 arguments
Что делать?
Си ++
Здоровье --
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

24 ноя 2008, 11:05

Самостоятельно исправь ошибки.
Ответить