Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2016, 10:18   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Проблема с программным размещением компонента на странице

Я создал диалоговое приложение на 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();
    }
}
erslgoeirjh вне форума Ответить с цитированием
Старый 12.10.2016, 10:21   #2
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Файл 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--то есть ещё один прокручиваемый диалог на основе существующего).
erslgoeirjh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с разворачиванием текста на странице pimple2006 JavaScript, Ajax 4 27.10.2015 21:45
Проблема с размещением victor5133 HTML и CSS 1 01.11.2012 18:44
Visual Basic проблема с размещением программы на пк Rudimo Помощь студентам 0 26.03.2012 04:24
Проблема с программным запуском надстройки Solver kovalevskivf Microsoft Office Excel 5 22.05.2009 19:53