设为首页 加入收藏

TOP

一个月学会VC++2010 3.我们动手吧!(二)
2014-11-23 21:25:00 】 浏览:1399
Tags:一个月 学会 2010 我们 动手
wWindow(SW_SHOW); //显示窗体

CurrentDialog->CenterWindow(this);//将对话框在视图中居中,注意屏幕大小改变后,就不再居中,需要在OnSize事件中处理

CurrentDialog->SetBackgroundColor(RGB(255,255,255));//将背景色改为白色,马虎应付一下

}

9、然后看看消息循环中的代码:

BEGIN_MESSAGE_MAP(CSouGuView, CView)

ON_WM_CONTEXTMENU()

ON_WM_RBUTTONUP()

ON_COMMAND(ID_BUTTON_HOME, &CSouGuView::OnButtonHome)

ON_WM_SIZE()

ON_UPDATE_COMMAND_UI(ID_BUTTON_HOME, &CSouGuView::OnUpdateButtonHome) //注意这句,如果对应的对话框已经打开,则按钮不可用

ON_COMMAND(ID_BUTTON_QUOTE, &CSouGuView::OnButtonQuote) //注意这一句:如果用户点击这个按钮,执行OnButtonQuote方法。

ON_UPDATE_COMMAND_UI(ID_BUTTON_QUOTE, &CSouGuView::OnUpdateButtonQuote)

ON_COMMAND(ID_BUTTON_CHART, &CSouGuView::OnButtonChart)

ON_UPDATE_COMMAND_UI(ID_BUTTON_CHART, &CSouGuView::OnUpdateButtonChart)

END_MESSAGE_MAP()

10、当然,如果你打开了这个对话框,可以让这个按钮失效:

void CSouGuView::OnUpdateButtonHome(CCmdUI *pCmdUI)

{

if (CurrentDialog)

{

pCmdUI->Enable(CurrentDialog->GetRuntimeClass()!=RUNTIME_CLASS(CHomeDialog));

}

}

很显然,消息映射中ON_UPDATE_COMMAND_UI(ID_BUTTON_HOME, &CSouGuView::OnUpdateButtonHome),是对应这个的。

大致的意思:如果当前有对话框打开,那么:如果是CHomeDialog类的实例,这个按钮就不可用。已经打开了这个对话框,你还打开它干嘛?

11、另一个对话框也是一样,算起来我们创建了四个消息处理函数。代码就复制一下,运行,能够看到来回切换的效果就行。

12、存在的问题:

首先,VC的对话框的布局问题,很原始。原始的意思,就是你需要自己处理。当你改变主窗体大小、或者在不同分辨率的机器上,对话框的所有控件总显示在视图的左上角,界面是很丑陋的。这是以后的问题,我最后的解决方案是:多数情况下窗体比较小,保持居中显示就行了;少数情况下,比如显示K线图的时候,需要自动适应主窗体的大小,使用一套叫做EasySize的宏解决问题。

其次,这里虽然实现了对话框居中显示,但由于OnSize事件中没有处理,窗体大小改变的时候,对话框的位置将不再居中,这个此后再处理。

总结一下遇到的问题:

1、首先是所谓指针的概念:

其实这真是幼儿园级别的问题,往下看,五分钟差不多能够弄清了:我们假设内存有1000个字节(不用说2G了,只说1k吧,好描述),从0开始给每个字节编号,最后一个是999。这个编号就是指针,很显然,指针实际上是整数,表示内存的编号,也就是内存地址。我们常见的,32位操作系统的电脑,不能利用4G内存的事情,大家可以算算,32位也就是4个字节的整数,最大值是什么。

比如我们定义一个int 指针,怎么做?

int *p;

意思是我们现在有了一个int指针变量p

然后p=0,什么意思?指向内存0的位置。

你如果没有为指针分配空间,那么对指针的操作就是一种令人崩溃的游戏。

虽然指到了那个地方,但那里并没有你分配的一个整型的4个字节的空间,而很可能是另一个变量的位置。

所以第二步我们可以为其分配空间:

p=new int;

或者p=new int();

这个时候,你设置断点看看,p的值已经变化了。怎么回事呢?系统将从空闲的内存中画出四个字节给你,并将这小片内存的地址:也就是第一个字节的编号传给p。系统同时会给这部分内存做上标记,继续分配空间的时候,不要再拿出来献宝,

好吧,第三步:这片内存里的值是不可知的,为其赋值。

*p=10;

嗯,第四步,我想将p的值传给一个局部变量int x;

容易:x=*p;看看,x现在也是10了。

注意x是局部变量,不是指针,那么背后发生了什么事情呢?p所指向的四个字节的内容,拷贝到x所占用的四个自己的内容,如此而已。

那么第五步,我们反过来,令x=100,想让p接管x所占用的四个字节,怎么办?

p=&x;

这就行了,&表示x的地址,再看看p,他的值显然发生变化了,指向另一片位置了么。

不过马上你面临第6步:

原来p的那四个字节呢?没主了,谁都遗忘了,它还在那里,不再能够使用。内存泄漏?一个函数可能短暂时间执行几千次,这样不断失去控制、不断丢失的内存就可能膨胀起来,最终的结果大家很容易想象。内存泄漏是很多大侠不断用来表达自己功力深厚的东西,其实不复杂是不是?

第7步,怎么避免呢?

容易,请在改变p之前,先delete p;先不说执行析构方法之类,我们简单的理解:将p指向的内存空间还给系统,那么,虽然p指向其他地方的话,这块地方也能继续分配给其他变量。

第8步,那么int类型的局部变量,是不是也要delete呢?不需要,堆的概念、栈的概念也不用多讲,一个函数结束的时候,所有局部变量都会自动的析构,不用我们操心。只有用手工方式分配内存的,比如new出来的,需要我们处理。我最初闹过这个笑话,自己在函数里创建一个对象,退出前自作聪明的运行其析构函数,程序运行时崩溃,因为析构方法执行了两次,第二次执行的时候那个对象已经不存在了。嗯,这种错误犯过两次,弄半天才找到原因,相当于在同一条沟沟里跌倒两次,所以我对自己的智商也委实不太自信。

第九步:int毕竟是简单的,你创建一个类的实例,用指针指向它,一切行为没什么不同,两个区别:1、你创建的对象可能需要更多的空间;2、p->访问对象的成员,对象x则用“.”这种符号。

需要一个月才弄清指针的概念吗?不需要,没有更多的知识了,指针的指针是什么?嗯,指向指针变量本身的指针而已;Void *是什么:指向一块不知类型的内存空间罢了。p++什么意思?指针越过其类型所占的字节,这

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇把一个vc编写的exe文件的界面外观.. 下一篇一个月学会VC++2010 2.看起来风险..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目