Я создал диалоговое приложение на Visual C++ 2012 с использованием MFC.
В этом приложении на диалоговом окне находится CTabCtrl, на который повешено несколько страниц. На одной из этих страниц я программно поместил прокручиваемый компонент (который я взял с
http://www.codeproject.com/Articles/...e-child-dialog ).
На этом компоненте находятся чекбоксы и текстовые поля. Этот компонент нормально прокручивается, на нём нормально отрабатываются нажатия чекбоксов и связанное с этим включение/отключение (энейбление/дизейбление) этих текстовых полей.
Но у меня почему-то при перемещении окна приложения этот вставленный компонент не перемещается вместе с этим окном, а остаётся на том же месте экрана, куда он был программно помещён.
Как сделать так, чтобы этот программное размещаемый компонент перемещался вместе с окном приложения при перемещении этого окна?
Вот код:
Код:
class CPage2 : public CDialog
{
DECLARE_DYNAMIC(CPage2)
public:
CPage2(CWnd* pParent = NULL); // стандартный конструктор
virtual ~CPage2();
// Данные диалогового окна
enum { IDD = IDD_DIALOG2 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
DECLARE_MESSAGE_MAP()
public:
CScrollDialog1* m_pScrollDialog1;
// прочие компоненты и функции;
};
void CPage2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
// соответствия между компонентами на странице CPage2 и переменными на этой странице,
// переменная m_pScrollDialog сюда не вставлена;
}
BOOL COrbitaPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
CRect cr;
CPage1 *pPage1;
CPage2 *pPage2;
CPage3 *pPage3;
CPage4 *pPage4;
CClientDC dc(this);
m_IDC_TAB1.startbc = dc.GetDCPenColor();
TC_ITEM TabItem;
TabItem.mask = TCIF_TEXT;
TabItem.pszText = "Исходные НУ";
m_IDC_TAB1.InsertItem(0,&TabItem);
TabItem.pszText = "Модель движения";
m_IDC_TAB1.InsertItem(1,&TabItem);
TabItem.pszText = "Измерения";
m_IDC_TAB1.InsertItem(2,&TabItem);
TabItem.pszText = "Краевая задача";
m_IDC_TAB1.InsertItem(3,&TabItem);
CSize csize;
csize.SetSize(100,28);
m_IDC_TAB1.SetItemSize(csize);
LOGFONT lf2;
CFont font4;
memset(&lf2,0,sizeof(LOGFONT));
strcpy(lf2.lfFaceName,"Ms Shell Dlg");
lf2.lfHeight = 12;
lf2.lfWeight = 700;
pPage2 = new CPage2(this);
TabItem.mask = TCIF_PARAM;
TabItem.lParam = (LPARAM)pPage2;
m_IDC_TAB1.SetItem(0,&TabItem);
VERIFY(pPage2->Create(CPage2::IDD,&m_IDC_TAB1));
pPage2->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
pPage2->ShowWindow(SW_SHOW);
pPage2->m_pScrollDialog1 = new CScrollDialog1(pPage2);
pPage2->m_pScrollDialog1->Create(IDD_SCROLLDIALOG1,pPage2);
CRect rc;
rc.left = 530;
rc.top = 660;
rc.right = 780;
rc.bottom = 780;
pPage2->m_pScrollDialog1->MoveWindow(rc);
pPage2->m_pScrollDialog1->EnableWindow(0);
pPage2->m_pScrollDialog1->ShowWindow(SW_SHOW);
// работа с другими компонентами на странице CPage2;
// работа со страницами CPage1*, CPage3*, CPage4* ;
}
Файл ScrollDialog1.h :
Код:
#ifndef SCROLLDIALOG1_H
#define SCROLLDIALOG1_H
#include "VertScrollDialog.h"
#include "afxwin.h"
//#pragma once
// диалоговое окно CScrollDialog1
//class CScrollDialog1 : public CDialog
class CScrollDialog1 : public CVertScrollDialog
{
DECLARE_DYNAMIC(CScrollDialog1)
public:
CScrollDialog1(CWnd* pParent = NULL); // стандартный конструктор
virtual ~CScrollDialog1();
//void EndDrag();
//CRect m_rcOriginalRect;
//BOOL m_bDragging;
//CPoint m_ptDragPoint;
//int m_nScrollPos;
//int m_nCurHeight;
// Данные диалогового окна
enum { IDD = IDD_SCROLLDIALOG1 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
/* virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
//virtual void OnCancel();
//virtual void OnOK();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnKillFocus(CWnd* pNewWnd);
DECLARE_MESSAGE_MAP() */
//DECLARE_MESSAGE_MAP()
public:
//afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
CButton m_IDC_CHECK5;
CEdit m_IDC_EDIT16;
CEdit m_IDC_EDIT13;
CEdit m_IDC_EDIT14;
CEdit m_IDC_EDIT17;
DECLARE_MESSAGE_MAP()
afx_msg void OnBnClickedCheck5();
};
#endif
В файле ScrollDialog1.cpp :
Код:
IMPLEMENT_DYNAMIC(CScrollDialog1, CDialog)
CScrollDialog1::CScrollDialog1(CWnd* pParent /*=NULL*/)
: CVertScrollDialog(CScrollDialog1::IDD, pParent)
{
//m_bDragging = FALSE;
//Create(CScrollDialog1::IDD,pParent);
/* RECT rc;
rc.left = 7;
rc.top = 2;
rc.right = 99;
rc.bottom = 10;
m_IDC_CHECK5.Create(" импульс коррекции Ak1",BS_AUTOCHECKBOX|WS_TABSTOP,rc,this,IDC_CHECK5);
m_IDC_CHECK5.SetCheck(0);
rc.left = 58;
rc.top = 31;
rc.right = 76;
rc.bottom = 14;
m_IDC_EDIT13.Create(ES_AUTOHSCROLL,rc,this,IDC_EDIT13);
rc.left = 58;
rc.top = 44;
rc.right = 75;
rc.bottom = 14;
m_IDC_EDIT14.Create(ES_AUTOHSCROLL,rc,this,IDC_EDIT14);
rc.left = 32;
rc.top = 15;
rc.right = 102;
rc.bottom = 14;
m_IDC_EDIT16.Create(ES_AUTOHSCROLL,rc,this,IDC_EDIT16);
rc.left = 58;
rc.top = 56;
rc.right = 75;
rc.bottom = 14;
m_IDC_EDIT17.Create(ES_AUTOHSCROLL,rc,this,IDC_EDIT17); */
}
CScrollDialog1::~CScrollDialog1()
{
}
void CScrollDialog1::DoDataExchange(CDataExchange* pDX)
{
CVertScrollDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CHECK5, m_IDC_CHECK5);
DDX_Control(pDX, IDC_EDIT16, m_IDC_EDIT16);
DDX_Control(pDX, IDC_EDIT13, m_IDC_EDIT13);
DDX_Control(pDX, IDC_EDIT14, m_IDC_EDIT14);
DDX_Control(pDX, IDC_EDIT17, m_IDC_EDIT17);
}
BEGIN_MESSAGE_MAP(CScrollDialog1, CVertScrollDialog)
ON_BN_CLICKED(IDC_CHECK5, &CScrollDialog1::OnBnClickedCheck5)
END_MESSAGE_MAP()
void CScrollDialog1::OnBnClickedCheck5()
{
// TODO: добавьте свой код обработчика уведомлений
//if (m_IDC_CHECK5.GetCheck()==1)
int check;
/* this->UpdateData();
this->UpdateWindow();
this->UpdateDialogControls(this,FALSE); */
check = m_IDC_CHECK5.GetCheck();
if (check==BST_CHECKED)
{
m_IDC_EDIT13.EnableWindow(1);
m_IDC_EDIT14.EnableWindow(1);
m_IDC_EDIT16.EnableWindow(1);
m_IDC_EDIT17.EnableWindow(1);
}
if (check==BST_UNCHECKED)
{
m_IDC_EDIT13.EnableWindow(0);
m_IDC_EDIT14.EnableWindow(0);
m_IDC_EDIT16.EnableWindow(0);
m_IDC_EDIT17.EnableWindow(0);
//check = m_IDC_CHECK5.GetCheck();
}
}