问题描述
我有一个派生自 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;
}