类的继承图表

CObject
  CCmdTarget
    CWnd       //由CWnd派生,是一个窗口类
      CDialog

对话框分为模态对话框和非模态的对话框

CDialog::DoModal
 //virtual int DoModal()
 调用DoModal()创建一个模态的对话框
 它的返回值是做为CDialog::EndDailog成员函数的参数,这个参数用来关闭对话框   
CDialog::EndDailog
 //用来关闭模态的对话框                 
CDialog::Create
 //创建非模态的对话框
 //初始化一个CDialog对象,创建一个非模态的对话框(modeless dialog box)
 //把它将一个CDialog对象关联起来
 //BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL); 
 //BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL);
 //lpszTemplateName: 对话框模板的名字
 //nIDTemplate:      对话框模板的ID号
 //pParentWnd:       对话框父窗口的指针,如果为NULL,则对话框的父窗口将被设置为主应用程序窗口

模态对话框的显示不用调用ShowWindow
而非模态的对话框在调用Create创建完对话框之后,需要调用ShowWindow显示对话框//ShowWindow(SW_SHOW)

CAUTION:
    对于模态的对话框,在模态的对话框显示时,应用程序是暂停执行的,所以模态的对话框对象可以
 是局部对象,不会在模态的对话框显示之前析构。
    而对于非模态的对话框,应用程序不会暂停执行,所以非模态对话框的对象不能是局部对象,非模态的
 对话框对象有两种定义方法:
 1:定义对话框成员变量
 2:在堆上分配内存,在堆上分配的内存和我们整个应用程序的生命周期是一样的,可以如下定义:
    CTestDlg *pDlg=new CTestDlg();    //注意内存看见的回收,防止memory leak
    
    
CAUTION:
  对于模态的对话框,当我们点击OK或者Cancel按钮时这个对话框窗口是被销毁了的
  对于非模态的对话框,这个对话框窗口并没有被销毁,只不过是隐藏了,当我们点击OK时,由基类的
  虚函数OnOK()响应
  
CDialog::OnOK
 //virtual void OnOK();
 //如果你在一个非模态的对话框中实现了一个OK Button,你必须重载OnOK成员函数,在它内部调用
 //DestroyWindow,不要调用基类的成员函数,因为它调用的是EndDialog,which makes the dialog
 //box invisible but does not destroy it.
 
 
CButton::Create
 //BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
 //创建Button
 //按钮也是子窗口,如果dwstyle中不包含WS_VISIBLE,则在创建完Button后,继续调用ShowWindow()显示
 //按钮

CWnd和任何由CWnd类派生出来的窗口类对象,内部都有一个成员变量m_hWnd保存和这个对象相关联的窗口的
句柄,没有窗口和它关联时,m_hWnd的值为NULL

静态的文本框也是一个窗口,要获取静态文本框的文本,可以使用函数 CWnd::GetWindowText
设置文本使用 CWnd::SetWindowText
 CWnd::GetWindowText
  //int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount )const;
  //void GetWindowText( CString& rString ) const;
 CWnd::SetWindowText
  // void SetWindowText( LPTSTR lpszString)
  
对于静态的文本框是不能接收通告消息的,如果让它接收通告消息,需要把它的属性的style的"Notify"项选上

atoi函数
  int atoi( const char *string)  //将数值字符,转化为整形数值
  char* _itoa( int value, char *string, int radix);  //Convert an integer to a string
  //string 指向结果
  //radix 2-36数值的*进制

访问控件的方式
  
1、获取对话框上控件的指针
 CWnd::GetDlgItem
  CWnd* GetDlgItem( int nID ) const;
  void CWnd::GetDlgItem( int nID,HWND* phWnd ) const;
   
2、CWnd::GetDlgItemText
 //int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;
 //int GetDlgItemText( int nID, CString& rString ) const;
CWnd::SetDlgItemText
 //void SetDlgItemText( int nID, LPCTSTR lpszString);
 
3、CWnd::GetDlgItemInt
 //UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;
 //可以获取控件的文本,并把它转化为无符号整形
 //如果遇到非数值字符,或者数值超过所能表示的最大值,将会发生错误。此时lpTrans指向0,如果没有错误
 //lpTrans接收一个非零的值,如果lpTrans为NULL,GetDlgItemInt不会对错误产生警告
 //bSigned指示接收的数值字符是否是有符号的
