在Frame中如何操作Panel上的控件? Topic is solved

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
shiweifu
Earned a small fee
Earned a small fee
Posts: 10
Joined: Mon Sep 29, 2008 10:33 am
Location: Chinese
Contact:

在Frame中如何操作Panel上的控件?

Post by shiweifu »

Code: Select all

void MainFrame::On_MenuItem_Open( wxCommandEvent& event )
{
		wxGrid* grid = NULL;
		grid = (wxGrid*)(this->FindWindowByName(wxT("MainPanel")))->FindWindowByName(wxT("m_grid"));
		grid->Enable(true);
}
wxMenu在wxFrame中,所要操作的wxGrid在wxPanel上
他俩在两个类里,我不知道怎么操作了
该如何通过wxFrame访问wxGrid?

另,寻一wxWidgets QQ群
kingkamg
I live to help wx-kind
I live to help wx-kind
Posts: 187
Joined: Tue Apr 08, 2008 1:45 pm

Post by kingkamg »

知道啥叫全局变量不?知道啥叫指针不?或许我不理解你的问题,单我只能说你的这个问题真的很白,如果你写过MFC或者任何一个界面软件,这就不是什么问题。实在不想回这样的帖子,实在看不下去了 :evil:

方法太多
第一种:搞个wxGrid的全局指针,你想哪里访问就哪里访问
第二种:wxFrame的类里面保留一个wxPanel的指针,让wxGrid的指针为public型
第三种,wxFrame里面你直接给wxGrid控件发消息




总之只要你能找到这个控件指针,方法多的是,这已经不是wxWidgets的范畴了,属于基本的c++语法范畴和代码组织结构的范畴
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

kingkamg兄,消消气嘛~每个人第一次遇到这种问题都会迷惑的~

恕我直言,你的方法也有待商榷,不够OO。

邪恶的全局变量在这个场合是不需要的。将wxGrid的指针公有化,更是不必要。

第三种方法,shiweifu还没获得wxGrid的指针呢,怎么发?

shiweifu,我看到你在我博客上的留言了,也看到了你的帖子:
http://forums.wxwidgets.org/viewtopic.php?p=96733#96733

你说

我试着去找wxFrame类似GetPanel的函数。。可惜没找到

你是不可能在wxFrame里找到类似GetPanel的函数的。你需要明白,wxFrame是用作一般用途,不是专门为有Panel的Frame设计的,因此如果加上一个GetPanel这样的函数,是不对的,所以没有。wxFrame只会知道,它hold着一个个指向wxWindow的指针,而不会知道那些wxWindow其实是wxPanel还是wxButton。

你试图用FindWindowByName把指向wxWindow的指针找到,再转回下去到wxPanel,这个方法是可行的,但并不是推荐的做法。尽可能不要使用类型转换。另外,正如Auria指出的,那个Name并不是你指针的变量名,而是你在创建wxGrid或wxPanel时给它的名字——构造函数里的。请仔细阅读文档。

这个问题有两种解决方法:

一种情况适用于,当初在把wxGrid加入wxPanel的时候,你是在wxFrame的构造函数里直接编码的(而不是建了一个wxPanel的子类,在子类的构造函数里做)。

这种情况下,因为你终究都是要new一个wxGrid并让一个变量指向他的,你就把这个变量作为wxFrame的成员变量,这样你就可以在wxFrame类的其他方法中调用它了。

其实第一种情况也是不够OO的。因为应该把你的Panel封装成一个类。

从你的m_grid可以看出,你是把你的Panel封装成了一个类,你继承自wxPanel。

这个时候,你应当给你的子类增加一个方法,将你的m_grid暴露为public的GetGrid(),里面直接return m_grid。

这样,你就可以在wxFrame里呼唤它了。

建议多看Effective C++这样的书,能够在很大程度上使你面对这些问题不会有疑问。

-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
kingkamg
I live to help wx-kind
I live to help wx-kind
Posts: 187
Joined: Tue Apr 08, 2008 1:45 pm

Post by kingkamg »

:lol: 版主就是不一样,我也是被这样的问题气晕了了,CSDN就是因为老充斥这样的简单问题,所以都很少去了,实在不想论坛也出现这样的事情。。。。 :D
不过有些时候老通过get或者set方法也很烦哦,我前面就因为变量太多,实在懒了就全public了,嘿嘿,最后干脆直接用了一个struct把所有变量都包装起来,有些时候不一定非要OO的
shiweifu
Earned a small fee
Earned a small fee
Posts: 10
Joined: Mon Sep 29, 2008 10:33 am
Location: Chinese
Contact:

Post by shiweifu »

感谢版主的热情回答与kingkamg的批评

我一直都以为wxFrame会提供类似的方法。。

没想去“自力更生”,呵呵~

最后解决的方法:
在wxFrame中增加一个wxGrid型的全局变量
把Panel中的wxGrid弄成全局
在构造函数中把grid指向Panel中的m_grid
接着再操作

就是版主说的办法
(把过程说出来,希望能帮到以后来的小白。。)
:D
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

shiweifu wrote:在wxFrame中增加一个wxGrid型的全局变量
把Panel中的wxGrid弄成全局
小小纠正一下说法,这些都不叫做全局变量,叫做wxFrame对象的成员变量。在构造函数中那个临时的指针,叫做 局部变量。

因此,其实就是将一个会在成员函数执行完之后生命期就结束的变量救出来,成为和对象生命一样长的变量。这不是全局变量哦~

再往外救,就会救成类的静态成员变量,或者救成某个namespace里的变量。

再往外救,才会变成全局变量。
kingkamg wrote:不过有些时候老通过get或者set方法也很烦哦,我前面就因为变量太多,实在懒了就全public了,嘿嘿,最后干脆直接用了一个struct把所有变量都包装起来,有些时候不一定非要OO的
个人观点:

get和set的价值在于部分开放权限,比如有时只能允许get,有时只能允许set(比如password)。也在于拦截处理,有时被get了需要记录,被set了需要做一些相应的处理和更新。

这就像为什么应该在getGrid()加上const的限制符的。国内很多人都懒得加,但在国外写程序的话,是必须的。质量的差距就来自于细节。

一时勤快,省却以后无数debug、重构之苦。

另外,纯数据型的结构不应该用class而应该用struct,直接把所有的成员变量作为接口的一部分开放出去给别人用。这属于data cluster。但panel不是,m_grid属于其实现细节,不应暴露出来。

Effective C++、大规模C++程序开发、设计模式、重构,这些书都对这些问题有所阐述。

不过我认同,不能过度OO或者过度设计。

-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
Loaden
I live to help wx-kind
I live to help wx-kind
Posts: 177
Joined: Tue Feb 19, 2008 10:21 am
Location: China

Post by Loaden »

搬个凳子坐好,进来学习来了!
Life is not fair, get used to it.
Post Reply