MFC:根据请求将 CListView 选项卡添加到 CTabView (CBCGPTabView) 不会调用 CMyListView::OnInitialUpdate()

问题描述

我有一个派生自 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Main extends Frame { public Main() { Button bt = new Button("Click me"); bt.setBounds(20,40,80,30); bt.setBackground(Color.green); bt.setForeground(Color.blue); Label l1 = new Label("This is label"); l1.setBounds(20,90,30); TextField tf1 = new TextField(); tf1.setBounds(20,120,150,30); TextArea ta = new TextArea(); ta.setBounds(20,170,350,100); CheckBox cb1 = new CheckBox("cb1"); cb1.setBounds(200,40); CheckBox cb2 = new CheckBox("cb2"); cb2.setBounds(200,65,40); MyCanvas cv = new MyCanvas(); add(bt); add(l1); add(tf1); add(ta); add(cb1); add(cb2); add(cv); setSize(400,300); setLayout(null); setVisible(true); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { Frame frame = (Frame)e.getSource(); frame.dispose(); } }); bt.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { l1.setText("button click..."); } }); } public static void main(String[] args) { // write your code here Main m = new Main(); } } class MyCanvas extends Canvas{ public MyCanvas(){ setBackground(Color.cyan); setBounds(250,100,100); } public void paint(Graphics g){ g.setColor(Color.red); g.drawoval(240,42,70,50); g.drawString("JAVA is best",252,94); } } (CMyTabView) 的 CBCGPTabView,我想动态添加标签添加的选项卡将是从 CTabView 派生的 CMyListView。如果我在 CListView 期间添加标签它工作正常。如果我尝试通过自定义消息执行此操作,它会添加选项卡,但它是空白的(从未调用 CMyTabView::OnCreate())。

我需要做什么才能让它工作?

这是有效的(测试标签):

CMyListView::OnInitialUpdate()

这不会(除了添加带有空白窗口的选项卡)。

int CMyTabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (__super::OnCreate(lpCreateStruct) == -1)
    return -1;

  CBCGPTabWnd &tabctrl=GetTabControl();

  int index=AddView(RUNTIME_CLASS(CMyForm),_T("My Form"));
  if (index!=-1) {
    m_IDTabMyForm=tabctrl.GetTabID(index);
  }

  AddView(RUNTIME_CLASS(CMyListView),_T("Test"));

  tabctrl.HideNoTabs();

  return 0;
}

解决方法

事实证明你必须自己调用它,以下版本有效:

afx_msg LRESULT CMyTabView::OnUwmAddMyListViewTab(WPARAM wparam,LPARAM lparam)
{
  CString mytabname;
  mytabname=_T("My ListView");
  
  // check if tab already exists - if so select it
  CBCGPTabWnd &tabcontrol=GetTabControl();
  for (int i=0; i<tabcontrol.GetTabsNum(); i++) {
    CString tablabel;
    if (tabcontrol.GetTabLabel(i,tablabel)) {
      if (tablabel==mytabname) {
        tabcontrol.SetActiveTab(i);
        return 0;
      }
    }
  }
  // new tab so add it
  int index=AddView(RUNTIME_CLASS(CMyListView),mytabname);
  if (index!=-1) {
    CView* thetabview=GetView(index);
    if (thetabview) {
      // we need to call OnInitUpdate ourself
      thetabview->SendMessage(WM_INITIALUPDATE);
      //make sure any child windows of the view get the message too
      thetabview->SendMessageToDescendants(WM_INITIALUPDATE,TRUE,TRUE);
    }

    tabcontrol.SetActiveTab(index);
  }
  
  return 0;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...