-
如何将控件禁用
2008-08-08 20:14:37
1.CEdit 类,像文本编辑框,让该文本框初始化后(有个值),那个值不能被修改...把编辑框属性设置为只读...
CEdit* pEdt1 = (CEdit*) GetDlgItem(IDC_EDIT_DATE);
pEdt1->SetReadOnly();2.Combo Box.组合列表框,默认为droplist,并且有默认值,不想让别人能选,所以只读方式不行..
CEdit* pEdt11 = (CEdit*) GetDlgItem(IDC_COMBO_PORT);
pEdt11->EnableWindow(FALSE);3.Button,为PUSH BUTTON,禁用
定义一个该控件的变量,然后..m_printer.EnableWindow(FALSE);(前变为变量名)..
4.Menu
CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->EnableMenuItem(0,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); -
MFC的几个小知识
2008-08-07 19:40:07
1.
GetDlgItem(IDC_EDIT1)->EnableWindow(false);
1)GetDlgItem(IDC_EDIT1)得到IDC_EDIT1控件指针。
2)EnableWindow(false) 不可用。
2.
RadioButton的属性要选上group,否则不会在CLASSWINZARD自动生成Control ID,才加添加变量.
-
MFC对话框
2008-08-06 20:32:26
今天的工作是新建用户,用弹出对话框来获得新用户的信息...
1.菜单弹出的新建用户对话框和菜单所在的对话框,要把新建的用户信息在之前的对话框中显示出来.因为显示是由对话框中的CListBox控件的AddString方法来完成的(单一的增加),所以在新建用户的对话框中必须要获取指向菜单对话框的指针来完成显示..而这个要通过句柄来完成....要想在一个类中调用一个对话框,就要获得该对话框的句柄,
HWND hWnd;
hWnd=::FindWindow(NULL,_T("User"));
//lpszClassName:窗口类名,lpszWindowName:窗口标题。两个要一个就可以了,当然两个更准确
if (hWnd==false)
MessageBox("error");
Dialog_User* pWnd= (Dialog_User*)FromHandle(hWnd);
pWnd->m_listbox_user.AddString(m_user_name);要包含该调用对话框的头文件...
2.如何把CString类型的数据转换为char[20],因为我在定义数据结构时把用户名和密码都用char[20]来定义的(很不方便,但是我对C比较熟,数据结构容易出错,就选最拿手的)
char *username,*password;
int i;
username=m_user_name.GetBuffer(m_user_name.GetLength());
password=m_user_password.GetBuffer(m_user_password.GetLength());
for(i=0;i<19;i++)
{ if(i<strlen(username))
userinfo.user_name[i]=*(username+i);
else
userinfo.user_name[i]=' ';
}
userinfo.user_name[19]='\0';
for(i=0;i<19;i++)
{ if(i<strlen(password))
userinfo.user_password[i]=*(password+i);
else
userinfo.user_password[i]=' ';
}
userinfo.user_password[19]='\0';但是从对话框控件中获得的都是CString类型...
GetDlgItem(IDC_EDIT_USER_NAME)->GetWindowText(m_user_name);
GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowText(m_user_password);
GetDlgItem(IDC_EDIT_REPEAT_PASSWORD)->GetWindowText(m_repeat_password);现在先用这个笨点的办法把东西实现再说,等以后有时间学下MFC的数据结构和文件操作,再把程序优化下...
-
CLIstBox
2008-08-05 19:29:01
整个程序是基于对话框和控件的,要在一个对话框的菜单弹出对话框响应中显示用户名的列表
本来对话框如果显示的话是很简单的,在OnInitDialog()方法中调用一个CListBox的实例调用AddString("user");就可以显示user,但是弹出对话框的话好像没有这个函数,要通过MFC ClassWizard来添加函数 WM_INITDIALOG,然后在这个函数里调用AddString方法来显示文本内容...
BOOL Dialog_User::OnInitDialog()
{
CListBox *listBox;
listBox = (CListBox*)GetDlgItem(IDC_LISTBOX_USER);
//GetDlgItem(IDC_LISTBOX_USER);
//m_listbox_user.AddString("Jane");
struct user
{
char user_name[20];
char user_password[20];
}userinfo[MAXOFUSER];
FILE *fp;
int i;
CString userTemp;
if((fp=fopen("usrinfo.cfg","rb"))==NULL)
{
MessageBox("cannot open user information file","Error",MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
for(i=0;i<=MAXOFUSER;i++)
{
fread(&userinfo[i],sizeof(struct user),1,fp);
if(feof(fp))
{
fclose(fp);
break;
}
userTemp.Format("%s",userinfo[i].user_name);
listBox->AddString(userTemp);
}
//listBox->AddString("Tom");
CDialog::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} -
技术积累.
2008-08-04 19:32:03
我发现自己蛮强的(小臭美下),什么东西不管我以前是否接触过,只要给我点时间,我都有信心去把它做好..
本来我是做测试的,但无奈测试部就我一个,势单力薄,很多和测试相关的东西实施起来都不顺利,还时不时要接受开发老大下发给我的编程任务(不过我的心态也还好,就当学习,充实自己).上次让我帮他把一个VC的串口升级工具美化一下,加上动态背景...这次是把一个序列号打印程序加些功能,像用户登录,用户的权限管理,新建用户,删除用户,修改密码这些功能...其实我对VC一点都不熟,每次是用到哪就去学,能用C写就尽量用C去写,反正在VC里也执行..
void Dialog_login::OnOK()
{
// TODO: Add extra validation here
#if 1
char iniFilePath[256];
GetModuleFileName(NULL,iniFilePath,sizeof(iniFilePath));
for(int i=strlen(iniFilePath)-1;i>=0;i--)
{
if(iniFilePath[i]=='\\')
{
strcpy(iniFilePath+i+1,"Syscfg.ini");//dialog_login.m_user_name
//将用户名和密码定义为结构体
/*char User_Name[20];
char User_Password[20];*/
struct user
{
char user_name[20];
char user_password[20];
}userinfo[3]={{"user","user"},{"usr","password"},{"Admin","1234"}};
FILE *fp;
int i;
if((fp=fopen("usrinfo.cfg","wb"))==NULL)
{
MessageBox("cannot open user information file","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
for(i=0;i<3;i++)
{
if(fwrite(&userinfo[i],sizeof(struct user),1,fp)!=1)
MessageBox("file write error","Error",MB_OKCANCEL | MB_ICONWARNING);
} // 调试用
fclose(fp);
GetDlgItem(IDC_EDIT_USER_NAME)->GetWindowText(m_user_name);
GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowText(m_user_password);
//用户信息从文件中读出来再和m_user_name,m_user_password比较
if((fp=fopen("usrinfo.cfg","rb"))==NULL)
{
MessageBox("cannot open user information file","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
for(i=0;i<3;i++)
{
fread(&userinfo[i],sizeof(struct user),1,fp);
if(!memcmp(m_user_name,userinfo[i].user_name,strlen(m_user_name))&&
!memcmp(m_user_password,userinfo[i].user_password,strlen(m_user_password)))
{
break;
}
if(feof(fp))
{
/*CString s ;
s.Format("%d",i );
AfxMessageBox(s); */fclose(fp);
MessageBox("Password or User name Error!","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
}
fclose(fp);
/*GetPrivateProfileString("User", "User_Name", "Admin",User_Name,sizeof(User_Name), iniFilePath);
GetPrivateProfileString("User", "User_Password", "1234",User_Password,sizeof(User_Password), iniFilePath);*///CString m_user_name;
//CString dialog_login
//dialog_login.IDD_DIALOG_LOGIN
//CEdit* pEditFileName = (CEdit*)GetDlgItem( IDC_EDIT_PASSWORD );//pEditFileName->SetWindowText( "1234");
//SetDlgItemText(IDC_EDIT_USER_NAME,dialog_login.m_user_name);
/* GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowText(m_user_password);if(strcmp(m_user_password,User_Password))
{
MessageBox("Password or User name Error!","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
else
{
break;主要是想实现一个从文件中读用户名和密码,然后并进行比较,用户输入的是否正确...}*/
}
}
#endifCDialog::OnOK();
}框架是那个开发老大已经搭好的,我主要写一些实现..今天就写了一个,主要是想实现一个从文件中读用户名和密码,然后进行比较,用户的信息是否正确...紫色部分的代码是我写的,其实做为测试人员,我自己看了自己写的代码都觉得太不健壮了...不过对自己来说还是学到点东西...
1.fclose(fp);这句话,我的整个程序就因为这句话而一直导致辞功能不能实现..先对文件中草药写数据后如果不关闭文件指针,文件指针会一直指向EOF,所以进入下边的循环时就一直在第一层出不去,其实当时我通过AfxMessageBox(s); 这个调试信息知道程序是在文件操作上出了问题,刚开始还一直怀疑程序的逻辑
2.如何在VC在查看变量的值,以前我调试时只会看VC中加打印语句,今天也是上网搜了才有结果...以后可以常用..CString s ;
s.Format("%d",i );
AfxMessageBox(s);3.对数据的存储,有想过用二维数组,有想过用链表,还有我认为最方便的结构体...不过这个数据量小,如果数据量大,只能用数据库了,数据的关联存储和查找(不大熟)...
还有一点担心,接下来还有几天苦战,不知道这种数据结构能不能行,其实结构体和链表我用纯C做过类似的程序...但是要在VC的可视化界面下显示,还是有点没底...因为太想做好了....