Вопрос по компьютерной графике

User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Вопрос по компьютерной графике

Post by Privet »

Пришлось заниматься не своим делом. Надо вывести визуально некоторую информацию. Думал, элементарно, но меня ждала засада.
Рисую из простой main()

Code: Select all

main()
...
GetClientRect (hWnd, &rc);
w = rc.right;
h = rc.bottom;
...
MoveToEx (hDC, x, y, NULL);                 // v.1
LineTo (hDC, x, bottom-fx);
...
for(int i=0; i<fx; ++i)
  SetPixel (hDC,x, bottom - i, color);  // v.2
1. Если я использую в качестве крайней координаты по ширине w, то мои художества занимают 2/3 от ширины всей консоли. Как мне получить реальную размерность консоли, чтобы вписать графику в её размер?

2. Если рисую вертикальные линии 1-м способом (v.1) то их ширина получается порядка 2-х пикселей, что меня не устраивает. Если рисую линии вторым способом (v.2), то линии получаются в один пиксель, но рисует тоскливо м-медленно. Я могу задать толщину в один пиксель при рисовании 1-м способом или есть другие способы?

3. При рисовании 2-м способом нижняя треть консоли где bottom > h использована быть не может. 1-й способ может рисовать ниже. Удивляет. Что-то делаю неправильно?

4. Если переделаю в WinMain с нормальным виндосовским окном и пр., то проблема несоответсвия размерности окна и координат внутри окна останется?

5. Пытаюсь написать текст:

Code: Select all

    SetTextColor (hDC, RGB (0, 0, 255)); 
    TextOut (hDC, 10, 20, str, _tcslen (str));
Не пишет. Пытался создавать шрифт. Не помогает. Что-то забыл?
Привет.
User avatar
Uzito
Уже с Приветом
Posts: 8230
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Вопрос по компьютерной графике

Post by Uzito »

Privet wrote: 23 Mar 2019 08:14 Что-то забыл?
Ширина всё-таки наверное будет разницей правой и левой границы, нет?
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

Uzito wrote: 23 Mar 2019 18:44
Privet wrote: 23 Mar 2019 08:14 Что-то забыл?
Ширина всё-таки наверное будет разницей правой и левой границы, нет?
Мы работаем в окне, координаты внутри которого по ширине лежат в диапазоне [0, w-1] и по высоте [0, h-1]. Начало находится в верхнем левом угле окна.

Пусть x и y - визуальные ширина и высота окна, например, в мм. Моя проблема в том, что точка с координатой (w-1, h-1) рисуется не в нижнем правом угле, а в точке с условными координатами (x*2/3, y*2/3).

P.S. Точка с координатой (0, 0) отображается там, где надо - в верхнем левом углу.
P.S.2. На всякий случай, я проверил чему равны rc.left и rc.top. Они равны 0.
Привет.
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

Результат всех графических функций проверяется на корректность. Все функции возвращают значимую величину или TRUE. Однако TextOut() всё равно ничего не выводит. :angry:
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 23 Mar 2019 08:14 Пришлось заниматься не своим делом. Надо вывести визуально некоторую информацию. Думал, элементарно, но меня ждала засада.
Извиняюсь, не уловил. :oops: Где собственно надо "вывести"? В клиентском браузере? На сервере в иксах? Чем это main() обрабатывается?
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

VladDod wrote: 23 Mar 2019 23:33
Privet wrote: 23 Mar 2019 08:14 Пришлось заниматься не своим делом. Надо вывести визуально некоторую информацию. Думал, элементарно, но меня ждала засада.
Извиняюсь, не уловил. :oops: Где собственно надо "вывести"? В клиентском браузере? На сервере в иксах? Чем это main() обрабатывается?
Это не в браузере. Это обычная программа на С++, а main() это стандартная главная функция с которой начинаются все программы. Такая программа исполняется в обычном окне, которое в Windows создаётся командой cmd. Я её указал, чтобы отметить факт того, что это программа не под Windows, под которым все программы начинаются с WinMain и они обычно создают своё собственное окно.
Привет.
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

Проблему с шириной линий решил. Я создавал HPEN с шириной линий 2. Просто срисовал из примера не задумываясь о параметрах.
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 24 Mar 2019 00:09 программа исполняется в обычном окне, которое в Windows создаётся командой cmd.
Тогда GetClientRect() возращает скорее всего размеры этого "обычного окна". Или "консоль" это оно и есть?
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

VladDod wrote: 24 Mar 2019 00:34
Privet wrote: 24 Mar 2019 00:09 программа исполняется в обычном окне, которое в Windows создаётся командой cmd.
Тогда GetClientRect() возращает скорее всего размеры этого "обычного окна". Или "консоль" это оно и есть?
Да, это оно и есть.

Блин! Если даю TextOut до того как рисую, но всё пишет. Если после, то ничего не выводит.
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 24 Mar 2019 01:33 Блин! Если даю TextOut до того как рисую, но всё пишет. Если после, то ничего не выводит.
EndPaint() там на месте?

Code: Select all

hdc = BeginPaint(hwnd, &ps);
/// отрисовка
EndPaint(hwnd, &ps);
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Но я вообще не представляю, как это может работать вне цикла обработки событий? :oops:

Code: Select all

	switch (event)
	{
		case WM_PAINT:
			hdc = BeginPaint(hwnd, &ps);
                        //// ... рисуем ...
			EndPaint(hwnd, &ps);
			break;
	}
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
Maw Hogben
Уже с Приветом
Posts: 34622
Joined: 08 May 2008 04:17
Location: 98101

Re: Вопрос по компьютерной графике

Post by Maw Hogben »

Я графикой никогда не занималась, но вот мой бывший... я ему отправила топик.

Он почему-то пытается рисовать в окошке DOS (console) из console application, у которой нет нормального окна Windows. Я этого никогда не делал, мне трудно представить в каких ситуациях это может понадобиться. У консоли свои собственные настройки по ширине и высоте (как буфер для текста так и размеры окна), которые может выбирать юзер (right click -> Properties -> Layout) и, возможно, они перебивают функции рисования.

Проще сделать обычную Windows application, с message loop, с обработкой WM_PAINT и прочего, там все будет работать как часы.
A malenky bit bezoomny she was, you could tell that, through spending her jeezny all on her oddy knocky.
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

VladDod wrote: 24 Mar 2019 01:58 Но я вообще не представляю, как это может работать вне цикла обработки событий? :oops:

Code: Select all

	switch (event)
	{
		case WM_PAINT:
			hdc = BeginPaint(hwnd, &ps);
                        //// ... рисуем ...
			EndPaint(hwnd, &ps);
			break;
	}
Эти команды используются только в обработчике событий.

Консоль - то же самое окно. Большой разницы нет. Довольно часто графика используется в консоли. Полно подобных примеров.

Графика в моей программе это дополнительная не принципиальная функция, которую я решил ввести уже после того, как основная программа была написана. Рисует она сейчас достаточно хорошо. Единственная непонятка - треть окна не используется, что не критично. Перелопачивать весь ввод вывод в надежде, что в Windows окне она будет работать немножко лучше мне не хочется.
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 24 Mar 2019 04:14 Единственная непонятка - треть окна не используется, что не критично.
А как дескрипторы получали?

Code: Select all

    hwnd=GetConsoleWindow();
    hdc=GetDC(hwnd);
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 24 Mar 2019 04:14 Консоль - то же самое окно. Большой разницы нет.
Я - про то же. И это окно имеет свой, (недоступный вам) обработчик событий. Который будет сводить ваши усилия на нет, от любого свистка системы на перерисовку какой либо части собственного окна.
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

VladDod wrote: 24 Mar 2019 12:17
Privet wrote: 24 Mar 2019 04:14 Единственная непонятка - треть окна не используется, что не критично.
А как дескрипторы получали?

Code: Select all

    hwnd=GetConsoleWindow();
    hdc=GetDC(hwnd);
Да, именно так
Привет.
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

VladDod wrote: 24 Mar 2019 12:26
Privet wrote: 24 Mar 2019 04:14 Консоль - то же самое окно. Большой разницы нет.
Я - про то же. И это окно имеет свой, (недоступный вам) обработчик событий. Который будет сводить ваши усилия на нет, от любого свистка системы на перерисовку какой либо части собственного окна.
Это проявляется только в том, что любое действие с этим окном приводит к его перерисовке и исчезновению картинки, но у меня вывод заведён в цикл, который упирается в getch(). Нажатием нужной клавиши я или перерисовываю картинку, меняю режимы или вообще выхожу. Т.е. стандартный подход. По функциональности нас всё полностью устраивает. Единственная некорректность - окно приходится делать на треть больше, чем это реально требуется.
В принципе, я могу легко скорректировать это программно, умножив полученные ширину и высоту окна на 1.5, но я опасаюсь делать чего-то, чего не понимаю. Тогда координаты некоторых точек численно будут за пределами окна. Они рисуются, но мало ли какие сюрпризы могут быть с другим монитором или драйвером. Поэтому, оставил как есть, т.к. качественно для нас это ничего не меняет. Как-то использовать эту лишнюю треть я всё равно не смогу.
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 25 Mar 2019 03:18 ... за пределами окна. Они рисуются, ...
Рисуются за пределами окна "консоли"? Может дескрипторы указывают не на само "окно консоли", а на нечто, созданное системой для запущенного приложения, но не видимого, поскольку не было вызовов визуализации? Я каюсь. в виндовз играться ... уже лет много ... как перестал, но чисто по логике такое возможно?
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

Вообще, двух мнений на предмет как правильно делать графику, быть не может. У меня лишь конкретный частный случай.
Программа моделирует некий процесс и выводит на печать и в файл результаты. Запускается многократно через bat-файлы с заданными в командной строке параметрами. Прорисовка данных делается только для контроля только в некоторых случаях. На мне висит много работы по расширению модели. Поэтому, тратить время на причёсывание второстепенных функций смысла нет.

В своей среде мы часто вспоминаем поговорку, что, сначала надо сделать гроб, а потом уже кисти. :)
Привет.
User avatar
Maw Hogben
Уже с Приветом
Posts: 34622
Joined: 08 May 2008 04:17
Location: 98101

Re: Вопрос по компьютерной графике

Post by Maw Hogben »

Я понимаю что вы покончили с графикой... Но мне тут опять прислали... Пример. :)
You do not have the required permissions to view the files attached to this post.
A malenky bit bezoomny she was, you could tell that, through spending her jeezny all on her oddy knocky.
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

Maw Hogben wrote: 25 Mar 2019 20:35 Я понимаю что вы покончили с графикой... Но мне тут опять прислали... Пример. :)
Спасибо большое! Сейчас посмотрю.
Программа работает, но проблема несоответствия координат осталась и её желательно решить и понять причину.
Привет.
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

Я посмотрел эту программку. Код из неё буквально один в один точно повторяет мой код. Я вставил его как есть в свою программу и он также рисует картинки в первой 2/3 консоли. Чуда не произошло. Проблема остаётся. :(
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 26 Mar 2019 14:48 рисует картинки в первой 2/3 консоли
А если вы меняете размеры окна "консоли". ваша картинка меняет размер пропорционально? Или остается неизменной?
Privet wrote: 26 Mar 2019 14:48 Проблема остаётся. :(
Можно изобразить собственный эмулятор терминала. Вместо "консоли". Не бог весть какая сложность, но зато будет контроль над окном.
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
User avatar
Privet
Администратор
Posts: 17505
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Re: Вопрос по компьютерной графике

Post by Privet »

VladDod wrote: 26 Mar 2019 17:15
Privet wrote: 26 Mar 2019 14:48 рисует картинки в первой 2/3 консоли
А если вы меняете размеры окна "консоли". ваша картинка меняет размер пропорционально? Или остается неизменной?
Любое изменение размера консоли приводит к перерисовке консоли и исчезновения всего нарисованного. При каждой перерисовке я проверяю текущие размеры консоли и масштабирую рисунок, уменьшая его каждый раз в два раза. Т.е. всё очень просто.
VladDod wrote: 26 Mar 2019 17:15
Privet wrote: 26 Mar 2019 14:48 Проблема остаётся. :(
Можно изобразить собственный эмулятор терминала. Вместо "консоли". Не бог весть какая сложность, но зато будет контроль над окном.
Создать своё окно? Наверное, это было бы правильно, но на сегодня нас это полностью устраивает. Что-то переделывать мне просто некогда.
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 55869
Joined: 06 May 2001 09:01

Re: Вопрос по компьютерной графике

Post by VladDod »

Privet wrote: 27 Mar 2019 18:17 При каждой перерисовке я проверяю текущие размеры консоли и масштабирую рисунок, уменьшая его каждый раз в два раза.
Я это и имел ввиду. То есть вариантов не много ... Получается, что GetClientRect(); вас обманывает. Поскольку это библиотечная функция, в которую вы скармливаете адрес структуры для заполнения результатом, ... можно предположить несоответствие переданной структуры, тому, что уже скомпилировано в библиотеке. Я бы тщательно проверил описание этой структуры и ее зависимость от компилятора. Точнее от разрядности компилятора. Может попробовать перекомпилиться с 64 на 32 бита (или наоборот)
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)

Return to “Вопросы и новости IT”