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

User avatar
Privet
Администратор
Posts: 17204
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: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

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

Post by Uzito »

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

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

Post by Privet »

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

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

Post by VladDod »

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

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

Post by Privet »

Проблему с шириной линий решил. Я создавал HPEN с шириной линий 2. Просто срисовал из примера не задумываясь о параметрах.
Привет.
User avatar
VladDod
Уже с Приветом
Posts: 56202
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: 17204
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: 56202
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: 56202
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: 34887
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: 17204
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: 56202
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: 56202
Joined: 06 May 2001 09:01

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

Post by VladDod »

Privet wrote: 24 Mar 2019 04:14 Консоль - то же самое окно. Большой разницы нет.
Я - про то же. И это окно имеет свой, (недоступный вам) обработчик событий. Который будет сводить ваши усилия на нет, от любого свистка системы на перерисовку какой либо части собственного окна.
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)

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