Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: графическое изображение обекта  (Прочитано 10008 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
borsh
Интересующийся

ru
Offline Offline

« : 21-03-2014 11:01 » 

Здравствуйте, может подскажет кто. Простая вещь - создал объект (класс) вMFC Visual C++. Хочу, чтобы одним из его свойств было графическое изображение. Чтобы при создании данного объекта это изображение появлялось на экране. В общем, надо на экране видеть изображение манометра, насоса, термометра и т.п. для создания схемы испытательной установки. Я хочу создать каждый такой прибор как отдельный объект, имеющий свое графическое изображение на экране. Желательно также, чтобы это изображение могло отражать состояние объекта - значение температуры, давления и т.д.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-03-2014 11:36 » 

Надо выбрать правильный базовый класс, чтобы в результате получился пользовательский control. См. в этом направлении.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
borsh
Интересующийся

ru
Offline Offline

« Ответ #2 : 21-03-2014 11:45 » 

А пример базового класса не подскажете? Cdialog подойдет? И в каком направлении дальше смотреть - может ссылочку подкинете?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 21-03-2014 13:36 » 

CWnd, отрисовывать в OnPaint
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
borsh
Интересующийся

ru
Offline Offline

« Ответ #4 : 02-04-2014 11:30 » 

Сделал вроде как вы сказали:
Должно вроде в OnPaint этого объекта manometr чегото нарисовать - но не рисует. Пока неважно чего - хоть черный квадрат. В этом отрывке есть кое-что лишнее, но главное - есть класс manometr, есть его создание  в основном окне и попытка прорисовки в OnPaint(). Но не рисует ну ничего!

Код: (C++)
/////////класс типа CWnd////////////////////////
class CManometr : public CWnd
{
public:
        CManometr(int n);//конструтор
        ~CManometr();//деструктор
        virtual BOOL OnInitDialog();
        afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd, UINT nCtlColor);
        afx_msg void OnPaint();
        CBrush* m_pEditBkBrush;
        void OnLButtonDblClk(UINT, CPoint);//вирт процедура ответа на двойной щелчок левой кнопкой
       
        int ManometrNumber;
        COLORREF Color;
        CStatic *ManometrName;
        CEdit *VerhPlita;
        CEdit *SredPlita;
        CEdit *NizhPlita;
        DECLARE_MESSAGE_MAP()
};

CManometr::~CManometr()
{
        delete m_pEditBkBrush;
}

CManometr::CManometr(int n)
{
        ManometrNumber=n;
        m_pEditBkBrush=new CBrush(RGB(0,0,0));
}


BOOL CManometr::OnInitDialog()
{
        CString Name;
        Name.Format("№%d",ManometrNumber);
        ManometrName=new CStatic();
        ManometrName->Create("",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(10,0,65,15),this,IDC_STATIC_NUMBER);
        ManometrName->SetWindowText(Name);
        VerhPlita=new CEdit();
        if(VerhPlita!=NULL) VerhPlita->Create(WS_CHILD|WS_VISIBLE,CRect(0,30,73,48),this,IDC_EDIT1);
        SredPlita=new CEdit();
        if(SredPlita!=NULL) SredPlita->Create(WS_CHILD|WS_VISIBLE,CRect(0,60,73,78),this,IDC_EDIT2);
        NizhPlita=new CEdit();
        if(NizhPlita!=NULL) NizhPlita->Create(WS_CHILD|WS_VISIBLE,CRect(0,90,73,108),this,IDC_EDIT3);
        Color=0x00F0F0F0;
        return TRUE;
}


/*typedef struct
{
        CManometr *Manometr1;
        CManometr *Manometr2;
}TDAddress[45];
*/

void CManometr::OnLButtonDblClk(UINT,CPoint)
{
AfxMessageBox("Щелкнули дважды на объекте");
}

