I created a dialog application in Visual C ++ 2012 using MFC.

In this application, on the dialog box is CTabCtrl , on which several pages are hung. On one of these pages I programmatically placed a scrollable component (which I took from http://www.codeproject.com/Articles/4087/H...le-child-dialog ). On this component are checkboxes and text fields. This component scrolls normally, the checkboxes and the associated on / off (enable / disable) of these text fields are normally processed on it.

But for some reason, when I move the application window, this inserted component does not move with this window, but remains in the same place on the screen where it was programmatically placed.

How to make this software hosted component move with the application window when moving this window?

Here is the code:

 ExpandedWrap disabled 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 file:

 ExpandedWrap disabled #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 

In the ScrollDialog1.cpp file:

 ExpandedWrap disabled 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(); } } 

File VertScrollDialog.h:

 ExpandedWrap disabled #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 

In the VertScrollDialog.cpp file:

 ExpandedWrap disabled 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; 

(I created two classes CVertScrollDialog1 and its descendant CScrollDialog1 because I want to create one more descendant of the class CVertScrollDialog1 there is another scrolling dialog based on the existing one).

    0