IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Система координат в Winapi
Янычар
сообщение 19.01.2009 20:39
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Подскажите пожалуйста как мне переместить начало системы координат в центр экрана. Я так понял что с помощью функции SetMapMode(HDC hdc, int nMapMode) можно поменять систему координат и например если второй параметр будет MM_LOMETRIC то это уже будет метрическая система координат и оси буду расположены в привычном виде. Тока я вот это делю и после этого рисунка на экране уже не видно, возможно потому что ось ординат находится выше клиентской области... Так вт как мне эту ситсему переместить в центр окна???Тока желательно проверенный метод а то кое какие функции я уже нашел но не получается.. Заранее спасибо.

Добавлено через 19 мин.
Отвечаю: Прежде, чем выполнять перемещение начала координат, следует определить размеры внутренней области окна. Это можно сделать при обработке сообщения WM_SIZE :

static short cxClient, cyClient;
....
case WM_SIZE:
{
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
....
return 0;
}
а затем помещаем систему в центр окна
SetViewportOrg(hdc, cxClient/2, cyClient/2);
перед этим нужно было определить
SetMapMode(hdc, MM_LOMETRIC )
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.01.2009 21:01
Сообщение #2


Гость






Цитата(Янычар @ 19.01.2009 19:39) *
Тока желательно проверенный метод а то кое какие функции я уже нашел но не получается..
Хотелось бы уточнить, что именно у тебя не получается? Вот так, скажем:
        SetMapMode(hdc, MM_LOMETRIC);
SetWindowExtEx(hdc, Width, Height, 0);
SetViewportExtEx(hdc, ClientWidth, -ClientHeight, 0);
SetViewportOrgEx(hdc, ClientWidth/2, ClientHeight/2, 0);
for (int i = 0; i < Width; i += 2) LineTo(hdc, i, Height/2*sin(i*4*3.1416/Width));

рисуется синусоида из центра окна, следовательно, начало координат туда было успешно перенесено...
 К началу страницы 
+ Ответить 
Янычар
сообщение 19.01.2009 21:08
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Ну собственно тот же результат что и я написал. Но есть одно но в этом: нельзя использовать координаты с отрицательным значением а мне бы хотелось чтобы можно было) Так что вопрос как это сделать...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.01.2009 21:57
Сообщение #4


Гость






Цитата
Но есть одно но в этом: нельзя использовать координаты с отрицательным значением
Да что ты говоришь... Может, при твоем способе и нельзя... Но ты сам его предложил, я предложил тебе другое. Так вот, добавь минус перед i:
for (int i = 0; i < Width; i += 2) LineTo(hdc, -i, Height/2*sin(i*4*3.1416/Width));

и скажи, чего тебе не так? Что, график не ушел влево от начала координат? Это не отрицательное значение абсциссы? Я уж не говорю о том, что Sin иногда... как бы это тебе сказать... отрицательным бывает, однако график-то строится, и уходит в минус и по оси ординат...
 К началу страницы 
+ Ответить 
Янычар
сообщение 19.01.2009 22:14
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Ну чего то и при твоем не получается... Может это из-за того что я пользуюсь контекстом памяти?А оттуда переношу с помощью битовой карты на контекст устройства.Я хз может там по-другому надо как то
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 24.07.2025 3:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"