第七,八课

对话框用户界面程序的编写,如何向对话框控件关联数据成员及其实现机理,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数)。如何在程序运行时产生和销毁控件。对话框控件的几种操作方式的优劣比较分析。如何实现对话框的部分收缩和展开。如何让对话框上的文本框在程序启动后立即获得焦点,如何利用SetWindowLong改变窗口的回调函数,通过改变文本框的默认回车处理方式进行演示。实现多个输入文本框间通过回车逐一向下传递焦点的另一种巧妙方法(用缺省按钮来处理)。

逃跑按钮的巧妙实现。如何制作属性页对话框和向导对话框,融合讲解组合框(如何调整组合框的大小)、列表框、单选按钮、复选按钮等常用对话框控件的多种使用方法。如何限制用户在不满足设定的条件时切换到其他属性页和向导页。

EM_SETSEL选择到文本消息

WM_SETFOCUS  设置焦点


  1. CDialog::domodal            创建一个模态对话框 
  2. CTestDlg *pDlg=new CTestDlg(); 
  3. pDlg->Create(IDD_DIALOG1,this); 
  4. pDlg->ShowWindow(SW_SHOW);         创建一个非模态对话框,注意变量的作用域 
  5. GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);得到控件的文本 
  6. GetDlgItemText(IDC_EDIT1,ch1,10); 
  7. GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);设置控件文本 
  8. etDlgItemText(IDC_EDIT3,ch3); 
  9. GetDlgItemInt(IDC_EDIT1);       得到整型值 
  10.  
  11. SetDlgItemInt(IDC_EDIT3,num3);    设置整型值 
  12. UpdateData(); 

UpdateData(TRUE) -- 刷新控件的值到对应的变量   UpdateData(FALSE) -- 拷贝变量值到控件显示例如,窗口中用 DDX_Text(pDX, IDC_EDIT1, m_usercode); IDC_EDIT1编辑框控件与m_usercode变量做了关联,如果修改m_usercode之后要想对应控件显示更改,则需要调用 UpdateData(FALSE);反之在IDC_EDIT1oneditchanged()中需要加入UpdateData(TRUE);   简单的说,如果Updatedata(TRUE) == 将控件的值赋值给成员变量;Updatedata(FALSE) == 将成员变量的值赋值给控件;

 

  1. //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); 
  2.     //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); 
  3.     //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); 
  4.     m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1); 
  5.     m_edit2.SendMessage(WM_GETTEXT,10,(LPARAM)ch2); 
  6.  
  7.  
  8. SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);     //给控件发消息 
  9. SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2); 

SetWindowPos该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。

GetFocus()   功能确定当前焦点位于哪个控件上。   语法GetFocus ( )   返回值GraphicObject。函数执行成功时返回当前得到焦点控件的引用,发生错误时返回无效引用。用法应用程序利用IsValid()函数可以检测GetFocus()是否返回有效的控件引用。同时,使用TypeOf()函数可以确定控件的类型。

GetNextDlgTabltem:该函数检索有WS_TABSTOP类型的第一个控制的句柄,该WS_GROUP类型控制跟随指定的控制。 

对话框控件访问七种方式

GetDlgItem()->Get(Set)WindowText()

GetDlgItemText()/SetDlgItemText()

GetDlgItemInt()/SetDlgItemInt()

将控件和整型变量相关联

将控件和控件变量相关联

SendMessage()

SendDlgItemMessage()

Z-order

窗口的Z次序表明了重叠窗口堆中窗口的位置,这个窗口堆是按一个假想的轴定位的,这个轴就是从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其它的窗口,Z次序最底层的窗口被所有其它的窗口覆盖。应用程序设置窗口在Z次序中的位置是通过把它放在一个给定窗口的后面,或是放在窗口堆的顶部或底部。

        Windows系统管理三个独立的Z次序——一个用于顶层窗口、一个用于兄弟窗口,还有一个是用于最顶层窗口。最顶层窗口覆盖所有其它非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建最顶层窗口。

        一般情况下,Windows系统把刚刚创建的窗口放在Z次序的顶部,用户可通过激活另外一个窗口来改变Z次序;Windows系统总是把活动的窗口放在Z次序的顶部,应用程序可用函数BringWindowToTop把一个窗口放置到Z次序的顶部。函数SetWindowPosDeferWindowPos用来重排Z次序。

窗口

兄弟窗口

     共享同一个父窗口的多个子窗口叫兄弟窗口。

活动窗口

              活动窗口是应用程序的顶层窗口,也就是当前使用的窗口。只有一个顶层窗口可以是活动窗口,如果用户使用的是一个子窗口,Windows系统就激活与这个子窗口相应的顶层窗口。

            任何时候系统中只能有一个顶层窗口是活动的。用户通过单击窗口(或其中的一个子窗口)、使用ALT+TABALT+ESC组合键来激活一个顶层窗口,应用程序则调用函数SetActiveWindow来激活一个顶层窗口。

前台窗口和后台窗口

            在Windows系统中,每一个进程可运行多个线程,每个线程都能创建窗口。创建正在使用窗口的线程称之为前台线程,这个窗口就称之为前台窗口。所有其它的线程都是后台线程,由后台线程所创建的窗口叫后台窗口。

            用户通过单击一个窗口、使用ALT+TABALT+ESC组合键来设置前台窗口,应用程序则用函数SetForegroundWindow设置前台窗口。如果新的前台窗口是一个顶层窗口,那么Windows系统就激活它,换句话说,Windows系统激活相应的顶层窗口。

GetClientRect(&rect); //得到客户区的矩形

CPropertyPage

CPropertyPage的对象表示一张属性表的各页,或者说是被看作是标签对话框。同标准对话框一样,要为属性表中每一页从 CPropertyPage类中派生一个新类。要使用CPropertyPage派生对象,首先要创建一个CPropertySheet对象,然后为属性 表中的每一页创建一个对象。为表中的每一页调用CPropertySheet::AddPage函数,然后对一个模式属性表调用 CPropertySheet::DoModal函数来显示此属性表。对一个非模式属性表调用CPropertySheet::Create来显示此属性 表。   你可以创建一种被称为向导的标签对话框,这种对话框包括一个属性表,该表有一系列属性页来引导 用户进行一项操作的每一个步骤,比如说设置一个设备或创建一个时事通讯。在一个向导类型的标签对话框中属性页没有标签,每次只有一个属性页是可见的。而 且,一个向导类型的对话框没有OKApply Now按钮,代替它们的是一个Back按钮,一个NextFinish按钮和一个Cancel按钮。