void CManometr::OnPaint()
{
        CClientDC dc(this);
        CPen br,br0,br1,br2,brz;
        int Reading[3],ReadingOld[3];
        int StartTime,DurationTime,MaxTime,DurTimeOld;
        CDC dc2;
        CBitmap bit;


        br0.CreatePen(PS_SOLID,2,RGB(255,0,0));
        br1.CreatePen(PS_SOLID,2,RGB(0,255,0));
        br2.CreatePen(PS_SOLID,2,RGB(0,0,255));

        bit.CreateCompatibleBitmap(&dc,780,460);
        dc2.CreateCompatibleDC(&dc);
        dc2.SelectObject(&bit);
        ///////////////////////////////////////////////////черный квадрат//////////////
        dc2.FillSolidRect(0,0,780,460,RGB(255,0,0));

}

HBRUSH CManometr::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor)
{

switch (nCtlColor)
        {
                case CTLCOLOR_EDIT:
                {
                        pDC->SetTextColor(RGB(0,0,0));
                        pDC->SetBkColor(Color);
                        return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
                }
                default:
//                      return (HBRUSH) CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
                        ;
        }
       
        //return my_color;
}

BEGIN_MESSAGE_MAP(CManometr, CWnd)
        ON_WM_LBUTTONDBLCLK()
        ON_WM_CTLCOLOR()
               ON_WM_PAINT()
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////КОНЕЦ КОДА РАБОТЫ С ОБЪЕКТОМ CManometr//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////


Код: (C++)
/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CMainWnd- основное окно////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

class CMainWnd:public CFrameWnd
{
public: CMainWnd(); //Конструктор по умолчанию
                virtual BOOL OnInitDialog();
                void OnOpen();
                afx_msg void OnRButtonDblClk(UINT, CPoint);
                int OnCreate(LPCREATESTRUCT lpCreateStuct);  
                void MenuExit();
                afx_msg void OnPaint();//функция прорисовки окна
                ~CMainWnd();//деструктор

protected:
        int i;
        afx_msg void OnTimer(UINT nIDEvent);
public:
        CListBox m_output1;


private:
        BOOL blMenu; //какое меню активно
        CMenu m_wndMenu;//класс меню
        CDialog *m_pDialog;
        CManometr *m_manometr;

        CMyPaintDC *paintDC;
        DECLARE_MESSAGE_MAP();
};

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)//таблица откликов на сообщения, в скобках КЛАСС РЕАГИРУЮЩИЙ (ОКНО) и КЛАСС РОДИТЕЬЛ ЭТОГО ОКНА
        ON_WM_LBUTTONDBLCLK()
        ON_WM_RBUTTONDBLCLK()
        ON_WM_KEYDOWN()
        ON_WM_CREATE()
        ON_WM_PAINT()
        ON_COMMAND(ID_400_1,OnOpen)
        ON_COMMAND(ID_EXIT,MenuExit)
       
END_MESSAGE_MAP()

BOOL CMainWnd::OnInitDialog()
{
        return TRUE;
}
               
void CMainWnd::OnPaint()
{
        CMyPaintDC dc(this); //получить контекст устройства -
        CPen MyPen(PS_SOLID,3,RGB(0,0,0));

}

void CMainWnd::OnRButtonDblClk(UINT,CPoint)
{
        CDialog about(IDD_DIALOG1);//создаем объект класса диалогового окна
        if(about.DoModal()==IDOK)  AfxMessageBox("Ok");
        else AfxMessageBox("Cancel");
}
void CMainWnd::OnOpen()
{
        CFileDialog fileDialog(TRUE,NULL,".txt");
        int result=fileDialog.DoModal();
        if (result==IDOK)
        {
        }
}
void CMainWnd::MenuExit()
{
        DestroyWindow();
}


////создаю объект манометр/////////////////////////////
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return -1;
        m_wndMenu.LoadMenu(IDR_MENU);//загрузить меню из файла ресурса
        SetMenu(&m_wndMenu);


        m_manometr=new CManometr(1);
        if (m_manometr!=NULL) m_manometr->Create(NULL,"",WS_CHILD|WS_VISIBLE,CRect(0,0,200,200),this,1234);
        m_manometr->MoveWindow(300,80,83,250,TRUE);
        m_manometr->OnInitDialog();
        m_manometr->OnPaint();
       
        return 0;
}