CWnd::SetDlgItemInt
 //void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE );

4、控件与成员变量的关联,在DoDataExchange函数中
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CTestDlg)
 DDX_Text(pDX, IDC_EDIT1, m_num1);          //将控件IDC_EDIT1与成员变量m_num1相关联
 DDX_Text(pDX, IDC_EDIT2, m_num2);
 DDX_Text(pDX, IDC_EDIT3, m_num3);
 //}}AFX_DATA_MAP
}
 DDX_函数有很多种,关联不同的控件,需要选择不同的DDX_函数,如DDX_Scroll,DDX_Radio等
 
DoDataExchange的调用时间:
  //Called by the framework to exchange an validate dialog data
  //由框架调用,来交换和调用对话框的数据
  //Never call this function directly.It is called by the UpdateData member function.
  //我们重来不会直接调用这个函数,它由UpdateData成员函数调用
  //Call UpdateData to initialize a dialog box's control or retrive data from a dialog box
  //调用UpdateData来初始化一个对话框控件,或者从对话框获得数据

CWnd::UpdateData
 //BOOL UpdatData( BOOL bSaveAndValidate = TRUE )
 //Call the member function to initialize data in a dialog box, or to retrieve and validate
 //dialog data
 //Flag that indicates whether dialog box is being initialized (FALSE) or data is being retrieve
 //(TRUE)
 //The framework automatically calls UpdateData with bSaveAndValidate set to FALSE when a modal 
 //dialog box is created in the default implementation of CDialog::OnInitDialog

在控件关联的成员变量设置最大最小值后,DoDataExchange函数中会增加如下几条语句

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CTestDlg)
 DDX_Text(pDX, IDC_EDIT1, m_num1);           //DDX : Dialog Data Exchange
1 DDV_MinMaxInt(pDX, m_num1, 0, 100);         //DDV : Dialog Data Validate
 DDX_Text(pDX, IDC_EDIT2, m_num2);
2 DDV_MinMaxInt(pDX, m_num2, 0, 100);         //DDV_函数也有很多,同DDX_函数一样
 DDX_Text(pDX, IDC_EDIT3, m_num3);
 //}}AFX_DATA_MAP
}

获取文本的消息:WM_GETTEXT
   An application sends a WM_GETTEXT message to copy the text that corresponds to a window into a
   buffer provided by the caller.
   To send this message,call the SendMessage function with the following parameters.
   SendMessage{
          (HWND) hWnd,              //handle to destination window
          WM_GETTEXT,               //message to send
          (WPARAM) wParam,          //number of the character to copy
          (LPARAM) lParam           //text buffer
              }
              
设置文本的时候使用消息 WM_SETTEXT

SendMessage{
          (HWND) hWnd,              //handle to destination window
           WM_SETTEXT,               //message to send
          (WPARAM) wParam,          //not used;must be zero
          (LPARAM) lParam           //window-text string (LPCTSTR)
           }

给对话框的子控件发送消息
CWnd::SendDlgMessage
 LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam=0, LPARAM lParam = 0)
 //等价于我们现调用GetDlgItem再调用SendMessage
 
编辑框消息 EM_GETSEL
 //The EM_GETSEL message retrieves the starting and ending character positions of the current
 //selection in an edit control. You can send this message to either an edit control or a rich  
 //edit control       
 SendMessage{                                                             
           (HWND) hWnd,              //handle to destination window    
           WM_GETTEXT,               //message to send                       
        (WPARAM) wParam,           //starting position (LPDWORD)  
        (LPARAM) lParam            //ending position (LPDWORD)                     
          }                                                             
 
EM_SETSEL设置复选的开始位置和结束位置     
SendMessage{                                                                   
        (HWND) hWnd,              //handle to destination window       
        WM_SETTEXT,               //message to send                    
       (WPARAM) wParam,           //starting position       
       (LPARAM) lParam            //ending position         
          } 
 //If the start is 0 and the end is -1, all the text in the edit control is selected.
 //If the start is -1,any current selection is deselected 
         
设置窗口的焦点 CWnd::SetFocus
 CWnd* SetFocus();

总结:
    对话框控件访问七种方式
    1、GetDlgItem()->Get(Set)WindowText()  //常用
    2、GetDlgItemText()/SetDlgItemText()
    3、GetDlgItemInt()/SetDlgItemInt()
    4、将控件和整型变量相关联              //常用
    5、将控件和控件变量相关联        //常用
    6、SendMessage()                       //不常用
    7、SendDlgItemMessage()                //不常用
    
对话框的收缩与扩展
  CRect::IsRectEmpty
   //Determines whether CRect is empty.CRect is empty if the width and/or height are 0;
  CRect::IsRectNull
   //Determines whether the top, bottom, left,and right member variables are all equal to 0.
  
  CWnd::GetWindowRect
   void GetWindowRect( LPRECT lpRect) const;
  //获取窗口矩形区域的大小
  
  CWnd::SetWindowPos
   //BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x,int y, int cx, int cy, UINT nFlags);
   SetWindowPos和DeferWindowPos用来重排Z-order
   //应用程序通过设置WS_EX_TOPMOST风格创建最顶层窗口。
    //应用程序可用函数BringWindowToTop把一个窗口放置到Z次序的顶部。
兄弟窗口
     共享同一个父窗口的多个子窗口叫兄弟窗口。
活动窗口
     活动窗口是应用程序的顶层窗口
     应用程序则调用函数SetActiveWindow来激活一个顶层窗口

前台窗口和后台窗口
     在Windows系统中,每一个进程可运行多个线程,每个线程都能创建窗口。创建正在使用窗口的线程
  称之为前台线程,这个窗口就称之为前台窗口。所有其它的线程都是后台线程,由后台线程所创建的
  窗口叫后台窗口。
     用户通过单击一个窗口、使用ALT+TAB或ALT+ESC组合键来设置前台窗口,应用程序则用函数
  SetForegroundWindow设置前台窗口。如果新的前台窗口是一个顶层窗口,那么Windows系统就激活它,
  换句话说,Windows系统激活相应的顶层窗口。
  
       SetWindowPos???

SetWindowLong函数
  //The SetWindowLong function changes an attribute of the specified window 
  //SetWindowLong函数可以改变指定窗口的属性
  long SetWindowLong
  {
   HWND hWnd,              // handle to window
   int  nIndex,            // offset of value to set   
   long dwNewLong          // new value 
 } 
 
 当 nIndex=GWL_WNDPROC   可以Sets a new address for the window procedure
 此时可以把dwNewLong设置成新的窗口过程的地址。

函数的返回值:
    If the function succeeds, the return value is the previous value of the specified 32-bit integer
    If the function fails , the return value is zero 
    当 nIndex=GWL_WNDPROC ,它的返回值就是以前的窗口过程的地址
    
当对话框上的子控件全部创建完毕,对话框将要显示时发送消息:WM_INITDIALOG
    //Sent to a dialog box before the dialog box is displayed

子控件的创建时间在对话框创建之后,对话框将要显示之前

窗口过程函数的写法:
  LRESULT CALLBACK WindowProc{
             HWND      hwnd,       //handle to window 
             UINT      uMsg,       //message identifier
             WPARAM    wParam,     //first message parameter
             LPARAM    lParam      //second message parameter
             }
             
当处理的是WM_CHAR消息时,wParam表示字符的ASCII码

CAUTION!
   窗口过程函数是一个全局函数

全局的SetFocus函数
    HWND SetFocus(
         HWND  hwnd    //handle to window
         );      
         
全局的GetNextWindow函数:
 HWND GetNextWindow(
      HWND hWnd,        //handle to current window
      UINT uCmd         // direction
      );
   //当 uCmd=GW_HWNDNEXT    当前窗口的下一个窗口                                                                       
   //当 uCmd=GW_HWNDPREV    当前窗口的上一个窗口
   
编辑框的Style如果如果没有复选Multiline属性,则编辑框无法接受回车符发送的消息
取消Multiline属性是在 02:29:10 写OnOK函数时

获取窗口句柄的GetWindow全局函数
  HWND  GetWindow(
        HWND hWnd,   // handle to original window 
        UINT uCmd    // relationship
 
 GetNextDlgTabItem函数
 //The GetNextDlgTabItem function retrieves a handle to the first control that has the
 //WS_TABSTOP style that precedes(前面)( or follows)the specified control.
 HWND GetNextDlgTabItem(
      HWND hDlg,       //handle to dialog box
      HWND hCtrl,      //handle to known control 已知控件的句柄
      bool bPrevious   //direction flag 方向。If this parameter is TRUE, the function searches
                       //for the previous control in the dialog box.If this parameter is FALSE,
                       //the function searches for the next control in the dialog box
       );
CWnd::GetNextWindow
 CWnd* GetNextWindow( UINT nFlag = GW_HWNDNEXT )const;//具有缺省的方向GW_HWNDNEXT

获取当前具有输入焦点的窗口的指针的函数: CWnd::GetFocus   
 
CWnd::GetWindow
 CWnd* GetWindow( UINT nCmd) const;

CWnd::GetNextDlgTabItem
 CWnd* GetNextDlgTabItem( CWnd* pWndCtrl, bool bPrevious = FALSE) const;
 //函数寻找具有WS_TABSTOP style的control,循环依次调用
 
菜单项 Layout->TabOrder显示顺序

void CTestDlg::OnOK() 什么时候调用????????

孙鑫VC学习笔记:第七讲 对话框相关推荐

  1. 孙鑫VC学习笔记:第七讲

    七.对话框 2006年8月5日 14:25 因为笔记是用OneNote做的,上传以后为看不到图片,于是我截图放到相册上面, 相册地址为:http://photo.163.com/photos/good ...

  2. 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15] .

    第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...

  3. 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15]

    第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...

  4. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-三角测量和实践

     专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第 ...

  5. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵

    专栏系列文章如下:  专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...

  6. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-PnP和实践

      专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记- ...

  7. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  8. 孙鑫VC学习系列教程

    教程简介 1.循序渐进 从Win32SDK编程开始讲解,帮助大家理解掌握Windows编程的核心 -- 消息循环机制. 2.通俗易懂 编程语言枯燥难懂,然而通过孙鑫老师形象化的讲解,Windows和M ...

  9. 视觉SALM十四讲学习笔记——第七讲 视觉里程计(1)

    视觉里程计这一部分的第一个主要内容是ORB特征点的提取与匹配.这里主要关注两个内容: (1)特征点的匹配方法及代码实现 (2)ORB特征点的BRIEF描述子如何实现旋转不变性及在示例代码中的体现 1. ...

  10. Apollo星火计划学习笔记——第七讲自动驾驶规划技术原理1

    文章目录 前言 1. 规划技术功能概述 1.1 自动驾驶系统 1.2 规划的作用 1.3 规划主要功能 1.3.1 路由寻径(Routing) 1.3.2 行为决策 1.3.3 轨迹规划 2. Apo ...

最新文章

  1. 最全正則表達式汇总—想要的都有了
  2. Redis源码解析——字典结构
  3. 关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”...
  4. 【转】Scrum角色及其职责介绍
  5. 学习java第一步_Spring Boot 学习第一步(搭建初步环境)
  6. OAuth2(二)——实现
  7. mysql循环load data_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  8. Loj2687,jzoj3320-文本编辑器【线头dp】
  9. 深圳市南山区学计算机的视频课程,新手学电脑全套视频教程(1-27集)
  10. Javaoop_继承
  11. JUnit4常用的注解
  12. 深度学习和神经网络——第二周笔记
  13. plsql developer 查看存储过程执行计划_产品简介 | X-Developer一站式研发效能管理平台...
  14. 你们身边有没有程序媛?
  15. Antelopenbsp;和Barracuda区别
  16. bzoj 1779: [Usaco2010 Hol]Cowwar 奶牛战争 (网络流)
  17. Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)
  18. 用word字体转换来代替手写作业--最详细
  19. 前端项目添加自定义icont图标步骤
  20. python字典存储省份与城市_python实现城市和省份字典(根据城市判断属于哪个省份)...

热门文章

  1. linux 禁ping
  2. 【连载】【FPGA黑金开发板】NIOS II那些事儿--SDRAM实验(十二)
  3. 让系统“飞”起来 读懂电脑虚拟内存常遇问题
  4. #16192董哥授课的CCNP交换部分总结(三)
  5. dvbbs 7.1版块图标感应渐变效果 From www.jfeng.cn
  6. 【雷达】Tracking radar targets with multiple reflection points
  7. 三、地址族与数据序列
  8. 9.21 小程序开发培训讲座
  9. 通过配置IP SLA跟踪静态路由
  10. 深入了解基于容器的红帽PaaS和OpenShift