对话框设计1


一、模态与非模态对话框
区分模态对话框和非模态对话框,前者启动时,主视窗处于无效状态,除非关闭该对话框;后者启动时对主视窗没有影响。
模态对话框的创立: 创建对话框资源,生成与资源相关的对话框类。
首先,view.cpp中添加对话框头文件#include "CtestDlg.h"
 1.  假设CTestDlg是一个对话框类,则
   CTestDlg dlg;
   dlg.domodal();//创建模态对话框
模态对话框执行到domodal()时会暂停执行,直到关闭销毁,因此无需定义为全局变量或者成员函数
2.创建非模态对话框,注意定义为view类的成员变量,否则对应菜单的函数相应完自动释放该局部变量的对话框对象:
CDialog::Create()函数
或者定义为一个对话指针,指针在堆上分配,与整个程序的生命周期一致。
CTestDlg* pdlg = new CTestDlg();
 pdlg->Create(IDD_DIALOG1, this);
 pdlg->ShowWindow(SW_SHOW);
点击对话框的OK按钮此时并没有销毁,而是使得对话框不可见。因此,必须重新定义成员函数OnOK()

或者定义局部静态bool变量判断是否创建了CButton控件;
或者不用bool变量判断,使用CButton的窗口子变量m_Wnd是否为NULL作为创建按钮的判断。
                  if  (!btn.m_hWnd)
                {
                                btn.Create(TEXT(  "weixin" ), BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD, CRect(0, 0, 100, 50),  this , 123);
                }
                  else
                                btn.DestroyWindow()

二、静态文本(static edit )框和文本编辑框(edit)操作
静态文本框控件的ID默认情况下是一样的,因为只是作为标记无需修改,但是可以修改。如何读取文本框的字符串呢?GetWindowText(),但是首先要获取当前控件的指针,用GetDlgItem(ID);
若要静态文本框相应事件函数,首先改变ID,再复选上Notify选项,才能正确相应。

字符串与CString之间的关系,在UNICODE下,一般是16位的字符串定义,即WCHAR,TCHAR此时是一样的16位字符串,能够从LPTSTR直接转换成TCHAR和WCHAR字符串。
TCHAR的定义:
#ifdef UNICODE
 typedef WCHAR TCHAR;
#else
 typedef char TCHAR;
#endif
LPTSTR的定义:
#ifdef UNICODE
 typedef LPWSTR LPTSTR;
#else
 typedef LPSTR LPTSTR;
#endif
1.16位字符串与数值之间的转换:_wtoi()与_itow_s(num3, ch3, 10/*10进制*/);
                  int  num1, num2, num3;
                TCHAR ch1[10], ch2[10], ch3[10];
                GetDlgItem(IDC_EDIT1)->GetWindowText(ch1, 10);// GetDlgItemText(IDC_EDIT1, ch1, 10);
                GetDlgItem(IDC_EDIT2)->GetWindowText(ch2, 10);
                GetDlgItem(IDC_EDIT3)->GetWindowText(ch3, 10);
                num1 = _wtoi(ch1);
                num2 = _wtoi(ch2);
                num3 = num2 + num1;
                _itow_s(num3, ch3, 10);
                GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);//SetDlgItemText(IDC_EDIT3, ch3);
或者通过 CWnd::GetDlgItemText直接获取控件的字符串,也有一个对应的设置对话框控件文本的函数SetDlgItemText
2.直接用函数 CWindow::GetDlgItemInt()获取文本编辑框内的字符串表示的整型数值,但是对于浮点型数值,仍需要字符串到数值的转化。
相应的设置文本编辑框的整型数值为 CWindow::SetDlgItemInt()。

3.增加相应的成员变量关联编辑框(edit)。    
               UpdateData(  TRUE  );//设置对话框获取数据有效
                m_num3 = m_num1 + m_num2;          //三个与编辑框关联的整型变量      
                UpdateData(  FALSE );//编辑对话框重新初始化
4.增加成员变量CEdit来完成。 m_edit1、 m_edit2、 m_edit3来关联三个编辑框控件。
                 int  num1, num2, num3;
                TCHAR ch1[10], ch2[10], ch3[10];
                m_edit1.GetWindowText(ch1, 10);
                m_edit2.GetWindowText(ch2, 10);
                num1 = _wtoi(ch1);
                num2 = _wtoi(ch2);
                num3 = num2 + num1;
                _itow_s(num3, ch3, 10);
                m_edit3.SetWindowText(ch3);
5.通过消息传递来实现。
                  int  num1, num2, num3;
                TCHAR ch1[10], ch2[10], ch3[10];
                ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1);
                ::SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch2);
                num1 = _wtoi(ch1);
                num2 = _wtoi(ch2);
                num3 = num2 + num1;
                _itow_s(num3, ch3, 10);
                ::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd, WM_SETTEXT, 0, (LPARAM)ch3);
发送消息的其他形式:
             1.关联控件
                m_edit1.SendMessage(WM_GETTEXT, 10, (LPARAM)ch1);
                m_edit2.SendMessage(WM_GETTEXT, 10, (LPARAM)ch2);
               m_edit3.SendMessage(WM_SETTEXT, 10, (LPARAM)ch3);
             2、 ::SendMessage(m_edit1->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1);

6.通过sendDlgItemMessage()直接给对话框的子控件发送消息。
                  int  num1, num2, num3;
                TCHAR ch1[10], ch2[10], ch3[10];
                SendDlgItemMessage(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1);
                SendDlgItemMessage(IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2);
                num1 = _wtoi(ch1);
                num2 = _wtoi(ch2);
                num3 = num2 + num1;
                _itow_s(num3, ch3, 10);
                SendDlgItemMessage(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3);
注:如何获取文本复选内容的消息。
                SendDlgItemMessage(IDC_EDIT3, EM_SETSEL, 1, 3);、、设置复选位置,为1到3,不包括1
                m_edit3.SetFocus();//设置焦点为当前编辑框控件

三、CRect是否为空,区别isRectNull()和 CRect::IsRectEmpty

前者是CRect的四个分量top,left,right,bottom都为0。后者是当宽度和高度为0或者小于0时。

四、获取控件矩形区域大小: GetDlgItem(IDC_SEPRATE)->GetWindowRect(&rectseperator);

五、对话框扩展与收缩
void  CTestDlg::OnBnClickedButton2()
{
                  // TODO: Add your control notification handler code here
                CString str;
                  if  (GetDlgItemText(IDC_BUTTON2, str), str == _T( "收缩<<" ))
                {
                                SetDlgItemText(IDC_BUTTON2, _T(  "扩展" ));
                }
                  else
                                SetDlgItemText(IDC_BUTTON2, _T(  "收缩<<"  ));
                  static  CRect rectlarge;
                  static  CRect rectsmall;
                  if  (rectlarge.IsRectEmpty())
                {
                                  //对?话框原-始?矩?形?大小?
                                GetWindowRect(&rectlarge);
                                CRect rectseperator;
                                GetDlgItem(IDC_SEPRATE)->GetWindowRect(&rectseperator);
                                rectsmall = rectlarge;
                                rectsmall.bottom -= rectseperator.bottom;
                }
                  if  (str == _T( "收缩<<"  ))
                {
                                SetWindowPos(NULL, 0, 0, rectsmall.Width(), rectsmall.Height(), SWP_NOMOVE|SWP_NOZORDER);//设置窗口的位置,Z次序。 SWP_NOMOVE保存当前位置,忽略了x和
                                                                                                                                                                                                            //y。 SWP_NOZORDER保存z次序
                }
                  else
                {
                                SetWindowPos(NULL, 0, 0, rectlarge.Width(), rectlarge.Height(), SWP_NOMOVE|SWP_NOZORDER);
                }
}

六、完成在EDIT控件中按下回车键将焦点转移到下一个EDIT,需要修改窗口过程
1.使用窗口过程来实现,将窗口过程改写在初始化对话框操作中 OnInitDialog()
LRESULT CALLBACK wndsunProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
                  if  (uMsg == WM_CHAR &&wParam == 0x0d)
                {
                                ::SetFocus(::GetNextWindow(hwnd, GW_HWNDNEXT));
                                  return  1;
                }
                  else
                {
                                  return  preProc(hwnd, uMsg, wParam, lParam);
                }
}


BOOL  CTestDlg::OnInitDialog()
{
                CDialogEx::OnInitDialog();

                  // TODO:  Add extra initialization here
                preProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, ( LONG )wndsunProc);
                  return  TRUE    // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}
2.通过缺省按钮的相应函数,按下回车键由OnOK()来相应,获取下一个窗口: GetNextDlgTabItem
CWnd* GetNextDlgTabItem(
   CWnd* pWndCtl, //要搜索的当前窗体
   BOOL bPrevious = FALSE //为FALSE则搜索后一个,为TRUE则搜索前一个控件
)
GetNextDlgTabItem(GetFocus())->SetFocus();
GetFocus()返回当前焦点的对话框控件句柄, GetNextDlgTabItem返回控件, SetFocus()设置焦点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值