CMainWnd::CMainWnd()  //реализация конструктора

{
        blMenu=FALSE;
        Create(NULL,"CТенд №15",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);
}                       //создать окно программы

CMainWnd::~CMainWnd()
{

}

Код: (C++)
/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CMyApp-запуск программы////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

class CMyApp:public CWinApp
{
public:
        CMyApp();//конструктор
        virtual BOOL InitInstance();//стандартная инициализация
};

CMyApp::CMyApp()
{}


BOOL CMyApp::InitInstance()
{
        m_pMainWnd=new CMainWnd();//создать класс окна
        ASSERT(m_pMainWnd);                     //проверить его правильность
        m_pMainWnd->ShowWindow(SW_SHOW);//показать окно
        m_pMainWnd->UpdateWindow();//обновить окно
return TRUE;
};

CMyApp theApp;//запуск приложения
« Последнее редактирование: 03-04-2014 11:26 от Вад » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 02-04-2014 15:22 » 

Блииин... как всё запущено... Всё в кучу собрал. Откуда у тебя, к примеру, CManometr::OnInitDialog()? Это ж не диалог.

В какой студии работаем?

Вот так примерно, примитивненько  должен выглядеть твой Манометр:

вот это всё в .h
Код: (C++)
/////////класс типа CWnd////////////////////////
class CManometr : public CWnd
{
DECLARE_DYNAMIC(CManometr)
public:
   CManometr() {}
   ~CManometr() {}

   virtual BOOL Create(const RECT& rect, CWnd* pParentWnd, UINT nID = (UINT)-1);

protected:
   afx_msg void OnPaint();
   DECLARE_MESSAGE_MAP()
};

вот это всё в .cpp

Код: (C++)
IMPLEMENT_DYNAMIC(CManometr, CWnd)

BEGIN_MESSAGE_MAP(CManometr, CWnd)
        ON_WM_PAINT()
END_MESSAGE_MAP()

BOOL CManometr::Create(const RECT& rect, CWnd* pParentWnd, UINT nID)
{
        return CWnd::Create(NULL, L"", WS_CHILD | WS_VISIBLE, rect, pParentWnd, nID);
}

void CManometr::OnPaint()
{
   CPaintDC dc(this);
   CRect rcClient;
   GetClientRect(&rcClient);
   dc.FillSolidRect(&rcClient, RGB(255,0,0));
}

В CMainWnd::OnCreate делаешь нечто...

Код: (C++)
...
        CRect rectDummy(10, 10, 300, 200);
        m_manometr->Create(rectDummy, this, -1);
...

с остальным сам поиграешься.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
borsh
Интересующийся

ru
Offline Offline

« Ответ #6 : 03-04-2014 11:00 » 

Спасибо, Джон, помогли продвинуться. Все сделал как вы сказали, картинка появилась, но если два квадрата один поверх другого, то начинает моргать. Также на двойной клик на объекте зависает.

Как будто идет постоянная циклическая перерисовка объекта. Посмотрите пожалуйста. Работаю в MS VisualStudio 2008

Внизу тексты .h - файла и .cpp файла.

Хотел приложить заархивированный весь проект, но не пролезает. Если подскажете почту, то могу прислать, чтобы легче было понять где глюк.

.h файл
Код: (C++)
class CManometr : public CWnd
{
DECLARE_DYNAMIC(CManometr)
public:
        CManometr();//конструтор
        ~CManometr();//деструктор
        virtual BOOL Create(const RECT& rect,CWnd* pParentWnd,UINT nID=(UINT)-1);
        void OnLButtonDblClk(UINT, CPoint);//вирт процедура ответа на двойной щелчок левой кнопкой

       
protected:
        afx_msg void OnPaint();
        DECLARE_MESSAGE_MAP()
};

