Author : Jeff 2005-11-30
关键字: 编程 技巧
环境:Window XP Professional + SP2, VC6.0
一直以来,狐狸都是狡猾的化身。在儿时,教科书和各色童话书就明白地告诉我们:狡猾的狐狸。它曾经从乌鸦的嘴里骗过肉,在冬天骗过猎户,偷吃光了猎户家的肉。我们也一直这样认为着。直到我们明事理,才明白:狐狸是狡猾,但是不可否认,它也很有智慧。它的办法是很卑劣,但是有效。为什么不像狐狸一样,耍耍小手段,去获得有效的途径呢? *_*
下面的都是个人在编程中碰到的一些问题。说难吧,不难,但是烦。没办法,懒人总有懒法子。
1) 在MFC界面编码中,经常需要隐藏某一区域内的所有控件,当某一条件满足时,再显示这一区域内的所有控件。一般地,5,6个还好说, 轮着设置呗。
void CConfigureDlg::SetGroupVisible(bool bVisible)
{
CStatic *pStatic = NULL;
CEdit *pEdit = NULL;
// group visible
if (bVisible) {
pStatic = (CStatic *)GetDlgItem(IDC_TEXT_NAME);
pStatic->ShowWindow(SW_SHOW);
pStatic = (CStatic *)GetDlgItem(IDC_TEXT_AGE);
pStatic->ShowWindow(SW_SHOW);
pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NAME);
pEdit->ShowWindow(SW_SHOW);
pEdit = (CEdit *)GetDlgItem(IDC_EDIT_AGE);
pEdit->ShowWindow(SW_SHOW);
}
else {
pStatic = (CStatic *)GetDlgItem(IDC_TEXT_NAME);
pStatic->ShowWindow(SW_HIDE);
pStatic = (CStatic *)GetDlgItem(IDC_TEXT_AGE);
pStatic->ShowWindow(SW_HIDE);
pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NAME);
pEdit->ShowWindow(SW_HIDE);
pEdit = (CEdit *)GetDlgItem(IDC_EDIT_AGE);
pEdit->ShowWindow(SW_HIDE);
}
}
但是要是有20,30就麻烦了,特别是还有大部分的Static文本框,总不能为了这点小事,定义很多你基本上不会用到的变量吧。考虑到只需要取用ID号,在这个上面动动手脚。
在资源视图中,修改那些Static文本框的ID为IDC_STATIC_01_1.(前一个数字区分Group,后一个代表Group内第几个)。其它想隐藏或显示的控件也可以这样来命名。
编辑Resource.h文件,一个Group的按顺序排在一起,编上连续的号(领头的最好是10的倍数,便于日后的扩展)。Group之间也按序排在一起。
考虑到上面代码的重复,改进之。如下:
void CConfigureDlg::SetGroupVisible(bool bVisible)
{
int show[] = { SW_HIDE, SW_SHOW };
int indexID = 0;
CStatic *pStatic = NULL;
// group visible
for (indexID = IDC_STATIC01_1; indexID <= IDC_STATIC01_2; indexID++) {
pStatic = (CStatic *)GetDlgItem(indexID);
pStatic->ShowWindow(show[bVisible]);
}
for (indexID = IDC_STATIC02_1; indexID <= IDC_STATIC02_5; indexID++) {
pStatic = (CStatic *)GetDlgItem(indexID);
pStatic->ShowWindow(show[!bVisible]);
}
}
2) 下面这个是以前自己刚用VC做东西,不熟悉很多函数,用的“傻傻”的办法。虽然现在不用了,不过到现在还是蛮佩服自己当时的思维。有点“搞笑”的意味,写下做个怀念。
字符串 - - - > int(十进制) atoi()
字符串 - - - >float atof()
字符串 - - - >long atol()
字符串 - - - >int(十六进制) strtoul()
当时不知道这些,又不想自己转换。想了个办法,拖了几个Edit控件,设为不可见,并且整个一小不点,放在一个Static控件的后面,界面上一点影响都没有。然后,关联变量(类型设好)。
使用的时候,先调用SetDlgItemText(), 然后就再调UpdateData(). 自己转换好了~~~hehe.(无赖之举啊) *_*