vs2010如何添加控件改变控件位置却无法保存设置

tab control控件
我将标签设置在bottom时,可以显示标签并可以点击,但是对话框没有内容显示 更没有切换效果,请问这是何故?但是我设置在顶部时,一切正常!
附上简短的代码:
在OnInitDialog中如下:
SetIcon(m_hIcon, TRUE);
// 设置大图标
SetIcon(m_hIcon, FALSE);
// 设置小图标
// TODO: 在此添加额外的初始化代码
CRect tabR
// 标签控件客户区的位置和大小
m_tab.InsertItem(0, _T("JAVA开发网"));
// 插入第一个标签“鸡啄米”
m_tab.InsertItem(1, _T("Android开发网"));// 插入第二个标签“Android开发网”
m_tab.InsertItem(2, _T("MFC开发网"));
m_dialog1.Create(IDD_DIALOG1,&m_tab);
// 创建第一个标签页
m_dialog2.Create(IDD_DIALOG2,&m_tab); // 创建第二个标签页
m_dialog3.Create(IDD_DIALOG3,&m_tab);
m_tab.GetClientRect(&tabRect);
// 获取标签控件客户区Rect
// 调整tabRect,使其覆盖范围适合放置标签页
tabRect.left += 1;
tabRect.right -= 1;
tabRect.top -= 1;
tabRect.bottom +=20;
// 根据调整好的tabRect放置m_jzmDlg子对话框,并设置为显示
m_dialog1.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
// 根据调整好的tabRect放置m_androidDlg子对话框,并设置为隐藏
m_dialog2.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_dialog3.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
return TRUE;
// 除非将焦点设置到控件,否则返回 TRUE
响应函数如下:
void Ctest26Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
CRect tabR
// 标签控件客户区的Rect
// 获取标签控件客户区Rect,并对其调整,以适合放置标签页
m_tab.GetClientRect(&tabRect);
tabRect.left += 1;
tabRect.right -= 1;
tabRect.top -= 1;
tabRect.bottom += 20;
switch (m_tab.GetCurSel())
// 如果标签控件当前选择标签为“鸡啄米”,则显示m_jzmDlg对话框,隐藏m_androidDlg对话框
m_dialog1.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_dialog2.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_dialog3.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
// 如果标签控件当前选择标签为“Android开发网”,则隐藏m_jzmDlg对话框,显示m_androidDlg对话框
m_dialog1.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_dialog2.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_dialog3.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_dialog1.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_dialog2.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_dialog3.SetWindowPos(NULL, tabRect.left, tabRect.bottom, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
其他相似问题
相关参考资料VS2010 网站随便拖一个控件 怎么设置访问修饰符为public
[问题点数:20分]
VS2010 网站随便拖一个控件 怎么设置访问修饰符为public
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2014年5月 Web 开发大版内专家分月排行榜第二2014年4月 Web 开发大版内专家分月排行榜第二
2014年3月 Web 开发大版内专家分月排行榜第三2014年2月 Web 开发大版内专家分月排行榜第三2013年7月 .NET技术大版内专家分月排行榜第三2013年6月 .NET技术大版内专家分月排行榜第三2012年9月 .NET技术大版内专家分月排行榜第三
2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2014年12月 .NET技术大版内专家分月排行榜第三2014年10月 .NET技术大版内专家分月排行榜第三2014年9月 .NET技术大版内专家分月排行榜第三2014年1月 .NET技术大版内专家分月排行榜第三2013年12月 .NET技术大版内专家分月排行榜第三2013年10月 .NET技术大版内专家分月排行榜第三2013年5月 .NET技术大版内专家分月排行榜第三2011年9月 .NET技术大版内专家分月排行榜第三2011年2月 .NET技术大版内专家分月排行榜第三2010年2月 .NET技术大版内专家分月排行榜第三
2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2014年12月 .NET技术大版内专家分月排行榜第三2014年10月 .NET技术大版内专家分月排行榜第三2014年9月 .NET技术大版内专家分月排行榜第三2014年1月 .NET技术大版内专家分月排行榜第三2013年12月 .NET技术大版内专家分月排行榜第三2013年10月 .NET技术大版内专家分月排行榜第三2013年5月 .NET技术大版内专家分月排行榜第三2011年9月 .NET技术大版内专家分月排行榜第三2011年2月 .NET技术大版内专家分月排行榜第三2010年2月 .NET技术大版内专家分月排行榜第三
2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2014年12月 .NET技术大版内专家分月排行榜第三2014年10月 .NET技术大版内专家分月排行榜第三2014年9月 .NET技术大版内专家分月排行榜第三2014年1月 .NET技术大版内专家分月排行榜第三2013年12月 .NET技术大版内专家分月排行榜第三2013年10月 .NET技术大版内专家分月排行榜第三2013年5月 .NET技术大版内专家分月排行榜第三2011年9月 .NET技术大版内专家分月排行榜第三2011年2月 .NET技术大版内专家分月排行榜第三2010年2月 .NET技术大版内专家分月排行榜第三
2011年12月 .NET技术大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。11:55:29【 转载互联网】 作者: &&|&责编:李强
&&& &为了解决用户可能碰到关于"代码中实例化的NGUI控件怎么设置控件位置"相关的问题,突袭网经过收集整理为用户提供相关的解决办法,请注意,解决办法仅供参考,不代表本网同意其意见,如有任何问题请与本网联系。"代码中实例化的NGUI控件怎么设置控件位置"相关的详细问题如下:RT,我想知道:代码中实例化的NGUI控件怎么设置控件位置===========突袭网收集的解决方案如下===========
解决方案1:float back_y)
GameObject go = NGUIT
Transform t = go.AddChild(gameObject要实例化一个控件就必须用NGUI本身内置的方法使用.transform! public void back(float back_x;
} 然后在Start()方法调用,设置自己的参数,thisbutton),back_y.localPosition = new Vector3(back_x,0)
================可能对您有帮助================
问:请高手指教,能不能给个详细例子,急急急啊,谢谢啦答:很简单的啊 public UIL 声明,然后脚本给一个物体,直接把label拖上去,然后引用的 时候直接使用text.text = "中文"; 这是label。 至于button你想问的是按钮的事件吗? 添加脚本buttonmessage,然后把写有事件的脚本拖给target,下面...===========================================问:用的NGUI插件,发现在里面用Instantiate生成的预制件位置总是0,源码Ins...答:你这样实例化后,是在UIroot外面的,而NGUI的各部件是必须要在UIRoot里面的(子物体),于是,NGUI会自动把外面的你实例化后的物体移到UIRoot里面,这个过程会默认将位置至于原点000处。。。 正确做法是,实例化后,将实例化后的物体主动指定父...===========================================问:我用代码创建了2个控件,因为有先后的顺序,所以导致我先创建的控件在最...答:第一个控件.SendToBack(); 如果是图片 Label lbl1 = new Label(); lbl1.Text = "我看见"; this.pictureBox1.Controls.Add(lbl1);===========================================问:我用代码创建了2个控件,因为有先后的顺序,所以导致我先创建的控件在最...答:写个例字给你看看吧,如下: Button button1=new Button(); //这段代码声明了一个名为button1的按钮 Controls.Add(button2); //这样就把按钮的一个实例显示出来了===========================================问:比如,TextBox t = new TextBox();就可以得到t这个Textbox实例。 那么怎...答:TextBox t = new TextBox(); t.Text = "TextBox"; 你是这个意思吗===========================================问:比方说让图片消失,或者换一张图片, 如果是在Unity3d中操作的话,就是...答:同一个atlas里通过spriteName设置图片UISprite sprite = gameObject.GetComponent();sprite.spriteName = "XXX"; 查看原帖&&===========================================问:最好有源码答:你关联Input的label,然后得到label的text就行了,就是你的输入===========================================问:我新建一个windows窗体(Form1),会生成三个文件Form1.cs,Form1.Designer....答:楼主是想要,在.CS文件中手动实例出一个控件,但是又需要在界面上能看到,在.Designer.cs文件里又有这个? 如果这样的话,暂时未发现如何去做,因为,你在.CS里面写的控件,是需要程序运行后,才能执行的,所以你在未运行程序前,界面上是看不到...===========================================问:即然一个控件是一个类的对象,最后显示时就要实例化这样的一个对象,那...答:以对话框为例:对话框是在资源文件里定义的,其中包括了对话框中包含的各个控件的定义,比如位置,类型等信息。在创建对话框窗口的时候,系统会根据资源文件里的描述自动地把各个控件通常也就是各个子窗口给创建出来。这部分的数据结构是由系统...=========================================== 很简单的啊
public UIL
声明,然后脚本给一个物体,直接把label拖上去,然后引用的 时候直接使用text.text = "中文";
这是label。
至于button你想问的是按...===========================================首先,你这个button被包含在哪个父控件中,假定为LinearLayout,变量是mLinear其次,30dip在代码中要换成像素。结果:Button button = new Button(this);int px = (int) TypedValue.ap...=========================================== LinearLayout phone_LayoutAccount=new LinearLayout(mContext);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_...============================================ new System.Drawing.Font("宋体", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
这是生成器生成的代码,参考下。=========================================== 很多啊 text capiton 还有颜色什么的 很多属性了===========================================这首先要看控件所在的Form类有没有实例化,若已经实例化,可以通过构造传参或委托的方式完成。构造传参:将控件所在的Form类实例化对象作为参数传到你new的新Form中。===========================================写个例字给你看看吧,如下: Button button1=new Button(); //这段代码声明了一个名为button1的按钮
Controls.Add(button2); //这样就把按钮的一个实例显示出来了=========================================== Dim myform As New Form2
myform.Label1.Text = "Label"
myform.Show()这样的话可以===========================================控件在"开发工具--插入"中可以找到,其他的方法同上不知道楼主说的详细,我的表达够不够还有一种方法就是在工作表标签上右键--查看代码在代码中粘贴Private Sub Workshee...===========================================具体什么情况,你是不能插入,还是不能实例化,具体步骤你是怎么操作的,说清楚,好帮你===========================================
12345678910----> 按钮的样式VS2010-来源
按钮的样式VS2010-来源
&&&&&&&&&&&&
&&&&来源:互联网★5--2--1图标按钮图标按钮可谓是按钮控件使用图像最简单的方式,除此之外图标按钮的优点还在于显示在按钮上的图标能够使用透明色,因而不必再去为处理非矩形图像在按钮颜色发生变化时边缘颜色的处理而费心。不过也正是使用图标导致了图标按钮的天生弱点。图标太小了,仅仅才32×像素大小,在有的场合仅靠使32用这么小的图像就有些显得力不从心了。在讲图标按钮如何使用之前,先得告诉读者句柄的概念。句柄是什么?很多教科书上都这样定义:句柄是一个用于代表对象的32位整型值。不过这对于很多初学者而言,并不是太好理解。其实也可以将未赋值的句柄理解为一个指向“空白”(void*)的指针,事实上也如此,Winnt.h中,在句柄就是如此被声明的:typedefvoid*HANDLE;当句柄被赋值之后,它就成为指向某个特定位置的指针,即代表了某个特定的对象。之所以在现在提及句柄,是因为句柄是Windows编程中的一个关键性概念。尽管在前面除第三章外的内容中很少涉及它,不过在下面的学习中我们将会很频繁的使用到句柄。&&&&&&&& 技术概要:使用图标按钮很简单,大的步骤仅仅就三步:①.从外部导入一个图标或自己创建一个图标作为资源。②.从资源中载入所要使用的图标。③.在要使用图标的按钮上设置图标。具体实现:■第一步导入图标没有什么特别之处,同前面2.2节中使用静态图像控件导入位图是非常类似的。无非就是使用Insert菜单上的Resource命令,导入或创建一个图标即可。■第二步载入图标就涉及到一些细节问题了。使用函数LoadIcon()载入图标。因为LoadIcon()是类CWinApp的成员函数,同时函数LoadIcon()返回所载入图标的句柄。所以我们采用以下方法来调用函数LoadIcon():h_Icon=AfxGetApp()-LoadIcon(IDI_Icon);当然,在该语句之前还必须要有对图标句柄h_Icon的定义:HICONh_Icon;■第三步为按钮设置图标了,这通过调用函数SetIcon()来实现。同时不要忘记,还须在使用图标的按钮的&&&&&&&& Properties设置中设置Icon属性,指明该按钮是一个图标按钮。因为函数SetIcon()为类CButton的成员函数,可以通过两种方法来调用该函数。一是通过CButton类对象来调用SetIcon(),如下面代码:m_BtonIcon.SetIcon(h_Icon);//m_BtonIcon为一个CButton类对象。二是先由函数GetDlgItem()获得一个指向CWnd对象的指针,再通过强制类型转换将该指针转换为一个指向CButton类对象的指针。进而通过该指针来调用函数SetIcon()。具体实现代码如下:CWnd*pWnd=GetDlgItem(IDC_RADIO2);CButton*pBton=(CButton*)pWpBton-SetIcon(h_Icon2);既然有第一种较为简便的方法为按钮设置图标,为何还要提及第二种方法呢?因为并不是在任何情况下都会有CButton类对象的,例如对于一组单选按钮。只能为它们定义一个CButton类对象,如果使用该对象来调用函数SetIcon(),则只能在设置了Group属性的那个单选按钮上设置图标。所以要达到在一组单选按钮中分别设置不同图标的目的,就只有使用第二种方法。&&&&&&&& 尽管在现在的Windows编程中,资源句柄数多得相对于我们而言几乎是无限的,但最好在使用完资源句柄后及时的把它们删除掉。上面所讲述的方法不仅适用于PushButton,而且同样适用于RadioButton、CheckBox和GroupBox。★5--2--2位图按钮图标按钮虽有着种种优点,但它能显示的图像实在是太小了。在有的场合显然就不适用了。位图按钮可以在按钮表面显示一幅位图而不再是一个小小的图标。但是因为在位图中不能使用透明色,因而当显示的位图不为矩形时,就得为位图中非矩形部分的背景色动一番脑筋了。因为存在着用户改变按钮表面颜色,也就是位图背景色的可能性。可以用透明位图的技术来解决这一难题,这将在后面5.7实现具有透明性的位图中讲述。技术概要:位图按钮的使用的大致步骤同图标按钮基本相似,也是以下三个步骤:①从外部导入一个位图或自己创建一个位图作为资源。&&&&&&&& ②从资源中载入所要使用的位图。③在要使用位图的按钮上设置位图。具体实现:■第一步从外部导入一个位图作为资源同使用图标按钮时是完全一致的,在此就不详细讲述了。■第二步中,利用函数LoadBitmap()从资源中载入位图。函数LoadBitmap()为一个API函数,定义如下:HBITMAPLoadBitmap(HINSTANCEhInstance,//handleofapplicationinstanceLPCTSTRlpBitmapName//addressofbitmapresourcename);所以,为达到载入位图的目的,不仅要定义一个位图句柄hBitmap:HBITMAPhB而且还要定义一个应用程序实例句柄hI:HINSTANCEhI并调用函数AfxGetInstanceHandle()以获得当前的应用程序实例句柄,代码如下:hInstance=::AfxGetInstanceHandle();&&&&&&&& 只有在声明并获得了当前的应用程序句柄后,才能使用以下语句载入位图:hBitmap=::LoadBitmap(hInstance,BMP1);注意,在函数LoadBitmap()中的第二个参数为资源名,而非资源ID。因为资源名是一个字符串,而资源ID则是一个整型量。所以在创建或导入位图后,为该位图资源命名时要加上双引号以表示这是一个资源名。如右图5-2:■在第三步中,为要使用位图的按钮设置位图,方法与图标按钮完全相同。首先是要在使用位图的按钮的Properties设置中设置Bitmap属性,指明该按钮是一个位图按钮。然后再调用CButton类函数SetBitmap()为按钮设置位图。代码如下://m_BtonBmp为一个CButton类对象。m_BtonBmp.SetBitmap(hBitmap);或pWnd=GetDlgItem(IDC_Check);pBton=(CButton*)pWpBton-SetBitmap(hBitmap);同图标按钮一样,使用位图不局限于PushButton,而且同样适用于RadioButton、CheckBox和Group&&&&&&&& Box。同时,最好在使用完位图句柄后及时的将它删除掉。★5--2--3CBitmapButton类位图按钮前面所讲述的图标及位图按钮最大的不足在于,无论当按钮控件处于何种状态,按钮上所显示的图案总是一成不变的,相比之下那些随着操作而实时改变图案的按钮就具有更加生动的效果。MFC库为我们捉供了一个这样的类CBitmapButton。利用这个类,我们可以为一个按钮设计四幅不同位图、分别用于正常状态、按下状态、获得输入焦点和无效时。这样,随着按钮状态的改变,位图也随之切换,这样就使按钮呈现出很强的动感效果。令人高兴的是,类CBitmapButton将很多操作的细节都封装了起来,因而我们能够很方便的达到上述目的。由于以上原因,CBitmapButton类位图按钮有着比图标按钮和位图按钮更为广阔的使用范围。在一般情况下,都将CBitmapButton类位图按钮称作是位图按钮,而将真正的位图按钮给忽略了。CBitmapButton类位图按钮的缺点同位图按钮是一致的,都是在对透明色的处理上。还有一个比较严重的问题是CBitmapButton类位图按钮是将位图按原始&&&&&&&& 大小绘制在按钮上,而不是随按钮大小而缩放位图。这在平时不会导致任何问题,但若是在Windows中更改了显示字体的大小,则对话框及上面的按钮控件大小也随之改变,但位图按钮上的位图却保持原有大小不变,这样就会在外观上造成严重的问题。尽管有以上问题的存在,CBitmapButton类位图按钮还是具有很大的实用价值,因为付出很少的代码就可以得到生动形象的图形效果。、下面就讲述CBitmapButton类位图按钮的使用方法(以下均简称为位图按钮)。绝大数情况下,使用位图按钮只需四个步骤:●第一步:在要使用位图的按钮的Properties设置中设置OwnerDraw属性●第二步:创建或从外部导入至少一幅至多四幅位图。位图按钮所使用的位图颜色最多可达256色,但对于256色的位图不能通过剪贴的的方式来创建。而必须使用导入的方式来创建。若该按钮控件的Caption(标题)BmpBton,为则将这四幅位图的ID分别设定为“BMPBTONU”、“BMPBTOND”、“BMPBTONF”、“BMPBTONX”分别对应于按钮的正常状态、按下状态、获得输入焦点状态和无效状态。注意,只有在正常状态显示的位图是必须的,其它状态的位图都是可选的;还有就是代表位图的ID都必&&&&&&&& 须加上双引号并且大写(如下图5-3)。实际上,加上双引号就表示该资源是以字符串常量来标识。●第三步:在使用位图按钮的类的类定义文件中声明CBitmapButton类对象:CBitmapButtonm_BtonS●第四步:在对话框的OnInitDialog()函数中通过CBitmapButton类对象调用函数AutoLoad()自动加载位图:m_BtonSet.AutoLoad(IDC_BtonSet,this);经过以上四个步骤,一个位图按钮就创建好了。在运行中,CBitmapButton类会自动根据按钮的状态显示对应的位图。利用位图按钮技术,再加上一点鼠标感应技术,就很容易做出像网页按钮那样的在鼠标经过时加亮的动态效果。也能轻易的实现像Word中那样的平面按钮。这些将在后面的章节中讲述。需要说明的是,CBitmapButton类位图按钮仅限于在PushButton使用。在默写情况下,我们可能需要动态创建位图按钮,在动态创建位图按钮时,不能使用函数AutoLoad()加载位图,而要使用函数LoadBitmaps()来加载位图。动态创建位图按钮主要有以下几个步骤:●第一步:为要创建的控件分配一个ID值。●第二步:定义一个CBitmapButton类对象。&&&&&&&& ●第三步:由该对象调用函数Create()创建位图按钮,并调用函数LoadBitmap()加载位图。在调用函数SizeToContent()调整按钮控件的大小以适应位图。●第四步:加入对新创建按钮的消息处理。第三步实现代码如下:m_BmpBtonExit.Create(EXIT,BS_PUSHBUTTON|WS_VISIBLE|BS_OWNERDRAW,rcBtonExit,this,IDOK);m_BmpBtonExit.LoadBitmaps(EXITU,EXITD);★5--2--4按钮的自绘制前面讲述的三种在按钮上显示图像的方法或多或少的存在着不足之处,图标按钮太小,位图按钮无法设置透明色,CBitmapButton类位图按钮位图大小不能随按钮控件变化。使用按钮的自绘制技术是解决以上问题的最佳途径。当然,按钮的自绘制技术的作用不仅仅局限于按钮表面显示图像,利用它可以充分发挥自己的创造力从而创建出各式各样的按钮控件。例如动画按钮等。如果说利用按钮自绘制技术在按钮上显示图像唯一有一点不足的话,那就是实现略为复杂了一些。但利用按钮自绘制技术,在配合以DIB文件&&&&&&&& 读取技术,就完全能够实现象Winamp中那样的Skin技术。概念解释:先解释一下什么叫做按钮的自绘制,准确的说应该是控件的自绘制技术。Windows能够向控件的父窗口发送消息以让父窗口定制控件的外观和行为。MFC则更近了一步,它能够译解自绘制参数并将消息发回控件本身。因为绘制控件的代码实在控件类中实现,而不是在拥有控件的窗口中,因而称为“自绘制”。除按钮控件可以自绘制外,列表框、组合框以及菜单都支持自绘制。在基于对话框的应用程序框架的基础上创建一个自绘制的按钮,主要有以下步骤:■第一步:在对话框上放置一个按钮,并在其Properties中设置OwnerDraw属性。■第二步:用ClassWizard从CButton类中派生出一个新类。进入ClassWizard,点击MessageMaps标签下的New按钮,在弹出的菜单中选择New命令进入NewClass对话框。在NewClass对话框中填入新创建类&&&&nbs
p;&&&& 的名称CownerDrawBton,以及选择所创建类的父类为CButton(如下图5-4):■第三步:为新创建的COwnerDrawBton类增加一个成员函数DrawItem()。WorkSpace窗口中的ClassView标在签下,右键单击类COwnerDrawBton,在随后的菜单中选择AddVirtualFuntion…命令(如左下图5-5)进入NewVirtualOverrideforclassCOwnerDrawBton对话框(如右下图5-6),在该对话框的NewVirtualFunction栏中选择函数DrawItem,再点击AddandEdit按钮就超越了函数DrawItem,并进入其内部处于待编辑状态。概念解释:函数DrawItem():该函数在当自绘制按钮的外观需要重绘时调用。其定义如下:virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);参数lpDrawItemStruct为指向结构DRAWITEMSTRUCT的一个长指针。结构DRAWITEMSTRUCT定义如下:&&&&&&&& typedefstructtagDRAWITEMSTRUCT{UINTCtlTUINTCtlID;UINTitemID;UINTitemAUINTitemSHWNDhwndIHDChDC;RECTrcIDWORDitemD}DRAWITEMSTRUCT;该结构中部分成员变量作用如下:CtlType:表示控件类型,当为常量ODT_BUTTON表示为自绘制按钮。CtlID:表示控件的ID。ItemAction:绘制动作。ItemState:在当前绘制动作完成后,确定控件所处状态。HwndItem:控件窗口的句柄。HDC:设备环境句柄。RcItem:确定自绘制控件大小的矩形。&&&&&&&& 通过DRAWITEMSTRUCT结构中的各成员变量,就可以为控件的自绘制提供必要的条件。■第四步:利用ClassWizard中定义一个COwnerDrawBton类对象m_BtonOD(如下图5-7):注意在VC++中,必须采用这种方式来定义对象m_BtonOD,如果是在类定义文件中手工定义该对象的话,则不会执行超越的虚函数DrawItem()。同样,如果是不定义该对象的话,则不会执行函数DrawItem()。■第五步:向函数DrawItem()中加入以下代码:voidCOwnerDrawBton::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){//TODO:AddyourcodetodrawthespecifieditemCDC*pDC;CRectrcBCDCdcM&&&&&&&&BITMAPs_BCBitmapm_B&&&&&&&& CBitmap*pOldB&&&&&&&&pDC=CDC::FromHandle(lpDrawItemStruct-hDC);//将设备环境句柄转换为指向设备环境的指针rcBton=lpDrawItemStruct-rcI//获取按钮控件大小m_Bitmap.LoadBitmap(IDB_Bmp);//载入位图dcMem.CreateCompatibleDC(pDC);//创建于内存设备环境相兼容的设备环境pOldBitmap=dcMem.SelectObject(m_Bitmap);//将位图对象选入到内存设备环境中m_Bitmap.GetBitmap(s_Bmp);//获取位图信息&&&&&&&&pDC-StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(),dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);&&&&&&&& //将位图从内存设备环境拷贝到显示设备环境dcMem.SelectObject(pOldBitmap);//删除刚才选入到内存设备环境的位图对象}在上面的代码只是为了说明如何进行按钮控件的自绘制,它距实用要求还有一段距离。因为在对话框上每个自绘制的按钮控件都会调用DrawItem()函数。所以在DrawItem()函数内部,还必须根据结构DRAWITEMSTRUCT的成员变量CtlID来区分不同的按钮控件,进而再采取不同的操作。同时还需根据按钮控件的不同状态,进行不同的操作。在上一节中讲述的CBitmapButton类实际上也是通过对按钮控件进行自绘制而实现的。但是在向按钮上绘制图像时它是采用函数BitBlt(),而不是使用函数StretchBlt(),因而造成CBitmapButton类位图按钮上的位图大小不会随控件大小改变而改变。根据这一原理,我们自己创建一个与CBitmapButton作用和使用方法相似类CBmpBton,它也可以使用四幅不同的位图来表示按钮不同的状态,位图的命名原则同CBitmapButton完全一致。不同的是,它无需使用诸如AutoLoad()一类的函数来加载位图。的其他部分&&&&&&&& 同上面的COwnerDrawBton完全一致,只不过是函数DrawItem()的实现不同,下面就是类CBmpBton的DrawItem()函数的实现代码:voidCBmpBton::DrawItem(LPDRAWITEMSTRUCTlpDIS){CRectrcBCDC*pDC;&&&&&&&&UINTUINTCtrID;CStringstrCCBitmapm_BCBitmap*pOldBCDCdcMBITMAPs_B&&&&&&&&rcBton.CopyRect(lpDIS-rcItem);pDC=CDC::FromHandle(lpDIS-hDC);state=lpDIS-itemSaction=lpDIS-itemACtrID=lpDIS-CtlID;&&&&&&&& GetWindowText(strCaption);//GetDlgItemText(CtrID,strCaption);dcMem.CreateCompatibleDC(pDC);&&&&&&&&if(state==16){if(m_Bitmap.LoadBitmap(strCaption+_T(F))){pOldBitmap=dcMem.SelectObject(m_Bitmap);m_Bitmap.GetBitmap(s_Bmp);pDC-StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(),dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);}else{if(m_Bitmap.LoadBitmap(strCaption+_T(U))){pOldBitmap=dcMem.SelectObject(m_Bitmap);m_Bitmap.GetBitmap(s_Bmp);&&&&&&&& pDC-StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(),dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);}else{TRACE(必须载入一副位图);}}}elseif(state==4){if(m_Bitmap.LoadBitmap(strCaption+_T(X))){pOldBitmap=dcMem.SelectObject(m_Bitmap);m_Bitmap.GetBitmap(s_Bmp);pDC-StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(),dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);&&&&&&&& }}elseif(stateODS_SELECTED){if(m_Bitmap.LoadBitmap(strCaption+_T(D))){pOldBitmap=dcMem.SelectObject(m_Bitmap);m_Bitmap.GetBitmap(s_Bmp);pDC-StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(),dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);}}else{if(m_Bitmap.LoadBitmap(strCaption+_T(U))){pOldBitmap=dcMem.SelectObject(m_Bitmap);m_Bitmap.GetBitmap(s_Bmp);pDC-&&&&&&&& StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(),dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);}else{TRACE(必须载入一副位图U);}}&&&&&&&&dcMem.SelectObject(pOldBitmap);}★5--4--1在对话框上使用图像本节的知识,在前面的内容中其实已基本涉及到了,现就总结归纳一下。在对话框上使用图像,可采用以下几种方法:①使用静态图像控件。采用这种方式时,既可以在对话框上显示小幅图像作为装饰,又可在必要时显示整幅图像作为对话框的背景。但在设计对话框时要首先象对话框上加入静态图像控件,否则其它控件就会被所显示的图形遮挡。这是在对话框上使用图像最简单&&&&&&&& 的方法。②使用CBitmapButton类位图按钮在对话框上显示图像。一般很少采用这种方式来显示图案。但在某些特殊情况下时,例如要求对鼠标指针的移动具有感应功能时,这是最简单易行的方法。示例可见PCBitmapButton类位图按钮。③重载对话框的OnPaint()函数。在OnPaint()函数中进行所需的绘图操作。这通常是在对话框上显示作为背景的位图的最好方式,不会出现背景图案将对话框上的其它控件遮挡住的情况。同使用CBitmapButton类位图按钮一样,利用这种方法能够实现像“金山词霸”那样有限的Skin效果。示例可见P从资源中读取位图。④使用MicrosoftForms2.0ImageActiveX控件。这是在对话框上显示真彩色图像最简单的方式。但也不要认为这种方法尽善尽美,使用该方法有可能在这台机器上显示的图像精美绝伦,而在那台机器上就一塌糊涂。在上述的方法中,只有最后两种具有显示真彩色图像的能力,使用方法④并不是太可靠;使用方法③因为涉及到DIB文件的读取又显得略为复杂。实际上,并不是只有采用真彩色图像才能取得华丽的界面效&&&&&&&& 果,而且大量的采用真彩色图像会导致程序过于庞大。一种很好解决方法是使用经过色彩抖动的256色图像来代替真彩色图像。作为对读者的一个建议,抓图工具HyperSnap-DX其实是进行色彩抖动及图像缩放的一个极好工具&&&&&&&& 分享给好友::
All Rights Reserved 图宝贝
本站声明:本站所转载之内容,无任何商业意图,如本网站转载稿件涉及版权、著作权等问题,请您来函与本站管理员取得联系,友情链接请加QQ,要求PR 或者 BR >=2(联系方式:QQ )

我要回帖

更多关于 vs2010控件大全 的文章

 

随机推荐