.с файл
Код: (C++)
#include "afxwin.h"
#include "afxext.h"//библиотека расширений MFC
#include "resource.h"
#include "Manometr.h"

#define IDC_MYBUTTON    100
#define IDC_MYEDIT              102


/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CManometr/////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

CManometr::~CManometr()
{
       
}

CManometr::CManometr()
{
}


IMPLEMENT_DYNAMIC(CManometr,CWnd)


BOOL CManometr::Create(const RECT&rect, CWnd* pParentWnd,UINT nID)
{
        return CWnd::Create(NULL,"",WS_CHILD|WS_VISIBLE,rect,pParentWnd,nID);
}

void CManometr::OnPaint()
{
        CClientDC dc(this);
       
        CRect rcClient;
        GetClientRect(&rcClient);
        dc.FillSolidRect(&rcClient,RGB(0,0,0));

        rcClient.SetRect(10,40,60,60);
        dc.FillSolidRect(&rcClient,RGB(255,0,255));
}

void CManometr::OnLButtonDblClk(UINT,CPoint)
{
AfxMessageBox("Щелкнули дважды на объекте");
}
BEGIN_MESSAGE_MAP(CManometr, CWnd)//таблица откликов на сообщения, в скобках КЛАСС РЕАГИРУЮЩИЙ (ОКНО) и КЛАСС РОДИТЕЬЛ ЭТОГО ОКНА
        ON_WM_PAINT()
        ON_WM_LBUTTONDBLCLK()

END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////КОНЕЦ КОДА РАБОТЫ С ОБЪЕКТОМ CManometr//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CMainWnd- основное окно////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

class CMainWnd:public CFrameWnd
{
public: CMainWnd(); //Конструктор по умолчанию
                int OnCreate(LPCREATESTRUCT lpCreateStuct); //эта функция вызывается при создании окна
                ~CMainWnd();//деструктор

protected:
        int i;
public:


private:
        CManometr *m_manometr;
        DECLARE_MESSAGE_MAP();
};

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)//таблица откликов на сообщения, в скобках КЛАСС РЕАГИРУЮЩИЙ (ОКНО) и КЛАСС РОДИТЕЬЛ ЭТОГО ОКНА
        ON_WM_CREATE()
END_MESSAGE_MAP()


int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return -1;

        CRect rectDummy(10,10,120,200);
        m_manometr=new CManometr();
        if (m_manometr!=NULL) m_manometr->Create(rectDummy,this,-1);
        m_manometr->MoveWindow(500,80,83,250,TRUE);
       
       
        return 0;
}

CMainWnd::CMainWnd()  //реализация конструктора

{
        Create(NULL,"стенд №15",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);
}                       //создать окно программы

CMainWnd::~CMainWnd()
{

}
« Последнее редактирование: 03-04-2014 11:28 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-04-2014 11:40 » new

Зачем вручную вызывается макрос обработки события Paint? Он не для того предназначен. Для вызова отрисовки нужно либо использовать метод Update, либо послать операционной системе уведомление о том, что картинка "испорчена" и требует перерисовки - метод Invalidate.

Моргание происходит по двум причинам:

1) Оттого, что существуют два отдельных события: отрисовки фона элемента и отрисовки картинки. Соответственно, отрисовку фона нужно отключить.

2) Оттого, что прямоугольники накладываются друг на друга, и видно, как это прорисовывается - здесь нужно использовать двойную буферизацию вывода, т.е. сначала полностью нарисовать картинку, затем вывести её внутри элемента.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 03-04-2014 12:56 » 

если два квадрата один поверх другого, то начинает моргать.

Совершенно верно. И никак иначе. Никаких глюков нет. И чем больше объектов, тем сильней моргает.

Как я уже сказал, это был примитивненький манометр. И он свою задачу выполнил: ты хотел хоть что-нибудь увидеть ("хоть черный квадрат"), ты увидел. Теперь его надо "модернизировать".

Для борьбы с "морганием" используется способ известный под названием "двойная буферизация". Его смысл заключается в том, что
основная отрисовка происходит НЕ в DC экрана, а в некий объект (класса CDC), который абсолютно совместим с экранным, но находится исключительно в памяти. После отрисовки всех необходимых графических объектов, результирующая картинка копируется из этого объекта, его можно назвать "Memory Device Context", уже в DC экрана с помощью ф-ции BitBlt. Ты можешь посмотреть (рекомендую) сначала MSDN, чтобы освоить матчасть, про эту ф-ю. А потом, по результатам, либо задать вопросы, либо поискать на форуме - ключ поиска BitBlt.
Мы разбирали эту тему, и всё что с ней связано, уже неоднократно. Например здесь.

зы
Хотел приложить заархивированный весь проект, но не пролезает. Если подскажете почту, то могу прислать, чтобы легче было понять где глюк.
Для этого надо в папке проекта удалить всё "ненужное". Для этого:
1. завершить работу Студии (она может "держать" некоторые файлы)
2. Удалить файлы генерируемые самой студией:

- Папки Debug/Release - обычно они называются как компиляция, например если компиляция называется Debug Unicode, то и папка называется соответственно.
- Папку ipch (если такая в 2008 студии создаётся, у меня к сожалению сейчас только 2012 и 2013, так что ориентируюсь на них)
- фалы с расширением: *.sdf, *.suo, *.aps, *.ilk, *.pdb, *.exe

Все эти файлы генерируются студией и на код никак не влияют. В принципе, можно удалять все файлы, дата/время изменения котороых совпадает с временем последней компиляции проекта. После этого заархивированный проект занимает несколько килобайт.

зы зы Да, и можно на "ты", если ты не имеешь ввиду конечно сразу многих.
« Последнее редактирование: 03-04-2014 13:11 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
borsh
Интересующийся

ru
Offline Offline

« Ответ #9 : 07-04-2014 11:15 » 

Джон, спасибо что помогаешь. А то у нас на заводе нет времени разобраться в чем то одном. Приходится то паяльником работать, то чертежи рисовать, то программировать. Это я к тому, что не судите строго.

Как рисовать без мерцания я разобрался с твоей помощью. Однако остался вопрос - почему были эти мерцания. Я так понимаю, что по какой-то причине постоянно срабатывало сообщение ON_WM_PAINT и постоянно происходила перерисовка экрана. Отсюда было и мигание. По этой же причине программа зависает по двойному клику на этот объект. Откуда происходит эта постоянная циклическая прорисовка экрана - понять не могу. Вроде ON_PAINT должно вызываться только когда реально на экране что-то меняется - сжимается окно или растягивается, мышь ползет по экрану и т.п. В общем, если можно подскажи, почему программа зависает при двойном клике на объекте и как избежать многократной циклической перерисовки экрана.

Текст программы подправил, привожу ниже:

*.h файл

Код: (C++)
class CManometr : public CWnd
{
DECLARE_DYNAMIC(CManometr)
public:
        CManometr();//конструтор
        ~CManometr();//деструктор
        virtual BOOL Create(const RECT &rect,CWnd *pParentWnd,UINT nID=(UINT)-1);
        void OnLButtonDblClk(UINT, CPoint);//вирт процедура ответа на двойной щелчок левой кнопкой

        afx_msg void OnPaint();
protected:
        DECLARE_MESSAGE_MAP()
};

.c файл

Код: (C++)
#include "afxwin.h"
#include "afxext.h"//библиотека расширений MFC
#include "resource.h"
#include "Manometr.h"


/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CManometr/////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////


CManometr::~CManometr()
{
       
}

CManometr::CManometr()
{
}

IMPLEMENT_DYNAMIC(CManometr,CWnd)
BOOL CManometr::Create(const RECT&rect, CWnd* pParentWnd,UINT nID)
{
        flag=2;
        return CWnd::Create(NULL,"",WS_CHILD|WS_VISIBLE,rect,pParentWnd,nID);
}

