阅读本文前,我们假设您已经: 1,知道如何创建一个单文档的App Wizard 2,知道C++ 类、函数重载等简单知识 3,知道如何给View类或者Doc文档添加成员变量 4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试 5,知道如何为某个框架类添加虚函数或消息处理函数
1,动态创建按钮 1)增加全局变量 CButton m_btn; 2)在需要创建的地方 //ID号123可以随意改变 if(!m_btn.m_hWnd) m_btn.Create("维新",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123); else m_btn.DestroyWindow(); 2,复制控件 在dlg上添加控件时,按住ctrl键,拖动就可以复制一模一样的控件 3,控件对齐 在对话框上多个控件对齐,可以用layout菜单或者左下角toolbar 4,动态编辑static静态文本框 CString str; if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:") GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:"); else GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:"); 要让static静态文本框响应消息,需要复选上notify选项 5,Edit文本框 获取/设置文本内容 1)方法1 char ch[10]; GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10); GetDlgItem(IDC_EDIT3)->SetWindowText(itoa(atoi(ch1),ch1,10)); 2)方法2 GetDlgItemText(IDC_EDIT1,ch1,10); SetDlgItemText(IDC_EDIT3,itoa(atoi(ch1),ch1,10)); 3)方法3 SetDlgItemInt(IDC_EDIT3,GetDlgItemInt(IDC_EDIT1));//对整型数字的字符串有用 4)关联变量法 对每个Edit控件关联一个变量,设置后记得用UpdateData() 对于显示数字类的文本框,可以定义value和control两种类型变量
DoDataExchange() called by the framework to exchange and validate dialog data The framework automatically calls UpdateData with bSaveAndValidate set to FALSE when a modal dialog box is created in the default implementation of CDialog::OnInitDialog. 5)利用WM_GETTEXT消息处理获取文本 char ch1[10]; 可以用以下四种方法(m_edit1为关联的控制型变量) ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); ::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
利用WM_SETTEXT消息处理设置文本 m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3); 6)直接对对话框控件进行消息发送 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);//获取文本 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);//设置文本 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1); 7)利用EM_GETSEL,EM_SETSEL的消息处理 6,对话框收缩 点击"收缩<<"对话框收缩,点击"扩展>>"则扩展, 请看例子代码 7,多个edit框用Enter键切换的方法,三种方法 1)捕获键盘消息,在消息函数中处理(未提供) 2)修改Edit的窗口过程:自己写窗口过程替代原来的窗口过程(比较麻烦的方法) (1)定义窗口过程类型变量 WNDPROC prevProc; (2)定义窗口过程函数 LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam ) { if(uMsg==WM_CHAR && wParam==0x0d)//如果是回车 { //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//获取下一窗口句柄方法一 //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));//方法二 SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));//方法三 return 1; } else return prevProc(hwnd,uMsg,wParam,lParam); } (3)添加WM_INITDIALOG对应的函数 (4)在OnInitDialog中添加 prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinSunProc); (5)注意 edit控件 MultiLine复选属性选/不选的不同 SetWindowLong changes an attribute of the specified window.
3)在OnOK(default button对应的函数) GetFocus()->GetNextWindow()->SetFocus();//注意最后一个窗口时要判断,不然获取出错 GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();//注意同上 GetNextDlgTabItem(GetFocus())->SetFocus(); 注意: 对话框初始的OK的ID号为IDOK,即使删除按钮(OnOk函数存在),依然会响应OnOk函数 |
欢迎以任何形式转载本文,只要对您有用 |
韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载) 韦伯Blog: http://webbery.tianyablog.com |
参考书目和网站: |
(1)孙鑫VC++视频 |
(2)1-6章主要参考: hbyufan的BLog |
(3)11-20章主要参考: songpeng的Blog |