Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование и масштабирование, Рисование осей координат и их масштабиро 
:(
    Опции темы
Korman
Дата 12.9.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.9.2006
Где: г. Смоленск

Репутация: нет
Всего: нет



Привет! В проге World C++ я увидела такой примерчик:
Код

void TransformAndDraw(int iTransform, HWND hWnd) 
{
    HDC hDC;
    XFORM xForm;
    RECT rect;

    // Получаем дескриптор DC для окна приложения.

    hDC = GetDC(hWnd);

    // Устанавливаем режим маппинга в LOENGLISH. Тем самым, клиентская
    // область перемещается из верхнего левого угла окна в нижний
    // левый угол (так же происходит переориентация оси y,
    // чтобы операции рисования происходили в декартовой системе
    // координат). При этом гарантируется переносимость и сохранение
    // размерности рисуемого объекта на любом дисплее.

    SetGraphicsMode(hDC, GM_ADVANCED);
    SetMapMode(hDC, MM_LOENGLISH);

    // Устанавливаем соответствующие преобразования (основанные на
    // выборе пользователя в меню).

    switch (iTransform)
    {
        case SCALE:        // Масштабируем в половину начального размера
            xForm.eM11 = (FLOAT) 0.5;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 0.5;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case TRANSLATE:   // Сдвиг на 3/4 дюйма вправо.
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 1.0;
            xForm.eDx  = (FLOAT) 75.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case ROTATE:      // Поворот на 30 градусов против часовой стрелки
            xForm.eM11 = (FLOAT) 0.8660;
            xForm.eM12 = (FLOAT) 0.5000;
            xForm.eM21 = (FLOAT) -0.5000;
            xForm.eM22 = (FLOAT) 0.8660;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case SHEAR:       // Искривляем по оси x коэффициентом
                          // пропорциональности 1.0.
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 1.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 1.0;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case REFLECT:     // Отражение по горизонтальной оси
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) -1.0;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case NORMAL:      // Устанавливаем значения преобразования.
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 1.0;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

    }

    // Ищем центральную точку клиентской области.
 
    GetClientRect(hWnd, (LPRECT) &rect);
    DPtoLP(hDC, (LPPOINT) &rect, 2);

    // Выбираем кисть.

    SelectObject(hDC, GetStockObject(HOLLOW_BRUSH));

    // Рисуем внешний круг.

    Ellipse(hDC, (rect.right / 2 - 100), (rect.bottom / 2 + 100),
        (rect.right / 2 + 100), (rect.bottom / 2 - 100));

    // Рисуем внутренний круг.

    Ellipse(hDC, (rect.right / 2 -94), (rect.bottom / 2 + 94),
        (rect.right / 2 + 94), (rect.bottom / 2 - 94));

    // Рисуем ключ.

    Rectangle(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 113),
        (rect.right / 2 + 13), (rect.bottom / 2 + 50));
    Rectangle(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 96),
        (rect.right / 2 + 13), (rect.bottom / 2 + 50));

    // Рисуем горизонтальные линии.

    MoveToEx(hDC, (rect.right/2 - 150), (rect.bottom / 2 + 0), NULL);
    LineTo(hDC, (rect.right / 2 - 16), (rect.bottom / 2 + 0));

    MoveToEx(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 0), NULL);
    LineTo(hDC, (rect.right / 2 + 13), (rect.bottom / 2 + 0));

    MoveToEx(hDC, (rect.right / 2 + 16), (rect.bottom / 2 + 0), NULL);
    LineTo(hDC, (rect.right / 2 + 150), (rect.bottom / 2 + 0));

    // Рисуем вертикальные линии.

    MoveToEx(hDC, (rect.right/2 + 0), (rect.bottom / 2 - 150), NULL);
    LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 - 16));

    MoveToEx(hDC, (rect.right / 2 + 0), (rect.bottom / 2 - 13), NULL);
    LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 13));

    MoveToEx(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 16), NULL);
    LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 150));

    ReleaseDC(hWnd, hDC);
}



Но этот пример, при вставке кода в приложение выдаёт ошибку. Я чайник - может я забыла подключить что нибудь??? Подскажите пожаста, как мне быть?? Этот пример взят из статьи: Графика->Bitmap->Трансформация... / Заранее огромное спасибо... и Ещё может вы подскажите где можно взять ананлогичную (чтобы теже функции выполняла) прогу . Спасибо.
PM MAIL   Вверх
zkv
Дата 12.9.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(Korman @  12.9.2006,  22:30 Найти цитируемый пост)
при вставке кода в приложение выдаёт ошибку
 в какое приложение? а куда вставляете smile? и какую ошибку говорит?

вообще то приведенный пример, это ведь не приложение, а только отдельная функция, по этому приложение придется писать самой, а в нем уже использовать эту функцию, или переделать её в метод нужного вам класса. Как написать Windows-приложение - читайте книги, тема слишком обширная, чтобы передать в двух словах smile

PM MAIL   Вверх
tigger
Дата 13.9.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 3
Всего: 4



Сама функция

Код

