//But.h
#pragma once
class CBut : public CButton
{
DECLARE_DYNAMIC(CBut)
public:
CBut();
virtual ~CBut();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClicked();
afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
};
глобальные переменные и их объявления
Заголовочный и исполняемый файлы для класса наследника CButton:
Код:
Код:
//But.cpp
#include "stdafx.h"
#include "P01.h"
#include "But.h"
IMPLEMENT_DYNAMIC(CBut, CButton)
CBut::CBut()
{
}
CBut::~CBut()
{
}
#include "stdafx.h"
#include "P01.h"
#include "But.h"
IMPLEMENT_DYNAMIC(CBut, CButton)
CBut::CBut()
{
}
CBut::~CBut()
{
}
Файлы для "скролимого" класса:
Код:
//DlgScrollable.h
..........
..........
#include "But.h";
class CDlgScrollable : public CDialog
{
// Construction
public:
CListBox* pclb;
CStatic* ps;
CBut* but;
class elem
{
public:
.........
.........
};
elem *pelka, *backup;
elem& PrepareCreData(CString q);
};
..........
..........
#include "But.h";
class CDlgScrollable : public CDialog
{
// Construction
public:
CListBox* pclb;
CStatic* ps;
CBut* but;
class elem
{
public:
.........
.........
};
elem *pelka, *backup;
elem& PrepareCreData(CString q);
};
Код:
// DlgScrollable.cpp : implementation file
//
#include "stdafx.h"
#include "P01.h"
#include "DlgScrollable.h"
#include <math.h>
..............
CDlgScrollable::CDlgScrollable(CWnd* pParent /*=NULL*/)
: CDialog(CDlgScrollable::IDD, pParent)
{
...........
}
// CDlgScrollable message handlers
BOOL CDlgScrollable::OnInitDialog()
{
.............
backup = new CDlgScrollable::elem();
return TRUE;
}
CDlgScrollable::elem::elem()
{
}
CDlgScrollable::elem::elem(int n_q, int n_a, bool isTable)
{
..................
}
void CDlgScrollable::z_GenerateQ(int n)
{
pclb=new (CListBox);
ps = new(CStatic);
but = new (CBut);
but->Create(_T("button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|LVS_REPORT, recbut, this, IDC_CLB);
}
//
#include "stdafx.h"
#include "P01.h"
#include "DlgScrollable.h"
#include <math.h>
..............
CDlgScrollable::CDlgScrollable(CWnd* pParent /*=NULL*/)
: CDialog(CDlgScrollable::IDD, pParent)
{
...........
}
// CDlgScrollable message handlers
BOOL CDlgScrollable::OnInitDialog()
{
.............
backup = new CDlgScrollable::elem();
return TRUE;
}
CDlgScrollable::elem::elem()
{
}
CDlgScrollable::elem::elem(int n_q, int n_a, bool isTable)
{
..................
}
void CDlgScrollable::z_GenerateQ(int n)
{
pclb=new (CListBox);
ps = new(CStatic);
but = new (CBut);
but->Create(_T("button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|LVS_REPORT, recbut, this, IDC_CLB);
}
Файлы класса диалога:
Код:
// P01Dlg.h : header file
//
#include "StdAfx.h"
#include "DlgScrollable.h"
class CP01Dlg : public CDialog
{
// Construction
public:
CDlgScrollable* m_pdlgScroll;
}
//
#include "StdAfx.h"
#include "DlgScrollable.h"
class CP01Dlg : public CDialog
{
// Construction
public:
CDlgScrollable* m_pdlgScroll;
}
Код:
// P01Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "P01.h"
#include "P01Dlg.h"
................
................
BOOL CP01Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
...............
m_pdlgScroll=new CDlgScrollable(this);
return TRUE; // return TRUE unless you set the focus to a control
}
//
#include "stdafx.h"
#include "P01.h"
#include "P01Dlg.h"
................
................
BOOL CP01Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
...............
m_pdlgScroll=new CDlgScrollable(this);
return TRUE; // return TRUE unless you set the focus to a control
}
Для события клика класса CBut определена функция OnBnClicked, внутри которой нужно получить доступ к объекту m_pdlgScroll.
Как это сделать? пытался объявить глобальную переменную, но ничего не получилось. Где это правильнее всего сделать?
и как работать с переменными, объявленными как extern ??
Код:
CDialog *dlg = (CDialog *)GetParent();
dlg->................................
dlg->................................
Если же доступ нужен именно к членам CDlgScrollable, тогда придется включить DlgScrollable.h в But.cpp и написать в OnBnClicked
Код:
CDlgScrollable *dlg = (CDlgScrollable *)GetParent();
dlg->................................
dlg->................................
Возможно это не лучшее решение со стилистической точки зрения, но по идее оно должно работать.
Теперь по поводу etxern. Работает все просто. В одном файле объявляете пременную: что-то типа
Код:
int a;
В другом файле просто пишите
Код:
extern int a;
Все, у Вас одна общая переменная для двух файлов.