随笔-341  评论-2670  文章-0  trackbacks-0
    Vista提供的Common Control Library 6.0的BUTTON类中提供了两种新的按钮:Command Link和Split Button。只需要在CreateWindow里面指定BS_COMMANDLINK与BS_SPLITBUTTON就可以获得这两种新的控件了。

    实习的时候每天自己的时间不是很多,加上有一些预定事项,教程只能在周末写了。闲暇之余,我继续完成半年前没写完的C++ GUI库。这个库的特点在于用起来跟Delphi、VB、C#差不多,而且指定事件很方便(前面关于2D的文章中有出现)。于是今晚加上了这两个控件。

    话说回来,XP下Common Control Library 6.0的bug似乎在Vista底下消灭了不少。
  1 #include "..\..\..\..\VL++\Library\Windows\VL_WinMain.h"
  2 #include "..\..\..\..\VL++\Library\Windows\Commctrl\VL_WinButton.h"
  3 #include "..\..\..\..\VL++\Library\Windows\Commctrl\VL_WinContainers.h"
  4 
  5 using namespace vl;
  6 using namespace vl::windows;
  7 
  8 class MyForm : public VL_WinForm
  9 {
 10 public:
 11     VL_WinGroup*        groupA;
 12     VL_WinButton*        buttonA;
 13     VL_WinCheck*        checkA;
 14     VL_WinCheck*        checkB;
 15     VL_WinCheck*        checkC;
 16     VL_WinRadio*        radioA;
 17     VL_WinRadio*        radioB;
 18     VL_WinRadio*        radioC;
 19     VL_WinSplitButton*    splitA;
 20     VL_WinCommandLink*    clA;
 21 
 22     void InitControls()
 23     {
 24         groupA=new VL_WinGroup(this);
 25         groupA->SetLeft(10);
 26         groupA->SetTop(10);
 27         groupA->SetWidth(380);
 28         groupA->SetHeight(380);
 29         groupA->SetText(L"Group A");
 30 
 31         buttonA=new VL_WinButton(groupA);
 32         buttonA->SetLeft(10);
 33         buttonA->SetTop(20);
 34         buttonA->SetWidth(100);
 35         buttonA->SetHeight(20);
 36         buttonA->SetText(L"Button A");
 37 
 38         splitA=new VL_WinSplitButton(groupA);
 39         splitA->SetLeft(120);
 40         splitA->SetTop(20);
 41         splitA->SetWidth(100);
 42         splitA->SetHeight(20);
 43         splitA->SetText(L"Split A");
 44 
 45         checkA=new VL_WinCheck(groupA);
 46         checkA->SetLeft(10);
 47         checkA->SetTop(50);
 48         checkA->SetWidth(100);
 49         checkA->SetHeight(20);
 50         checkA->SetText(L"Check A");
 51 
 52         checkB=new VL_WinCheck(groupA);
 53         checkB->SetLeft(10);
 54         checkB->SetTop(80);
 55         checkB->SetWidth(100);
 56         checkB->SetHeight(20);
 57         checkB->SetText(L"Check B");
 58 
 59         checkC=new VL_WinCheck(groupA);
 60         checkC->SetLeft(10);
 61         checkC->SetTop(110);
 62         checkC->SetWidth(100);
 63         checkC->SetHeight(20);
 64         checkC->SetText(L"Check A");
 65 
 66         radioA=new VL_WinRadio(groupA);
 67         radioA->SetLeft(120);
 68         radioA->SetTop(50);
 69         radioA->SetWidth(100);
 70         radioA->SetHeight(20);
 71         radioA->SetText(L"Radio A");
 72 
 73         radioB=new VL_WinRadio(groupA);
 74         radioB->SetLeft(120);
 75         radioB->SetTop(80);
 76         radioB->SetWidth(100);
 77         radioB->SetHeight(20);
 78         radioB->SetText(L"Radio B");
 79 
 80         radioC=new VL_WinRadio(groupA);
 81         radioC->SetLeft(120);
 82         radioC->SetTop(110);
 83         radioC->SetWidth(100);
 84         radioC->SetHeight(20);
 85         radioC->SetText(L"Radio A");
 86 
 87         clA=new VL_WinCommandLink(groupA);
 88         clA->SetLeft(10);
 89         clA->SetTop(140);
 90         clA->SetWidth(200);
 91         clA->SetHeight(100);
 92         clA->SetText(L"Text");
 93         clA->SetNote(L"with a command note");
 94     }
 95 
 96     MyForm():VL_WinForm(true)
 97     {
 98         SetClientWidth(400);
 99         SetClientHeight(400);
100         SetText(L"Vczh Form");
101         MoveCenter();
102         InitControls();
103         Show();
104     }
105 };
106 
107 void main()
108 {
109     new MyForm;
110     GetApplication()->Run();
111 }

    至于MFC为什么要创建一个对象之后调用Create才能够真的构造出一个控件,原因在于MFC的开发者执着于『不使用指针代表控件』,而且C++的构造函数里面调用不到被子类覆盖的虚函数,才搞成了那个样子。

    今天贴代码的时候,发现cppblog终于支持C++了。
posted on 2008-07-22 06:41 陈梓瀚(vczh) 阅读(1920) 评论(10)  编辑 收藏 引用 所属分类: C++

评论:
# re: Vista的新控件 2008-07-22 08:13 | foxtail
我也发现支持C++额哈 他默认就是  回复  更多评论
  
# re: Vista的新控件 2008-07-22 23:01 | foxtail
有空讲讲你的gui库的设计框架和思路哈  回复  更多评论
  
# re: Vista的新控件 2008-07-23 04:27 | suxiaojack
MFC的窗体对象(控件窗体对象)等等是给用户的操作层,和系统层面的窗体“实物”,本来就是通过句柄指针联系起来的,互相之间通信依靠的消息处理,怎么说MFC的开发者执着于『不使用指针代表控件』?  回复  更多评论
  
# re: Vista的新控件 2008-07-23 06:02 | 梦在天涯
支持C++了吗?那真是太好了啊!  回复  更多评论
  
# re: Vista的新控件 2008-07-24 06:08 | 陈梓瀚(vczh)
@suxiaojack
我的意思是,控件在形式上不是引用。譬如说.net还是delphi,都是引用。因为C++语法的缘故,不强迫人们使用new来创建控件的话,结果就会变成『存在对象不等于存在控件』,用起来会很不舒服。  回复  更多评论
  
# re: Vista的新控件 2008-07-24 19:52 | cexer
强迫用new来创建对象,在一些场合当中会造成设计上的难题。
比如假设有设计为了更大的灵活性,要求对象的创建与对象管理的资源的初始化与创建能够要分步进行。  回复  更多评论
  
# re: Vista的新控件 2008-07-25 08:42 | MiGL
@cexer
可以使用Factory或者prototype模式解决,也许会好一些。  回复  更多评论
  
# re: Vista的新控件 2008-07-25 19:44 | 陈梓瀚(vczh)
窗口最需要的是资源文件或者等价物,这个已经被多年的开发证明了。所以使用new创建是更加合理的。  回复  更多评论
  
# re: Vista的新控件 2008-07-26 01:59 | cexer
这个没有绝对的吧,得看具体的环境。

比如有一个GUI框架,它用prototype模式从xml产生界面。分几步进行
1.解析器看到一个结点
<window name="xxxx" text="xxx ... />
2.从prototype的注册表里查找节点名字"window"对应的prototype,并clone出对象window
3.将xml结点传给对象,调用对象的创建函数window->create( XmlElement& xml )

我觉得在这种方式下先new后create会比一步创建好得多。当然也可以第二步时,将xml结点也同时传给prototype创建者,一步创建成功,不过这样比起分步进行,一是少了一个可控制进行其它操作的机会,二是如果以后创建方式有所更改,就也得同时更改prototype创建者的代码。


  回复  更多评论
  
# re: Vista的新控件 2008-07-27 06:28 | 陈梓瀚(vczh)
所以嘛,如果一直都用new的话就改不了了。而且这实际上也基本未曾发生过。我们应该阻止创建方法改变而不是允许改变而让绝大多数程序都更囧。而且所有的控件库都有很多set*函数,因此是允许创建后改变的。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理