Шустрый
Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005
Репутация: нет Всего: нет
|
Я создал диалоговое приложение на 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--то есть ещё один прокручиваемый диалог на основе существующего).
|