今天装上VS2012试了下,本来是不想装VB的却没有选择安装的提示,只好都装上了。C盘要9G太占地方。打开后直接被那界面的颜色震撼了,白花花一片,分不出哪儿是哪儿。赶忙去百度了下如何换肤。不过换过的颜色也不好看,色彩搭配也是门艺术呀,MS太逊,于是很怀念BCB中class c的样子。然后打开了个MFC的解决方案,发现工具箱里是空的,切换了好几次资源文件窗口还是什么都没有,最后右键-》重置工具箱,总算是出来了。属性窗口除了操作控件属性,也可以查看并修改函数的属性,还可以改成员变量的属性,这个不错。如果是静态const变量还可以在属性窗口赋值,但不符合的成员变量也可以赋值但编译时报错。
//CSDN的排版真是大问题,怎么就没办法保持一致呢?也不能改行距吗?有知道的留言告诉我啊
一 Edit
1 长度限制
OnInitDialog()中:m_edit1.SetLimitText(8); // m_edit1为编辑框的成员变量
或者:
CEdit*pEdt=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdt->SetLimitText(8); // 限制编辑框输入长度为8字节
2 汉字
Cstring ss = "你好";
if(IsDBCSLeadByte(ss[i])) // 是DBCS
{
i += 2;
AfxMessageBox("汉字");
}
3 字体及大小
定义一全局变量或成员变量CFont font; //不要定义成局部变量,否则没效果
CEdit*pEdt=(CEdit*)GetDlgItem(IDC_EDIT1);
font.CreatePointFont(266,"Arial");
pEdt->SetFont(&font);
4 响应回车
Edit 属性 multiline = true;want return = true;
在classwizard中选择“类名”选择虚函数,就可以看到窗口类里被重载过的虚函数了。
重载PreTranslateMessage函数,判断当前焦点窗口为EDIT时,拦截消息值为WM_KEYDOWN且WPARAM为VK_RETURN的消息,直接返回TRUE。
BOOL CbarcodeMFCDlg::PreTranslateMessage(MSG* pMsg)
{
if(GetFocus()->GetDlgCtrlID()==IDC_EDIT1)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
//call
return TRUE;
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
二 打开/保存对话框
让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类“CFileDialog”用于实现这种功能。使用“CFileDialog”声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。
在构造“CFileDialog”对象时,如果在参数中指定了“OFN_ALLOWMULTISELECT”风格,则在此对话框中可以进行多选操作。此时要重点注意为此“CFileDialog”对象的“m_ofn.lpstrFile”分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。
CFileDialog mFileDlg(TRUE, NULL,NULL, OFN_HIDEREADONLY|OFN_OVER
WRITEPROMPT|OFN_ALLOWMULTISELECT,“All Files (*.*)|*.*| |”, AfxGetMainWnd());
CString str(“ ”, 10000);
mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);
str.ReleaseBuffer();
POSITION mPos=mFileDlg.GetStartPosition();
CString pathName(“ ”, 128);
CFileStatus status;
while(mPos!=NULL)
{
pathName=mFileDlg.GetNextPathName(mPos);
CFile::GetStatus(pathName, status);
}
三 动态改变控件的caption
#ifdef SAVE
AfxGetMainWnd()->SetWindowTextW(_T("BarcodeSAVE_64_v1.0.0")); //窗口
#endif
(CButton*)GetDlgItem(IDC_BUTTON1)->SetWindowTextW(_T("ok")); //button
SetDlgItemText(IDOK,_T("開始"));
四 关闭窗体
窗口上有默认的"确定" "取消" 按钮 , 如果要拿掉的话需要删除三个地方. 声明,定义, message map .
void CDemoExcelCtrlDlg::OnBnClickedCancel() 函数存在的话, 叉掉窗口会默认跳转到这来执行CDialogEx::OnCancel();. 如果不存在的话呢??
所以, 如果放一个空的OnBnClickedCancel()函数,是叉不掉窗口的.
五 IDC_STATIC关联成员变量
DDX_TEXT() : 把变量和控件的文本(WindowText)关联起来,
DDX_Control() :把控件变量和控件本身关联起来,
DoDataExchange(pDX) :处理所有变量与其关联控件交换数据的函数。
1. 在.h中声明:
CString m_strUIExcel;
CStatic m_ctlUIExcel;
CEdit m_ctlUIStartLineE;
UINT m_uUIStartLineE;
2. 在.cpp中进行关联:
void CLXTDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_EXCEL, m_ctlUIExcel); //关联控件和控件变量
DDX_Text(pDX, IDC_STATIC_EXCEL, m_strUIExcel); //关联控件和变量
DDX_Control(pDX, IDC_EDIT_STARTLINE, m_ctlUIStartLineE);
DDX_Text(pDX, IDC_EDIT_STARTLINE, m_uUIStartLineE);
}
VC中像Label、PictureBox之类的静态控件默认ID为IDC_STATIC , 关联之前要把IDC_STATIC重命名, 才能在classwizard中看到这个控件.加入变量时选择"控制项变量"VC会自动添加上面的代码. 注意VALUE 和CONTROL的区别.如果是control则变量类型和控件类型一致, 如果是value则变量可以是其它类型.
3 使用:
更新 : 通过update(TRUE)取得控件上的值到m_strID,处理修改后通过update(FALSE)传回控件,
界面显示 :通过m_ctlUIExcel.GetWindText(str) 取得值,通过m_ctlUIExcel.SetWindText(_T("繼續"));传回控件界面显示
通过 m_ctlUIExcel.ShowWindow(FALSE); 使控件不可见.