void CManometr::OnPaint()
{
        CClientDC dc(this);
        CDC* dcTemp;
        CBitmap* oldBmp;
        CBitmap* memBmp;


                memBmp=new CBitmap();
                memBmp->CreateCompatibleBitmap(&dc,100,100);
               
                dcTemp=new CDC();
                dcTemp->CreateCompatibleDC(&dc);

                oldBmp=dcTemp->SelectObject(memBmp);

                /////////рисуем один квадрат в контекст dcTemp//////////////////////////////////////////
                CRect rcClient;
                GetClientRect(&rcClient);
                dcTemp->FillSolidRect(&rcClient,RGB(0,0,0));
                /////////рисуем второй квадрат в контекст dcTemp///////////////////////////////////////
                rcClient.SetRect(10,40,70,60);
                dcTemp->FillSolidRect(&rcClient,RGB(255,0,255));
                ///////////копируем нарисованное с контекста dcTemp на контекст экрана dc//////////////
                dc.BitBlt(0,0,100,100,dcTemp,0,0,SRCCOPY);
               
                dcTemp->SelectObject(oldBmp);
                memBmp->DeleteObject();
                dcTemp->DeleteDC();

}

void CManometr::OnLButtonDblClk(UINT,CPoint)
{
AfxMessageBox("Щелкнули дважды на объекте");
}
BEGIN_MESSAGE_MAP(CManometr, CWnd)//таблица откликов на сообщения, в скобках КЛАСС РЕАГИРУЮЩИЙ (ОКНО) и КЛАСС РОДИТЕЬЛ ЭТОГО ОКНА
        ON_WM_PAINT()
        ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////КОНЕЦ КОДА РАБОТЫ С ОБЪЕКТОМ CManometr//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////




/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CMainWnd- основное окно////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

class CMainWnd:public CFrameWnd
{
public: CMainWnd(); //Конструктор по умолчанию
                int OnCreate(LPCREATESTRUCT lpCreateStuct); //эта функция вызывается при создании окна
                ~CMainWnd();//деструктор

protected:
        int i;
public:


private:
        CManometr *m_manometr;
        DECLARE_MESSAGE_MAP();
};

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)//таблица откликов на сообщения, в скобках КЛАСС РЕАГИРУЮЩИЙ (ОКНО) и КЛАСС РОДИТЕЬЛ ЭТОГО ОКНА
        ON_WM_CREATE()
END_MESSAGE_MAP()



int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return -1;

        CRect rectDummy(10,10,120,200);
        m_manometr=new CManometr();
        if (m_manometr!=NULL) m_manometr->Create(rectDummy,this,-1);
        m_manometr->MoveWindow(500,80,83,250,TRUE);
        m_manometr->UpdateWindow();
       
       
        return 0;
}

CMainWnd::CMainWnd()  //реализация конструктора

{
        Create(NULL,"стенд №15",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);
}                       //создать окно программы

CMainWnd::~CMainWnd()
{

}



/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////СОЗДАНИЕ И РАБОТА С КЛАССОМ CMyApp-запуск программы////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

class CMyApp:public CWinApp
{
public:
        CMyApp();//конструктор
        virtual BOOL InitInstance();//стандартная инициализация
};

CMyApp::CMyApp()
{}


BOOL CMyApp::InitInstance()
{
        m_pMainWnd=new CMainWnd();//создать класс окна
        ASSERT(m_pMainWnd);                     //проверить его правильность
        m_pMainWnd->ShowWindow(SW_SHOW);//показать окно
        m_pMainWnd->UpdateWindow();//обновить окно
return TRUE;
};

CMyApp theApp;//запуск приложения

* Стенд 15 IF вер4.rar (8.55 Кб - загружено 783 раз.)
« Последнее редактирование: 07-04-2014 15:53 от Вад » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines