Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1029300
  • 博文数量: 177
  • 博客积分: 3629
  • 博客等级: 中校
  • 技术积分: 1839
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-23 21:21
文章分类

全部博文(177)

文章存档

2021年(1)

2020年(5)

2019年(4)

2018年(7)

2017年(1)

2016年(4)

2014年(1)

2013年(8)

2012年(10)

2011年(50)

2009年(12)

2008年(10)

2006年(56)

2005年(8)

分类: C/C++

2006-04-21 12:02:41

控制还是放在对话框里使用比较方便.
 
先说说偶的用法.
偶用的是一对话框程序.
先在对话框资源里加一个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) |
给主人留下些什么吧!~~