void TransformAndDraw(int iTransform, HWND hWnd) 
{
    HDC hDC;
    XFORM xForm;
    RECT rect;

    // Получаем дескриптор DC для окна приложения.

    hDC = ::GetDC(hWnd);

    // Устанавливаем режим маппинга в LOENGLISH. Тем самым, клиентская
    // область перемещается из верхнего левого угла окна в нижний
    // левый угол (так же происходит переориентация оси y,
    // чтобы операции рисования происходили в декартовой системе
    // координат). При этом гарантируется переносимость и сохранение
    // размерности рисуемого объекта на любом дисплее.

    SetGraphicsMode(hDC, GM_ADVANCED);
    SetMapMode(hDC, MM_LOENGLISH);

    // Устанавливаем соответствующие преобразования (основанные на
    // выборе пользователя в меню).

    switch (iTransform)
    {
        case 0:        // Масштабируем в половину начального размера
            xForm.eM11 = (FLOAT) 0.5;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 0.5;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case 1:   // Сдвиг на 3/4 дюйма вправо.
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 1.0;
            xForm.eDx  = (FLOAT) 75.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case 2:      // Поворот на 30 градусов против часовой стрелки
            xForm.eM11 = (FLOAT) 0.8660;
            xForm.eM12 = (FLOAT) 0.5000;
            xForm.eM21 = (FLOAT) -0.5000;
            xForm.eM22 = (FLOAT) 0.8660;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case 3:       // Искривляем по оси x коэффициентом
                          // пропорциональности 1.0.
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 1.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 1.0;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case 4:     // Отражение по горизонтальной оси
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) -1.0;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

        case 5:      // Устанавливаем значения преобразования.
            xForm.eM11 = (FLOAT) 1.0;
            xForm.eM12 = (FLOAT) 0.0;
            xForm.eM21 = (FLOAT) 0.0;
            xForm.eM22 = (FLOAT) 1.0;
            xForm.eDx  = (FLOAT) 0.0;
            xForm.eDy  = (FLOAT) 0.0;
            SetWorldTransform(hDC, &xForm);
            break;

    }

    // Ищем центральную точку клиентской области.
 
    GetClientRect((LPRECT) &rect);
    DPtoLP(hDC, (LPPOINT) &rect, 2);

    // Выбираем кисть.

    SelectObject(hDC, GetStockObject(HOLLOW_BRUSH));

    // Рисуем внешний круг.

    Ellipse(hDC, (rect.right / 2 - 100), (rect.bottom / 2 + 100),
        (rect.right / 2 + 100), (rect.bottom / 2 - 100));

    // Рисуем внутренний круг.

    Ellipse(hDC, (rect.right / 2 -94), (rect.bottom / 2 + 94),
        (rect.right / 2 + 94), (rect.bottom / 2 - 94));

    // Рисуем ключ.

    Rectangle(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 113),
        (rect.right / 2 + 13), (rect.bottom / 2 + 50));
    Rectangle(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 96),
        (rect.right / 2 + 13), (rect.bottom / 2 + 50));

    // Рисуем горизонтальные линии.

    MoveToEx(hDC, (rect.right/2 - 150), (rect.bottom / 2 + 0), NULL);
    LineTo(hDC, (rect.right / 2 - 16), (rect.bottom / 2 + 0));

    MoveToEx(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 0), NULL);
    LineTo(hDC, (rect.right / 2 + 13), (rect.bottom / 2 + 0));

    MoveToEx(hDC, (rect.right / 2 + 16), (rect.bottom / 2 + 0), NULL);
    LineTo(hDC, (rect.right / 2 + 150), (rect.bottom / 2 + 0));

    // Рисуем вертикальные линии.

    MoveToEx(hDC, (rect.right/2 + 0), (rect.bottom / 2 - 150), NULL);
    LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 - 16));

    MoveToEx(hDC, (rect.right / 2 + 0), (rect.bottom / 2 - 13), NULL);
    LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 13));

    MoveToEx(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 16), NULL);
    LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 150));

}


вызов ее
Код

TransformAndDraw(5, this->m_hWnd );


да и в заголовочном файле опиши ее прототип


--------------------
user posted image
PM MAIL   Вверх
Rapalex
Дата 13.9.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



Офигеть, SetGraphicsMode, я про такое вообще про такое впервые слышу, книжки читал а про такое там ни слова не говорится, мне так кажется это чтото похожее на афинные преобразования, но хотелось бы почитать про это гденибудь. Может ктонибудь даст ссыку на книгу в pdf или djvu формате?

 smile буду очень признателен.

Может в GDI+ ихние матрицы над этим и надстроены???


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Dart
Дата 13.9.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

Репутация: 2
Всего: 2



Читайте MSDN smile 
Цитата

CDC::SetGraphicsMode  
Sets the graphics mode for the specified device context.

int SetGraphicsMode(
   int iMode
);
 
Parameters
iMode
Specifies the graphics mode. For a list of the values that this parameter can take, see SetGraphicsMode.

Return Value
Returns the old graphics mode on success.

Returns 0 on failure. To get extended error information, call GetLastError.

Remarks
This method wraps the Windows GDI function SetGraphicsMode.


Там все достаточно подробно описано. 

Это сообщение отредактировал(а) Dart - 13.9.2006, 15:13
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.