c++ TabControl选项卡上的控件已禁用

pb3s4cty  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(77)

Update-3这是解决方案:而不是使用“this”,这是对表单视图的引用,敏欣于建议用一个指针来替换“CMFCTabCtrl m_wndTab”控件。谢谢。对于代码,请比较我提供的答案。
Update-2:似乎所有4个选项卡页的对话框选项卡页的标题栏都被删除了。我在InitialUpdaye中使用的代码是:

m_wnd1.ModifyStyle(WS_CAPTION, 0);
m_wnd2.ModifyStyle(WS_CAPTION, 0);
m_wnd3.ModifyStyle(WS_CAPTION, 0);
m_wnd4.ModifyStyle(WS_CAPTION, 0);

字符串

更新-1:请注意,删除标题的代码在TabControlView.cpp中的oninitialupdate中,实现列表控件的代码在CPPL_4(.h文件和.cpp文件)中。最后一个同样重要的代码是:请从下面提供的链接下载代码:https://github.com/microsoft/VCSamples/blob/master/VC2010Samples/MFC/Visual%20C%2B%2B%202008%20Feature%20Pack/TabControl/TabControlView.cpp。谢谢。

我希望实现以下目标:
有一个选项卡控件(CTabCtrl),并在该选项卡控件的每个选项卡上添加1个列表控件(CListCtrl)。该列表控件通过数据库填充(1个表对应1个列表控件)。在列表控件的列下是编辑控件,其宽度与列表控件的列相同。这些控件用于编辑列表控件的字段。
在编辑控件下有一些操作按钮(包括删除、更新和添加记录集(列表控件中的行)以及向上/向下移动一行、向上/向下移动一页等)。
由于这是我第一个使用选项卡控件的项目,我使用了一些MS代码从这里:
https://github.com/microsoft/VCSamples/blob/master/VC2010Samples/MFC/Visual%20C%2B%2B%202008%20Feature%20Pack/TabControl/TabControlView.cpp的一个。
解决方案是旧的,在使用它时,Visual Studio正在将它转换为最新版本的Visual Studio解决方案。代码正在运行。此示例程序的作者将Edit控件与Tab控件一起使用,这意味着每个Tab页都是一个编辑控件。操作的日志记录在列表框中进行,通过按钮可以看到对Tab控件的更改。
我更改了代码,使选项卡页面成为对话框,而不是使用编辑控件(我使用CDialogEx)。
当我发现标题栏令人不安时,我使用视图的oninitialupdate事件中的程序代码将其删除。只要我没有将列表控件添加到选项卡页面,这就是有效的。一旦我这样做了,标题就不是“可删除的”了。列表控件位于选项卡四上。附上了一张图像。
在第二个标签页标签二我添加了一个复选框。
这两个控件都不可访问(即,我无法选中/取消选中复选框,当我尝试单击列表控件中的行时没有显示任何选择,在CCP_4.cpp文件的末尾有一个单击事件代码,但从未达到该代码(即,书签从未停止执行!))。
我的目标是使第2页和第4页上的列表控件和复选框可以访问,同时使第4页上的标题栏消失,就像其他3页一样。请帮助。
我所做的:
我使用的四个属性页(大)作为我的“对话框”。然后,我为每个对话框创建了类。对于第四个类(选项卡4的对话框),我添加了一个虚函数“OnInitialUpdate”,并在其中添加了列表控制代码。(请比较第三个图像。它包含了对“添加资源”对话框和“资源”对话框的解释,该对话框显示了程序使用的对话框资源)
所有其他4个类都是由类向导生成的。
This is tab Four - one list control
This is tab Two - one check box
This is where I created additional dialogs and where I created the classes
The picture control is the only control needed here!
下面是cpp文件中tab Four(类CPPL_4)的代码:

// CPPL_4.cpp : implementation file
//

#include "pch.h"
#include "stdafx.h"
#include "TabControl.h"
#include "afxdialogex.h"
#include "CPPL_4.h"

// CPPL_4 dialog

IMPLEMENT_DYNAMIC(CPPL_4, CDialogEx)

CPPL_4::CPPL_4(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_PPL_4, pParent)
{
}

CPPL_4::~CPPL_4()
{
}

void CPPL_4::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
//DDX_Control(pDX, IDC_COLOR, m_list);
DDX_Control(pDX, IDC_LIST, m_list);
}

BEGIN_MESSAGE_MAP(CPPL_4, CDialogEx)
    ON_WM_ACTIVATE()
    ON_NOTIFY(NM_CLICK, IDC_LIST, &CPPL_4::OnClickList)
END_MESSAGE_MAP()

// CPPL_4 message handlers


BOOL CPPL_4::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    m_list.InsertColumn(0, _T("Column 1"));
    m_list.InsertColumn(1, _T("Column 2"));
    m_list.SetColumnWidth(0, 200);
    m_list.SetColumnWidth(1, 200);
    m_list.InsertItem(0, _T("   1  "));
    m_list.InsertItem(1, _T("   2  "));
    m_list.SetItemText(0, 1, "11");
    m_list.SetItemText(1, 1, "22");

    return FALSE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

void CPPL_4::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here
m_list.SetFocus();
MessageBox("Got click event on list control!");
*pResult = 0;
}


下面是Tab Four(类CPPL_4).h文件的代码:

#pragma once
#include "afxdialogex.h"

// CPPL_4 dialog

class CPPL_4 : public CDialogEx
{
DECLARE_DYNAMIC(CPPL_4)

public:
    CPPL_4(CWnd* pParent = nullptr);   // standard constructor
    virtual ~CPPL_4();

// Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_PPL_4 };
#endif

protected:
// DDX/DDV support
virtual void DoDataExchange(CDataExchange* pDX);    
    DECLARE_MESSAGE_MAP()
public:
    CListCtrl m_list;
    virtual BOOL OnInitDialog();
    afx_msg void OnClickList(NMHDR* pNMHDR, LRESULT* pResult);
};


除了虚拟OnInitDialog函数外,其他3个选项卡的所有内容都相同
这是我更新为最小化的skelleton的Form视图文件;它应该概述了我的问题:

#include "stdafx.h"
    #include "TabControl.h"

    #include "TabControlDoc.h"
    #include "TabControlView.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

    /////////////////////////////////////////////////////////////
    // CTabControlView

    IMPLEMENT_DYNCREATE(CTabControlView, CFormView)

    BEGIN_MESSAGE_MAP(CTabControlView, CFormView)
        ON_WM_CONTEXTMENU()
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////
    // CTabControlView construction/destruction

    CTabControlView::CTabControlView()
        : CFormView(CTabControlView::IDD)
    {
    }

    CTabControlView::~CTabControlView()
    {
    }

    void CTabControlView::DoDataExchange(CDataExchange* pDX)
        {
        CFormView::DoDataExchange(pDX);
        DDX_Control(pDX, IDC_TAB, m_wndTabLoc);
        //DDX_Control(pDX, IDC_STATIC_TABLOC, m_wndTabLoc);
    }

    BOOL CTabControlView::PreCreateWindow(CREATESTRUCT& cs)
    {
        // TODO: Modify the Window class or styles here by 
        // modifying the CREATESTRUCT cs

        return CFormView::PreCreateWindow(cs);
    }

    void CTabControlView::OnInitialUpdate()
    {
        // There is only one view ever, so it only needs to do 
        // the initial update once--otherwise the application is  
        // resized needlessly.
        static BOOL bUpdatedOnce = FALSE;
        if (bUpdatedOnce)
            return;
        bUpdatedOnce = TRUE;

        CFormView::OnInitialUpdate();
        GetParentFrame()->RecalcLayout();

        if (m_wndTab.GetSafeHwnd () != NULL)
        {
            return;
        }

        CRect rectTab;

        m_wndTabLoc.GetWindowRect (&rectTab);
        ScreenToClient (&rectTab);

        m_wndTab.Create (CMFCTabCtrl::STYLE_3D, rectTab, this, 1,
            CMFCTabCtrl::LOCATION_TOP);

        m_wnd1.Create(IDD_PPL_1, this);
        // remove title bar of dialog
        m_wnd1.ModifyStyle(WS_CAPTION, 0);

        m_wnd2.Create(IDD_PPL_2, this);         
       // remove title bar of dialog
        m_wnd2.ModifyStyle(WS_CAPTION, 0);

        m_wnd3.Create(IDD_PPL_3, this); 
        // remove title bar of dialog
        m_wnd3.ModifyStyle(WS_CAPTION, 0);

        m_wnd4.Create(IDD_PPL_4, this);
        // remove title bar of dialog
        // This did not work out!!!!
        m_wnd4.m_list.ModifyStyle(WS_CAPTION, 0);

        m_wndTab.AddTab (&m_wnd1, _T("One"), 0, FALSE);
        m_wndTab.AddTab (&m_wnd2, _T("Two"), 1, FALSE);
        m_wndTab.AddTab (&m_wnd3, _T("Three"), 2, FALSE);
        m_wndTab.AddTab (&m_wnd4, _T("Four"), 3, FALSE);

        UpdateData (FALSE);
    }

    /////////////////////////////////////////////////////////////
    // CTabControlView diagnostics

    #ifdef _DEBUG
    void CTabControlView::AssertValid() const
    {
        CFormView::AssertValid();
    }

    void CTabControlView::Dump(CDumpContext& dc) const
    {
        CFormView::Dump(dc);
    }

    CTabControlDoc* CTabControlView::GetDocument() // non-debug version is inline
    {
        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTabControlDoc)));
        return (CTabControlDoc*)m_pDocument;
    }
    #endif //_DEBUG

    /////////////////////////////////////////////////////////////
    // CTabControlView message handlers

    void CTabControlView::OnContextMenu(CWnd*, CPoint point)
    {
        theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
    }

更新了选项卡控件视图.h

#pragma once
    #include "CPPL_1.h"
    #include "CPPL_2.h"
    #include "CPPL_3.h"
    #include "CPPL_4.h"
    class CTabControlView : public CFormView
    {
    protected: // create from serialization only
        CTabControlView();
        DECLARE_DYNCREATE(CTabControlView)

    public:
        enum { IDD = IDD_TABCONTROL_FORM };

    // Attributes
    public:
        CTabControlDoc* GetDocument();

    protected:
        CMFCTabCtrl m_wndTab;

    // Operations
    public:
        CPPL_1 m_wnd1;
        CPPL_2 m_wnd2;
        CPPL_3 m_wnd3;
        CPPL_4 m_wnd4;
        // Overrides
        public:
        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
        virtual void OnInitialUpdate(); // called first time after construct

    // Implementation
    public:
        virtual ~CTabControlView();
    #ifdef _DEBUG
        virtual void AssertValid() const;
        virtual void Dump(CDumpContext& dc) const;
    #endif

    protected:
        //void AddNotification (LPCTSTR lpszText);

    protected:
        afx_msg void OnContextMenu(CWnd*, CPoint point);

        DECLARE_MESSAGE_MAP()
    public:
        //afx_msg void OnCbnSelchangeTabStyle();
        //afx_msg void OnStnClickedTab();
        CStatic m_wndTabLoc;
    };

    #ifndef _DEBUG  // debug version in TabControlView.cpp
    inline CTabControlDoc* CTabControlView::GetDocument()
       { return (CTabControlDoc*)m_pDocument; }
    #endif

已更新的TabControlView. h文件的结尾

7vhp5slm

7vhp5slm1#

我想让你知道,*Minxin Yu * 想出了答案,我只想结束我的问题,因为我得到了我一开始所要求的一切:
为什么有一个带有标题栏的对话框页面,尽管标题栏样式(WS_CAPTIOM)已被删除:
运行的代码是:

m_wnd4.ModifyStyle(WS_CAPTION, 0);

字符串
其中m_wnd4是CPPL_4类型(请进一步比较代码)
为什么我无法访问浏览器对话框上的控件?
这是闵馨玉的建议:
m_wnd1.Create(IDD_PPL_1,&m_wndTab);
其中原始代码有:
m_wnd1.Create(IDD_PPL_1,this);
“this”是指向表单视图的指针,&m_wndTab是指向MFCTabCtrl类型的选项卡控件的指针。
请查看完整的代码!
感谢所有帮助过我的人!
下面是代码,它实际上留下了一个问题,那就是:为什么我必须从示例项目中复制控件才能有一个可扩展的运行时控件。

void CTabControlView::OnInitialUpdate()
    {
        // There is only one view ever, so it only needs to do the initial
        // update once--otherwise the application is  resized needlessly.
        static BOOL bUpdatedOnce = FALSE;
        if (bUpdatedOnce)
            return;
        bUpdatedOnce = TRUE;

        CFormView::OnInitialUpdate();
        GetParentFrame()->RecalcLayout();

        if (m_wndTab.GetSafeHwnd () != NULL)
            return;

        CRect rectTab;

        m_wndTabLoc.GetWindowRect (&rectTab);
        ScreenToClient (&rectTab);

        m_wndTab.Create (CMFCTabCtrl::STYLE_3D, rectTab, this, 1, CMFCTabCtrl::LOCATION_TOP);
        // MinXin Wu suggested to replace "this" by "&m_wndTab"
        m_wnd1.Create(IDD_PPL_1, &m_wndTab); 

        // remove title bar of dialog
        m_wnd1.ModifyStyle(WS_CAPTION, 0);

        // MinXin Wu suggested to replace "this" by "&m_wndTab"
        m_wnd2.Create(IDD_PPL_2, &m_wndTab);
        // remove title bar of dialog
        m_wnd2.ModifyStyle(WS_CAPTION, 0);

        // MinXin Wu suggested to replace "this" by "&m_wndTab"
        m_wnd3.Create(IDD_PPL_3, &m_wndTab);

        // remove title bar of dialog
        m_wnd3.ModifyStyle(WS_CAPTION, 0);

        // MinXin Wu suggested to replace "this" by "&m_wndTab"
        m_wnd4.Create(IDD_PPL_4, &m_wndTab);

        // remove title bar of dialog
        m_wnd4.ModifyStyle(WS_CAPTION, 0);

        m_wndTab.AddTab (&m_wnd1, _T("One"), 0, FALSE);
        m_wndTab.AddTab (&m_wnd2, _T("Two"), 1, FALSE);
        m_wndTab.AddTab (&m_wnd3, _T("Three"), 2, FALSE);
        m_wndTab.AddTab (&m_wnd4, _T("Four"), 3, FALSE);
        UpdateData (FALSE);
        }


CPPL_1 - CPPL_4类可以在问题中找到这里是表单视图的头文件!

// This is a part of the Microsoft Foundation Classes C++ library.
    // Copyright (C) Microsoft Corporation
    // All rights reserved.
    //
    // This source code is only intended as a supplement to the
    // Microsoft Foundation Classes Reference and related
    // electronic documentation provided with the library.
    // See these sources for detailed information regarding the
    // Microsoft Foundation Classes product.

    #pragma once
    #include "CPPL_1.h"
    #include "CPPL_2.h"
    #include "CPPL_3.h"
    #include "CPPL_4.h"
    class CTabControlView : public CFormView
    {
    protected: // create from serialization only
        CTabControlView();
        DECLARE_DYNCREATE(CTabControlView)

    public:
        enum { IDD = IDD_TABCONTROL_FORM };

    // Attributes
    public:
        CTabControlDoc* GetDocument();

    protected:
        CMFCTabCtrl m_wndTab;

    // Operations
    public:
        CPPL_1 m_wnd1;
        CPPL_2 m_wnd2;
        CPPL_3 m_wnd3;
        CPPL_4 m_wnd4;
        // Overrides
        public:
        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
        virtual void OnInitialUpdate(); // called first time after construct

    // Implementation
    public:
        virtual ~CTabControlView();
    #ifdef _DEBUG
        virtual void AssertValid() const;
        virtual void Dump(CDumpContext& dc) const;
    #endif

    protected:
        //void AddNotification (LPCTSTR lpszText);

    protected:
        afx_msg void OnContextMenu(CWnd*, CPoint point);

        DECLARE_MESSAGE_MAP()
    public:
        //afx_msg void OnCbnSelchangeTabStyle();
        //afx_msg void OnStnClickedTab();
        CStatic m_wndTabLoc;
        afx_msg void OnStnClickedTab();
        afx_msg void OnBnClickedButton1();
    };

    #ifndef _DEBUG  // debug version in TabControlView.cpp
    inline CTabControlDoc* CTabControlView::GetDocument()
       { return (CTabControlDoc*)m_pDocument; }
    #endif

相关问题