Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поворот bitmap

18K
07 августа 2006 года
superalex1986
7 / / 07.08.2006
Приетствую всех!!!! :)
Кто-нибудь может подсказать как можно вертеть битмап на заданные углы?! Очень нужно!
16K
07 августа 2006 года
koric
42 / / 06.08.2006
руками в фотошопе.

как битмап выводится через IDC_STATIC с флагом OWNERDRAW или читается из файла и выводится руками?
398
07 августа 2006 года
Alexandoros
630 / / 21.10.2005
Читать вышку или 3д графику про матричные преобразования углов. Там это все.
16K
08 августа 2006 года
koric
42 / / 06.08.2006
Здесь пример по графическому выводу из учебника по MFC: часы со стрелками, реализовано через CPoint::RotatePoint() с массивом в качестве аргумента
18K
08 августа 2006 года
superalex1986
7 / / 07.08.2006
Спасибо! Щас посмотрю.
18K
10 августа 2006 года
superalex1986
7 / / 07.08.2006
Вот функция, при помощи которой я ворочаю битмап(если кому интересно будет):

Код:
HBITMAP GetRotatedBitmapNT( HBITMAP hBitmap, float radians, COLORREF clrBack )
{
    // Create a memory DC compatible with the display
    CDC sourceDC, destDC;
    sourceDC.CreateCompatibleDC( NULL );
    destDC.CreateCompatibleDC( NULL );

    // Get logical coordinates
    BITMAP bm;
    ::GetObject( hBitmap, sizeof( bm ), &bm );

    float cosine = (float)cos(radians);
    float sine = (float)sin(radians);

    // Compute dimensions of the resulting bitmap
    // First get the coordinates of the 3 corners other than origin
    int x1 = (int)(bm.bmHeight * sine);
    int y1 = (int)(bm.bmHeight * cosine);
    int x2 = (int)(bm.bmWidth * cosine + bm.bmHeight * sine);
    int y2 = (int)(bm.bmHeight * cosine - bm.bmWidth * sine);
    int x3 = (int)(bm.bmWidth * cosine);
    int y3 = (int)(-bm.bmWidth * sine);

    int minx = min(0,min(x1, min(x2,x3)));
    int miny = min(0,min(y1, min(y2,y3)));
    int maxx = max(0,max(x1, max(x2,x3)));
    int maxy = max(0,max(y1, max(y2,y3)));

    int w = maxx - minx;
    int h = maxy - miny;

    // Create a bitmap to hold the result
    HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h);

    HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
    HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );

    // Draw the background color before we change mapping mode
    HBRUSH hbrBack = CreateSolidBrush( clrBack );
    HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack );
    destDC.PatBlt( 0, 0, w, h, PATCOPY );
    ::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) );

    // We will use world transform to rotate the bitmap
    SetGraphicsMode(destDC.m_hDC, GM_ADVANCED);
    XFORM xform;
    xform.eM11 = cosine;
    xform.eM12 = -sine;
    xform.eM21 = sine;
    xform.eM22 = cosine;
    xform.eDx = (float)-minx;
    xform.eDy = (float)-miny;

    SetWorldTransform( destDC.m_hDC, &xform );

    // Now do the actual rotating - a pixel at a time
    destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY );

    // Restore DCs
    ::SelectObject( sourceDC.m_hDC, hbmOldSource );
    ::SelectObject( destDC.m_hDC, hbmOldDest );

    return hbmResult;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог