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).