Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > MFC обновление окна


Автор: m9yt 20.9.2010, 16:05
Привет всем.
Пишу программу с ипользованием MFC, но есть проблемка. Когда что-то нарисую( например, на клавишу 1 рисуется квадрат, а на 2-круг и т.д.), а потом сверну(разверну) окно, то всё исчезает. Как можно сделать, чтобы ничего не исчезало?

Автор: ИванМ 20.9.2010, 16:29
m9yt, как вариант - сохранять изображения в compatible dc и потом при обновлении окна копировать оттуда.

Автор: Artemon 20.9.2010, 17:06
Стандартный вариант - в событии PAINT (не помню точное название), перерисовывать.
В результате прорисовка будет того, когда это реально необходимо

Автор: m9yt 20.9.2010, 17:44
Цитата(Artemon @ 20.9.2010,  17:06)
Стандартный вариант - в событии PAINT (не помню точное название), перерисовывать.
В результате прорисовка будет того, когда это реально необходимо

Вот мой вариант, не работает
Код

#include <afxwin.h>

class CEmpty: public CWinApp{
public:
    virtual BOOL InitInstance();
};

class CMainWnd: public CFrameWnd{
public:
    CMainWnd();
    ~CMainWnd() { }
    DECLARE_MESSAGE_MAP();
    afx_msg void OnPaint();
    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};

CEmpty CApp;
                        
CMainWnd::CMainWnd(){
    Create(NULL, "MFC", WS_OVERLAPPEDWINDOW, CRect(200, 200, 640, 480));
}


BOOL CEmpty::InitInstance()
{
    CMainWnd *pMainWnd = new CMainWnd;
    ASSERT(pMainWnd);
    m_pMainWnd = pMainWnd;
    pMainWnd->ShowWindow( SW_SHOW );
    pMainWnd->UpdateWindow();
    return TRUE;
}

int R=0;
void CMainWnd::OnPaint(){
 
    CPaintDC *pdc = new CPaintDC(this);
    CBrush brush;
    switch ( R ){
    case 1: 
        brush.CreateSolidBrush(RGB(255, 0, 0));
        pdc->SelectObject(&brush);
        pdc->Rectangle(200, 200, 100, 50);
        pdc->TextOut(100, 20, "Прямоугольник", strlen("Прямоугольник"));
        R=0;
        break;
    case 2: 
        brush.CreateSolidBrush(RGB(255, 255, 0));
        pdc->SelectObject(&brush);
        pdc->Ellipse(200, 200, 100, 50);
        pdc->TextOut(125, 20, "Эллипс", strlen("Эллипс"));
        R=0;
        break;
    case 3: 
        brush.CreateSolidBrush(RGB(0, 255, 0));
        pdc->SelectObject(&brush);
        pdc->Chord(200, 200, 100, 50, 154, 124, 51, 144);
        pdc->TextOut(125, 20, "Сегмент", strlen("Сегмент"));
        R=0;
        break;
    case 4:
        brush.CreateSolidBrush(RGB(0, 255, 255));
        pdc->SelectObject(&brush);
        pdc->Pie(200, 200, 100, 50, 254, 66, 51, 120);
        pdc->TextOut(125, 20, "Сектор", strlen("Сектор"));
        R=0;
        break;
    }
}

void CMainWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    char c=char(nChar);
    switch ( c ){
        case '1':
            R=1;
            break;
        case '2':
            R=2;
            break;
        case '3':
            R=3;
            break;
        case '4':
            R=4;
            break;
    }
    CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
    this->InvalidateRect(0);
}

BEGIN_MESSAGE_MAP( CMainWnd, CFrameWnd)
ON_WM_PAINT()
ON_WM_KEYDOWN()
END_MESSAGE_MAP() 

Автор: Artemon 20.9.2010, 18:03
В OnPaint заходит при отладке ?

Автор: m9yt 20.9.2010, 18:26
Цитата(Artemon @ 20.9.2010,  18:03)
В OnPaint заходит при отладке ?

Заходит

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