Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
3 / 3 / 1
Регистрация: 12.07.2013
Сообщений: 123

Трудности с программным размещением компонента на странице

12.10.2016, 10:13. Показов 649. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я создал диалоговое приложение на Visual C++ 2012 с использованием MFC.

В этом приложении на диалоговом окне находится CTabCtrl, на который повешено несколько страниц. На одной из этих страниц я программно поместил прокручиваемый компонент (который я взял с http://www.codeproject.com/Art... ild-dialog ).
На этом компоненте находятся чекбоксы и текстовые поля. Этот компонент нормально прокручивается, на нём нормально отрабатываются нажатия чекбоксов и связанное с этим включение/отключение (энейбление/дизейбление) этих текстовых полей.

Но у меня почему-то при перемещении окна приложения этот вставленный компонент не перемещается вместе с этим окном, а остаётся на том же месте экрана, куда он был программно помещён.

Как сделать так, чтобы этот программное размещаемый компонент перемещался вместе с окном приложения при перемещении этого окна?

Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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 :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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 :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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 :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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 :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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()
 
 
// обработчики сообщений CVertScrollDialog1
 
BOOL  CVertScrollDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
 
    GetWindowRect(m_rcOriginalRect);
    m_nScrollPos = 0;
    return TRUE;
}
 
// прочие методы класса CVertScrollDialog;
(Я создал два класса CVertScrollDialog1 и его наследник CScrollDialog1 потому что я хочу потом создать ещё один потомок класса CVertScrollDialog1--то есть ещё один прокручиваемый диалог на основе существующего).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2016, 10:13
Ответы с готовыми решениями:

Трудности с размещением страниц на CTabCtrl внутри другого CTabCtrl
На диалоговом окне есть компонент TAB_CTRL1 типа CTabCtrl, на котором расположены несколько страниц--pPage1, pPage2, pOrbitDefinition,...

Как убрать вывод контента и компонента на детальной странице?
Здравствуйте, подскажите пожалуйста решения. Создал страницу, вывел на ней компонент новости, отображается все хорошо, на этой же странице...

Операция new с размещением
проблема:Во второй элемент структуры данные не передаются, почему? Стоит отметить, что, если использовать просто new без размещения, то все...

1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
12.10.2016, 22:04
Цитата Сообщение от erslgoeirjh Посмотреть сообщение
чтобы перемещался вместе с окном приложения при перемещении этого окна?
erslgoeirjh, проверьте, имеет ли этот компонент стиль WS_CHILD. Можно непосредственно просмотреть rc-файл. Вот пример содержимого rc-файла

IDD_TAB1 DIALOGEX 0, 0, 284, 126
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "Вкладка 1",IDC_STATIC,55,25,36,8
END

Либо с помощью Visual Studio - см.рис.
Миниатюры
Трудности с программным размещением компонента на странице  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2016, 22:04
Помогаю со студенческими работами здесь

Уравнение с размещением
Помогите пожалуйста решить равенство с размещением На форуме для этих целей есть Редактор формул A_n^5=18 A_{n-2}^4

. с размещением блока и картинок!
<div class="five_section"> <div id="line_1"> <div class="card" style="background: url(img_13.jpg) center center;...

Помогите с размещением окна
Всем привет! Помогите с выводом окна в центр экрана, а то болтается при каждом выводе как попало. Вот код, а где дописать, чтобы...

Проблема с размещением заголовка
привет всем! пишу такой текст <html> <head> <title>HTML заголовок</title> </head> <body> <h1>HTML заголовок 1-го...

Сложности с размещением сайта
Доброе утро, уважаемые программисты) У меня есть локальный сайт joomla. Мне нужно разместить его на хостингере.ру Базу mysql я перенес,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru