Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не получается воспользоваться GetPixel(), вне обработки WM_PAINT 
:(
    Опции темы
Dreamer_0x01
Дата 16.11.2005, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



нужно по нажатию кнопки в программе обработать "снимок" нужной мне области окна.
Пытаюсь в обработчике использовать CDC *dc=GetDC(),
и далее COLORREF cl=dc->GetPixel(/////);
но получается полная фигня. Скорее всего, контекст dc у меня получается совсем другой, отличный от того, который я построил в обработке события WM_PAINT. (Либо при выходе из обработчика он разрушается).
как быть?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
SergeCpp
Дата 17.11.2005, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Попробуй GetClientDC() или GetWindowDC()

Но с координатами там поаккуратнее (преобразовать надо)

Ну или стиль класса (не окна) сделай CS_OWNDC (это и быстрее для проги)
Тогда контекст при создании берёшь, он и не поменяется никогда

Это сообщение отредактировал(а) SergeCpp - 17.11.2005, 08:05
PM MAIL WWW ICQ   Вверх
Dreamer_0x01
Дата 17.11.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(SergeCpp @ 17.11.2005, 08:03)
Ну или стиль класса (не окна) сделай CS_OWNDC (это и быстрее для проги)
Тогда контекст при создании берёшь, он и не поменяется никогда


При создании - это когда именно? Или без разницы?



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 17.11.2005, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Так, попробовал сделать ReleaseDC()

Содержимое GetPixel теперь не девственно чистое, а чем-то заполняется, но то ли координаты смещены, то ли все равно неправильно работает. Причем работает тоже через раз почему-то.

Это сообщение отредактировал(а) Dreamer_0x01 - 17.11.2005, 09:46


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
SergeCpp
Дата 17.11.2005, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Примерно так API...

Код

    WNDCLASSEX cClock;

    cClock.cbSize        = sizeof ( WNDCLASSEX );
    cClock.style         = CS_DBLCLKS | CS_OWNDC;
    cClock.lpfnWndProc   = ClockProc;
    cClock.cbClsExtra    = 0;
    cClock.cbWndExtra    = 0;
    cClock.hInstance     = g_hClockDLL;
    cClock.hIcon         = NULL;
    cClock.hIconSm       = NULL;
    cClock.hCursor       = LoadCursor( NULL, IDC_ARROW );
    cClock.hbrBackground = BRUSH_BACK;
    cClock.lpszMenuName  = NULL;
    cClock.lpszClassName = "ExClock";

    ATOM aClock( RegisterClassEx( &cClock ) );

    if( !aClock )
    {
        ExitCode = 1;
        goto exit;
    }

    /*
    MessageBox( NULL,
                "Class registered\n\nContinue after click",
                "ClockMain thread",
                MB_ICONINFORMATION | MB_TOPMOST );
    */

    //

    g_hClockWnd = CreateWindowEx(
        WS_EX_TOOLWINDOW,            // | WS_EX_WINDOWEDGE
        ( PSTR )aClock,
        NULL,
        WS_POPUP,                    // | WS_DLGFRAME
        0,
        0,
        g_rClockWin.right,
        g_rClockWin.bottom,
        NULL,
        NULL,
        g_hClockDLL,
        NULL );

    if( !g_hClockWnd )
    {
        ExitCode = 2;
        goto exit;
    }

    /*
    MessageBox( NULL,
                "Window created\n\nContinue after click",
                "ClockMain thread",
                MB_ICONINFORMATION | MB_TOPMOST );
    */


или так MFC...

Код

BOOL LifeView::PreCreateWindow( CREATESTRUCT& CreateStruct )
{
    if( !CScrollView::PreCreateWindow( CreateStruct ) )
    {
        return FALSE;
    }

static const char( * s_pLifeViewClass )( NULL );

    if( !s_pLifeViewClass )
    {
        WNDCLASSEX wcx = { sizeof( WNDCLASSEX ) };

        ::GetClassInfoEx( ::GetModuleHandle( NULL ), CreateStruct.lpszClass, &wcx );

        wcx.lpszClassName  = "LifeViewClass";
        wcx.hbrBackground  =  NULL;
        wcx.style         &= ~CS_DBLCLKS;
        wcx.style         |=  CS_OWNDC;

        ::RegisterClassEx  ( &wcx );
        s_pLifeViewClass   =  wcx.lpszClassName;
    }

    CreateStruct.lpszClass = s_pLifeViewClass;

    return TRUE;
}

PM MAIL WWW ICQ   Вверх
SergeCpp
Дата 17.11.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



А вот тут я единственный раз этот DC беру MFC...

Код

int LifeView::OnCreate( CREATESTRUCT* pCreateStruct )
{
    if( CScrollView::OnCreate( pCreateStruct ) == -1 )
    {
        return -1;
    }

    //

    m_hWinDC = ::GetDC( m_hWnd );
.....................

PM MAIL WWW ICQ   Вверх
SergeCpp
Дата 17.11.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Вот тут я координаты правлю...

Код

void LifeView::OnInitialUpdate()
{
    m_PrevMsMove.x  =
    m_PrevMsMove.y  = -1;

    SetViewportOrgEx( m_hWinDC, 0,  0, NULL  );  // <<< тут

    SetScrollPos    ( SB_HORZ,  0,     FALSE );
    SetScrollPos    ( SB_VERT,      0, FALSE );

    SetScrollSizes  ();

    Update          ();
}


Тут ещё обработка такая...

Код

BOOL LifeView::OnEraseBkgnd( CDC* )
{
    if( m_EraseOff )
    {
        return TRUE; // denied somewhere
    }

    //

    HBRUSH Eraser( ( HBRUSH )( COLOR_APPWORKSPACE + 1 ) );
    RECT   Client( m_Client );
    SIZE   Grid  ( Doc()->GetGridSize() );

    ::DPtoLP( m_hWinDC, ( POINT* )&Client, 2 ); // <<< тут

    BOOL EraseFull( m_DrawOff || !Grid.cx || !Grid.cy );

    if(  EraseFull || m_EraseFull )
    {
        BOOL GliderDrawn( FALSE );

        if(  EraseFull )
        {
            UINT Box( 8 * 3 - 1 );

            if( UINT Pix( min( m_Client.right, m_Client.bottom ) / 3 / Box ) )
            {
                Box *= Pix;

                POINT Beg =
                {
                    Client.left + ( m_Client.right  - Box ) / 2,
                    Client.top  + ( m_Client.bottom - Box ) / 2
                };

                POINT End =
                {
                    Beg.x + Box,
                    Beg.y + Box
                };

                ::FillRect( m_hWinDC,
                            CRect( Client.left, Client.top, Client.right, Beg.y         ),
                            Eraser );
                ::FillRect( m_hWinDC,
                            CRect( Client.left, Beg.y,      Beg.x,        End.y         ),
                            Eraser );
                ::FillRect( m_hWinDC,
                            CRect( End.x,       Beg.y,      Client.right, End.y         ),
                            Eraser );
                ::FillRect( m_hWinDC,
                            CRect( Client.left, End.y,      Client.right, Client.bottom ),
                            Eraser );


лови весь файл...

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  LifeView.cpp 28,71 Kb
PM MAIL WWW ICQ   Вверх
Dreamer_0x01
Дата 17.11.2005, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



а у меня еще двойная буферизация сделана - сначала я рисую на невидимый контекст, потом из него делаю BitBlt. Это не перестанет работать?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
SergeCpp
Дата 17.11.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Так ты из этой BITMAP хочешь брать пиксел или с ЭКРАННОГО DC ?

PM MAIL WWW ICQ   Вверх
Dreamer_0x01
Дата 17.11.2005, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Мне без разницы откуда, можно и с построенного мной битмепа, если это проще....


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
SergeCpp
Дата 17.11.2005, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



У меня в этом файле тоже двойная...

Код

    m_hBackDC     = ::CreateCompatibleDC    ( m_hWinDC );
    ::DeleteObject( ::SelectObject          ( m_hBackDC, hInit ) );
    m_hBackBMP    = ::CreateCompatibleBitmap( m_hBackDC, GetSystemMetrics( SM_CXSCREEN ) / 3,
                                                         GetSystemMetrics( SM_CYSCREEN ) / 3 );
                    ::SelectObject            ( m_hBackDC, m_hBackBMP  );
    ::DeleteObject( ::SelectObject            ( m_hBackDC, m_hBackBlue ) );



Код

                UINT Dist( Pix * 8    );
                UINT Cell( Dist - Pix );

                ::FillRect( m_hBackDC, CRect( 0, 0, Box, Box ), Eraser );

                ::PatBlt  ( m_hBackDC,        0, Dist * 2, Cell, Cell, PATCOPY );
                ::PatBlt  ( m_hBackDC, Dist    , Dist * 2, Cell, Cell, PATCOPY );
                ::PatBlt  ( m_hBackDC, Dist * 2, Dist * 2, Cell, Cell, PATCOPY );
                ::PatBlt  ( m_hBackDC, Dist * 2, Dist    , Cell, Cell, PATCOPY );
                ::PatBlt  ( m_hBackDC, Dist    ,        0, Cell, Cell, PATCOPY );

                ::BitBlt  ( m_hWinDC,  Beg.x, Beg.y,
                                       Box,   Box,
                            m_hBackDC,     0,     0, SRCCOPY );

                GliderDrawn = TRUE;

PM MAIL WWW ICQ   Вверх
SergeCpp
Дата 17.11.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



А вот код из БИТМАПА...

Код

BOOL FitCheck( PCSTR pStr, UINT lStr )
{
    // it is possible to draw exact count of chars
    // but not entire string
    // so check it before lengthy operations

    SIZE draft;

    GetTextExtentPoint32( g_hFitDC, pStr, lStr, &draft );

    if( ( draft.cx - g_rClockCli.right ) * ( long )lStr > draft.cx )
    {
        return FALSE; // draft.cx > g_rClockCli.right // ok signed
    }

    if       ( g_FitBox.x2 ==   g_rFit.right  - 1 )
             g_FitBox.xt -=                   g_FitBox.x1   / 2;
    else if( g_FitBox.x1 == 0 )
             g_FitBox.xt += ( g_rFit.right  - g_FitBox.x2 ) / 2;

    if       ( g_FitBox.y2 ==   g_rFit.bottom - 1 )
             g_FitBox.yt -=                   g_FitBox.y1   / 2;
    else if( g_FitBox.y1 == 0 )
             g_FitBox.yt += ( g_rFit.bottom - g_FitBox.y2 ) / 2;

    // 1,5xx ticks
    FillRect      ( g_hFitDC, &g_rFit, BRUSH_BACK );

    // 2,2xx ticks
    ExtTextOut    ( g_hFitDC, g_FitBox.xt, g_FitBox.yt, 0, NULL, pStr, lStr, NULL );

    /* test patterns

//    RECT _tst = { 7, 5, 7 + 120, 5 + 45 }; // L = 1, T = 2, R = 2, B = 1
//    RECT _tst = { 7, 5, 7 + 122, 5 + 47 }; // L = 0, T = 1, R = 1, B = 0
    RECT _tst = { 7, 5, 7 + 123, 5 + 48 }; // L = 0, T = 0, R = 0, B = 0
    RECT _bk  = { 7, 5, 7 +   1, 5 +  1 }; // background must be there

    FillRect( g_hFitDC, &_tst, ( HBRUSH )( COLOR_WINDOW + 1 ) );
    FillRect( g_hFitDC, &_bk,  ( HBRUSH )( BRUSH_BACK       ) );
    */

    // it seems works in spite of MSDN warning
    // "... must not be selected into a device context ..."
    //
    // or this warning not applies to memory DC ?

    // 1,60x,xxx ticks
    GetDIBits( g_hFitDC,
               g_hFitBmp, 0, g_rFit.bottom, g_pFitBmpBits, &g_FitBmpInfo, DIB_RGB_COLORS );

    // it is assumed in next loops
    // that some was drawn in ExtTextOut()
    //
    // if entire output is blank ('cause of font)
    // then access violation can be prodused
    //
    // but it is too odd for font having empty glyph at [0..9]

    // DWORD-aligned at the end of every scanline
    // (here 32-bit per pixel, so all ok)

    // top

    UINT     width ( g_rFit.right  );

    DWORD( * p    )( g_pFitBmpBits );
    DWORD( * pEnd )( p + width     );

    DWORD    bkgnd ( *p ); // assumed nothing drawn there

    while( TRUE )
    {
        do
        {
            if( ( *p ^ bkgnd ) & 0xFFFFFF )
            {
                goto found_y1;
            }
        }
        while( ++p < pEnd );

        pEnd += width;
    }

found_y1:
    g_FitBox.y1 = ( p - g_pFitBmpBits ) / width;

    // bottom

    p    = g_pFitBmpBits + width * ( g_rFit.bottom - 1 ); // last scanline
    pEnd = p + width;

    while( TRUE )
    {
        do
        {
            if( ( *p ^ bkgnd ) & 0xFFFFFF )
            {
                goto found_y2;
            }
        }
        while( ++p < pEnd );

        p    -= width * 2;
        pEnd -= width;
    }

found_y2:
    g_FitBox.y2 = ( p - g_pFitBmpBits ) / width;

    if( g_FitBox.ys() > g_rClockCli.bottom )
    {
        return FALSE;
    }

    // left

    DWORD( * pb ) ( g_pFitBmpBits + width * g_FitBox.y1 ); // first on found top

             p    = pb;
             pEnd = pb            + width * g_FitBox.ys();

    while( TRUE )
    {
        do
        {
            if( ( *p ^ bkgnd ) & 0xFFFFFF )
            {
                goto found_x1;
            }
        }
        while( ( p += width ) < pEnd );

        p = ++pb;
    }

found_x1:
    g_FitBox.x1 = ( p - g_pFitBmpBits ) % width;

    // right

    pb = g_pFitBmpBits + width * g_FitBox.y1 + ( width - 1 ); // last on found top
    p  = pb;

    while( TRUE )
    {
        do
        {
            if( ( *p ^ bkgnd ) & 0xFFFFFF )
            {
                goto found_x2;
            }
        }
        while( ( p += width ) < pEnd );

        p = --pb;
    }

found_x2:
    g_FitBox.x2 = ( p - g_pFitBmpBits ) % width;

    // 170,xxx ticks

    return g_FitBox.xs() <= g_rClockCli.right;
}


лови файл...

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Clock.cpp 30,84 Kb
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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