Проблема с программным размещением компонента

 
0
 
C++
ava
erslgoeirjh | 12.10.2016, 10:05
Я создал диалоговое приложение на Visual C++ 2012 с использованием MFC.

В этом приложении на диалоговом окне находится CTabCtrl, на который повешено несколько страниц. На одной из этих страниц я программно поместил прокручиваемый компонент (который я взял с http://www.codeproject.com/Articles/4087/H...le-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();
    }
}



Файл VertScrollDialog.h :


#ifndef VERTSCROLLDIALOG_H
#define VERTSCROLLDIALOG_H

class CVertScrollDialog : public CDialog
{
    //DECLARE_DYNAMIC(CScrollDialog1)

public:
    CPoint  m_ptDragPoint;
    int  m_nScrollPos;
    int  m_nCurHeight;
// Данные диалогового окна
    enum { IDD };

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()
public:
    //afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
};

#endif



В файле VertScrollDialog.cpp :


CVertScrollDialog::CVertScrollDialog(CWnd* pParent /*=NULL*/)
    : CDialog(CVertScrollDialog::IDD, pParent)
{
    m_bDragging = FALSE;
    //Create(IDD,pParent);
}

CVertScrollDialog::CVertScrollDialog(int idd, CWnd* pParent)
    : CDialog(idd, pParent)
{
    m_bDragging = FALSE;
    //Create(idd,pParent);
}

CVertScrollDialog::~CVertScrollDialog()
{
}

void CVertScrollDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CVertScrollDialog, CDialog)
    ON_WM_VSCROLL()
    ON_WM_SIZE()
    ON_WM_MOUSEWHEEL()
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSEMOVE()
    ON_WM_KILLFOCUS()
    ON_WM_SETCURSOR()
END_MESSAGE_MAP()


// обработчики сообщений CScrollDialog1

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

    GetWindowRect(m_rcOriginalRect);
    m_nScrollPos = 0;
    return TRUE;
}


// прочие методы класса CVertScrollDialog;

(Я создал два класса CVertScrollDialog1 и его наследник CScrollDialog1 потому что я хочу потом создать ещё один потомок класса CVertScrollDialog1--то есть ещё один прокручиваемый диалог на основе существующего).
Ответы (2)
ava
Sajtran | 14.10.2016, 07:05 #
не силён в MFC, но судя по поведению Parent Win у вашего контрола десктоп - т.е. это отдельное окно Windows
ava
erslgoeirjh | 14.10.2016, 11:25 #
Проблема решена: надо у этого вставляемого прокручиваемого диалога поставить стиль WS_CHILD, то есть дочерний стиль.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить