控制还是放在对话框里使用比较方便.
先说说偶的用法.
偶用的是一对话框程序.
先在对话框资源里加一个TabCtrl.(IDC_TAB1)
然后再加上变量:
CTabCtrl m_tab1;
再在 OnInitDialog 里:
m_tab1.Attach(GetDlgItem(IDC_TAB1));
往下就可以利用m_tab1添加项了.
插入新tab标签:
m_tab1.InsertItem(0,"0");
InsertItem有三种,可以只创建字符串的,或者带图片的(需要设置好图片集).
要生成树状列表
CTreeViewCtrlEx m_tree1;
......
m_tree1.Create(GetDlgItem(IDC_TAB1));
m_tree1.SetWindowLong(GWL_STYLE,TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT|(m_tree1.GetWindowLong(GWL_STYLE)));
CTreeItem ti=m_tree1.InsertItem("first",TVI_ROOT,TVI_LAST);
CTreeItem sub1_ti=m_tree1.InsertItem("sub1",ti,TVI_LAST);
sub1_ti.AddTail("one",0);
这里有三个层次:
InsertItem返回一CTreeItem对象,替代了SDK上说的HTREEITEM结构,使用起来更方便.
返回的CTreeItem对象同样也能用InsertItem函数.循环使用即可.
AddTail,AddHead中只不过是为了使用方便加的,实质和InsertItem一样的,调用
::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);
TVM_*之类消息可看最新MS 2003 SDK,定位如下:
ms-help://MS.PSDK.1033/shellcc/platform/commctls/treeview/treeview.htm
关于控件的相互定位有下面一段代码:
void ResizeControl()
{
RECT rect;
GetClientRect(&rect); //得到对话框的客户坐标,由于是主窗口,应该是屏幕坐标
m_tab1.MoveWindow(&rect);
RECT rs;
m_tab1.GetClientRect(&rs); //等到TabCtrl的客户区坐标,不是屏幕坐标.
rs.top+=20;
rs.bottom-=4;
rs.left+=4;
rs.right/=4; //根据情况调整大小
ClientToScreen(&rs);
m_tree1.MoveWindow(&rs);
m_tree1.ShowWindow(TRUE); //由于TabCtrl是在资源里建的,可见.而m_tree还不可视
}
还要处理消息,加上图标......
看来VC做界面即使WTL也是要很麻烦的,没法子.
补充:
TabCtrl_AdjustRect宏可以计算Tab控制的显示区域.因为假如一个客户区分给Tab控制,而Tab控制本身(如标签,padding,margin)要用一部分空间,所以要想和控制在外观上不冲突,必须把别的窗口放在控制的显示区域里面.在精准定位时需要这个宏.
相关函数:DeferWindowPos
阅读(5161) | 评论(0) | 转发(0) |