Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > ...вспомнить всё ...GDI...


Автор: maaks_mouse 11.5.2007, 13:06
Коллеги(позвольте сказать).... есть очень не скромный вопрос ...решил на досуге повспоминать "молодость"...
и... склероз зараза не лечится - он забывается ...воб щем ЧТО я хочу? --> нарисовать линию! ))

...что я сделал --> в Dlg.h создал : 
Код

...
CDC *mainDC, memDC;
...


птом в C_ckt_graph1Dlg.cpp....

Код

BOOL C_ckt_graph1Dlg::OnInitDialog()
{
                      ........

    mainDC = GetDC();
    memDC.CreateCompatibleDC(mainDC);

    CPen p;
    p.CreatePen(PS_SOLID, 2, RGB(0,0,0) );
    HGDIOBJ oldP = memDC.SelectObject(&p);
    
    memDC.MoveTo(20,20);
    memDC.LineTo(50,50);
    memDC.LineTo(200,70);
    memDC.LineTo(50,90);

    memDC.SelectObject(oldP);
    Invalidate(FALSE);
    
    return TRUE; 
}

void C_ckt_graph1Dlg::OnPaint( ) 
{
    ...........
    
    mainDC->BitBlt(0,0, 500,500, &memDC, 0,0, SRCCOPY );

}




...ии ...НИЧЕГО  smile    ...дебажил вроде как все норм ...подскажите НА ЧТО обратить внимание ...что не так ...что забыл???

Автор: Nastya 11.5.2007, 13:11
В OnPaint Надо саздвать PaintDC - и рисовать на нем. попробуй.
mainDC - лучше не сохранять так на долго

Автор: zkv 11.5.2007, 14:41
maaks_mouse, надо предварительно битмап еще создать нужных размеров и выбрать в контекст
Цитата

mainDC - лучше не сохранять так на долго

его вообще нет смысла членом класса делать
Цитата

В OnPaint Надо саздвать PaintDC - и рисовать на нем.

точно!

Автор: DigitSphinx 11.5.2007, 18:13
нужен CBitmap !
Код

BOOL C_ckt_graph1Dlg::OnInitDialog()
{
    ........
    mainDC = GetDC();
    memDC.CreateCompatibleDC(mainDC);
    CBitmap MemBtmp;
    MemBtmp.CreateCompatibleBitmap(mainDC, width, height);
    memDC.SelectObject(&MemBtmp);
    ........
}

Цитата

В OnPaint Надо саздвать PaintDC - и рисовать на нем. попробуй.
mainDC - лучше не сохранять так на долго

человек делает через буфер !, ну и правильно делает !!

Автор: maaks_mouse 11.5.2007, 20:44
...блин ...делаю ТАК

Код

                     mainDC = GetDC();
    memDC.CreateCompatibleDC(mainDC);
    bmp.CreateCompatibleBitmap(&memDC, 500,500);
    memDC.SelectObject(&bmp);

    p.CreatePen(PS_SOLID, 2, RGB(255,0,0));
    old = memDC.SelectObject(&p);

    memDC.MoveTo(20,20);
    memDC.LineTo(50,50);
    memDC.LineTo(60,90);
    memDC.LineTo(90,100);

    memDC.SelectObject(&old);

    Invalidate (FALSE);



...все объекты  -  свойства класса ...


И НИФИГАШЕЧКИ smile  smile  smile

Добавлено через 10 минут и 3 секунды
все!! ...я понял!!! ..вот так надо


Код

    mainDC = GetDC();
    memDC.CreateCompatibleDC(mainDC);
    bmp.CreateCompatibleBitmap(mainDC, 500,500);
    memDC.SelectObject(&bmp);

    p.CreatePen(PS_SOLID, 2, RGB(255,0,0));
    old = memDC.SelectObject(&p);

    memDC.MoveTo(20,20);
    memDC.LineTo(50,50);
    memDC.LineTo(60,90);
    memDC.LineTo(90,100);

    memDC.SelectObject(&old);;

Автор: DigitSphinx 11.5.2007, 21:02
Код

::OnInitDialog()
{
............
        CBitmap bmp;
        mainDC = GetDC();
        memDC.CreateCompatibleDC(mainDC);
        bmp.CreateCompatibleBitmap(mainDC, 500,500);
        memDC.SelectObject(&bmp);
        memDC.FillRect(CRect(0, 0, 500, 500), &CBrush(RGB(255, 255, 255)));
        CPen * p = new CPen(PS_SOLID, 5, RGB(255,0,0));
        memDC.SelectObject(p);
...........
}
..........
::OnPaint()
{
...................
        memDC.MoveTo(20,20);
        memDC.LineTo(50,50);
        memDC.LineTo(60,90);
        memDC.LineTo(90,100);
        mainDC->BitBlt(0, 0, 500, 500, &memDC, 0, 0, SRCCOPY);
..............
}

Цитата

все!! ...я понял!!! ..вот так надо

ну и как работает без mainDC->BitBlt(…..); ???????

Автор: zkv 11.5.2007, 21:48
Цитата(DigitSphinx @  11.5.2007,  21:02 Найти цитируемый пост)
ну и как работает без mainDC->BitBlt(…..); ???????

 smile можно конечно и обезьяну научить курить, только нафига?
DigitSphinx, вам в МСДН доводилось заглядывать?
Цитата(MSDN)

CWnd::GetDC 
Retrieves a pointer to a common, class, or private device context for the client area depending on the class style specified for the CWnd.

CDC* GetDC( );
Return Value
Identifies the device context for the CWnd client area if successful; otherwise, the return value is NULL. The pointer may be temporary and should not be stored for later use.

Remarks
For common device contexts, GetDC assigns default attributes to the context each time it is retrieved. For class and private contexts, GetDC leaves the previously assigned attributes unchanged. The device context can be used in subsequent graphics device interface (GDI) functions to draw in the client area.

Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting. Since only five common device contexts are available at any given time, failure to release a device context can prevent other applications from accessing a device context. 

Про это вам и намекала Nastya  smile 
PS
члены класса:
Код

    CDC m_dcMem;
    CBitmap m_bmMem;


в реализации:
Код

BOOL CTestDCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    //...
    CDC *pdcMain = GetDC(); //можно юзать CClientDC(this)
    m_dcMem.CreateCompatibleDC( pdcMain );
    m_bmMem.CreateCompatibleBitmap( pdcMain, 200, 200 );
    ReleaseDC( pdcMain );//если юзать CClientDC(this), то он сам это сделает
    m_dcMem.SelectObject( m_bmMem );
    m_dcMem.FillSolidRect( 0,0, 200, 200, RGB(255,255,255) );

    CPen p;
    p.CreatePen(PS_SOLID, 2, RGB(255,0,0));
    CPen *old = m_dcMem.SelectObject(&p);
    m_dcMem.MoveTo(20,20);
    m_dcMem.LineTo(50,50);
    m_dcMem.LineTo(60,90);
    m_dcMem.LineTo(90,100);
    m_dcMem.SelectObject( old );
return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestDCDlg::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    dc.BitBlt(0, 0, 200, 200, &m_dcMem, 0, 0, SRCCOPY);
}

Автор: DigitSphinx 11.5.2007, 23:49
Когда  я прочитал ваш ответ , я сидел, делал Лабу по прогр.(я не только учусь но еще и студент  smile ) В которой надо таблицы рисовать и т.д. , я взял и вставил в OnInitDialog() строчку ReleaseDC(pDC); и прога перестала чего либо рисовать что меня удивило (после MSDN)  но когда я вместо ReleaseDC(pDC);  вставил pDC->ReleaseAttribDC(); опять заработала !
И я понял что ничего не понял !
Но все равно большое спасибо zkv,
пошел учится …. 

Автор: zkv 12.5.2007, 00:05
Цитата(DigitSphinx @  11.5.2007,  23:49 Найти цитируемый пост)
И я понял что ничего не понял !

да я тоже мало чего понимаю smile
если интересно, то http://www.codeproject.com/gdi/CBufferDC.asp дополнительная инфа по фликерному вопросу

Автор: maaks_mouse 12.5.2007, 11:22
zkv ...про BitBlt само собой не забыл  smile 
...а вообще спасибо, zkv, за расталковывание!  smile 
...и вообще всем сэнкс  smile  ...отдельный Насте  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)