CWND窗口类

来源:互联网 发布:linux 用户文件 编辑:程序博客网 时间:2024/05/17 06:07

CDialog的成员函数:

  1. 构造函数:

     

    CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );

    CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );

    CDialog( );

    CDialog重载了三个构造函数。其中,第三个是缺省构造函数;第一个和第二个构造函数从指定的对话框模板资源创建,pParentWnd指定了父窗口或所属窗口,若空则设置父窗口为应用程序主窗口。

     

  2. 初始化函数

     

    BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );

    BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );

    BOOL CreateIndirect( LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL );

    BOOL CreateIndirect( HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL );

    BOOL InitModalIndirect( LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL );

    BOOL InitModalIndirect( HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL );

    Create用来根据模板创建无模式对话框;CreateInDirect用来根据内存中的模板创建无模式对话框;InitModalIndirect用来根据内存中的模板创建模式对话框。它们都提供了两个重载版本。

     

  3. 对话框操作函数

     

    void MapDialogRect( LPRECT lpRect ) const;

    void NextDlgCtrl( ) const;

    void PrevDlgCtrl( ) const;

    void GotoDlgCtrl( CWnd* pWndCtrl );

    void SetDefID( UINT nID );

    void SetHelpID( UINT nIDR );

    void EndDialog( int nResult );

     

  4. 虚拟函数 virtual int DoModal( );

virtual BOOL OnInitDialog( );

virtual void OnSetFont( CFont* pFont );

virtual void OnOK( );

virtual void OnCancel( );

 

用来管理对话框控件的CWnd成员函数

CheckDlgButton 选中或不选中按钮控件。

CheckRadioButton 选择一个指定的单选按钮并使同组内的其它单选按钮不被选择。

DlgDirList 往一个列表框中添加文件、目录或驱动器的列表。

DlgDirListComboBox 往一个组合框中的列表框内添加文件、目录或驱动器的列表。

DlgDirSelect 从一个列表框中获得当前选择的文件、目录或驱动器。

DlgDirSelectBomboBox 从一个组合框中获得当前选择的文件、目录或驱动器。

GetCheckedRadioButton 返回指定的单选按钮组中被选择的单选按钮的ID。

GetDlgItem 返回一个指向一给定的控件的临时对象的指针。

GetDlgItemInt 返回在一个指定的控件中由正文表示的数字值。

GetDlgItemText 获得在一个控件内显示的正文。

GetNextDlgGroupItem 返回一个指向一组控件内的下一个或上一个控件的临时对象的指针。

GetNextDlgTabItem 返回下一个tab顺序的控件的临时对象的指针。

IsDlgButtonChecked 返回一个按钮控件的状态。

SendDlgItemMessage 把一个消息传送给一个控件。

SetDlgItemInt 将一个整数转换为正文,并将此正文赋给控件。

SetDlgItemText 设置一个控件显示的正文。

CWinThread::m_pMainWnd:保存指向应用程序的主窗口指针。

CWinThread::GetMainWnd:查询指向线程主窗口的指针。

CWinThread::InitInstance:重载以实现线程实例的初始化。

AfxGetApp:获得指向CWinApp对象的指针。

AfxGetInstanceHandle:获得当前应用程序实例的句柄。
AfxGetResourceHandle:获得应用程序资源的句柄。
AfxGetAppName:获得一个字符串指针,其中包含了应用程序的名字。另外,如果你拥有一个指向CWinApp对象的指针,可以通过m_pszExename来获得应用程序的名字。
CDocument::IsModified:标识文档从最近一次保存以来是否被修改过。
CDocument::UpdateAllViews:通知所有视图文档已被修改的消息。
CWnd::m_hWnd:指明与这个CWnd对象相关联的HWND句柄。
CWnd::Create:创建并初始化与CWnd对象相关联的子窗口。
CWnd::PreCreateWindow:在与CWnd对象相关联的窗口被创建之前调用。
CWnd::IsWindowEnabled:确定一个窗口是否允许鼠标和键盘输入。
CWnd::EnableWindow:允许或禁止鼠标和键盘输入。
CWnd::SetWindowPos:改变子窗口、弹出窗口和顶层窗口的大小、位置以及顺序。
CWnd::GetDlgItem:获得指定的对话框中具有指定ID的控件。
CWnd::UpdateData:初始化对话框或获得对话框中的数据。
CWnd::GetWindowRect:获得CWnd的屏幕坐标。
CWnd::GetDC:获得客户区的设备环境。
CWnd::RedrawWindow:更新客户区中的指定矩形或区域。
CWnd::UpdateWindow:更新客户区。
CWnd::Invalidate:使整个客户区无效。
CWnd::ShowWindow:显示或隐藏窗口。
CWnd::ClientToScreen:将给定点或显示器上矩形的客户区坐标转换为屏幕坐标。
CWnd::ScreenToClient:将给定点或显示器上矩形的屏幕坐标转换为客户坐标。
CWnd::SetWindowText:将窗口的文本或标题文字(如果有)设为指定的文本。
CWnd::SetFont:设置当前字体。
CWnd::GetDlgItemInt:将给定对话框中控件的文本转换为整数。
CWnd::SetTimer:安装一个系统定时器,当它被激活时,发送一个WM_TIMER消息。
CWnd::KillTimer:销毁一个系统定时器。
CWnd::FlashWindow:使窗口闪烁一次。
CWnd::MessageBox:创建并显示一个窗口,其中包含了应用程序提供的消息和标题。

MFC

窗口:

 重叠窗口(Overlapped),弹出窗口(Popup),子窗口(Child)
 
 MFC窗口不对窗口进行直接的控制,而在API环境中却是可以的。如果不能在API环境中实现某项功能,那么
 肯定也不能在MFC环境中实现。举例来说,MFC库的CWnd可以创建一个窗口,但它只是过去在API环境中使用
 API调用的封装。
 
 创建MFC窗口是复杂的,首先,创建类CWnd的一个实例,然后调用类CWnd的一个成员函数,该成员函数调用
 API中的CreateWindow()函数。返回的窗口句柄保存在类CWnd的成员变量m_hWnd中
 
 注:因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的。因此,窗口句柄并非直接
 指向窗口对象,而是指向跟踪窗口对象地址的另一个指针。
 
 销毁窗口同样复杂,必须确保销毁了该窗口对象,以及封装该窗口对像的CWnd实例。
 
 
怎样应用MFC创建一个窗口:
CWnd wnd
BOOL b=wnd.CreateEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,parent,Menu,param);

第一行代码创建了一个CWnd类的对象,第二行通过调用Windows API函数CreateWindowEx创建了真正的
窗口。
HWND hwnd=::CreateWindowEx(Exstyle,ClassName,WindowName,Style,x,y,Width,Height,Parent,
                           meun,instance,Param);
                          
      因为CWnd类只是封装了用于创建窗口的Window API函数(CreateWindowEx()),因此,从本质上讲,
      创建窗口所必须的参数在API环境和MFC环境中是相同的;
     
      参数style和Exstyle决定窗口的"外观"和类型(重叠,弹出,子窗口).
      参数ClassName决定在创建窗口时使用的窗口类
      参数WindowName决定窗口标题内容
      参数x,y,Width,Height决定窗口的位置的大小.
      参数parent指向拥有该窗口的窗口指针
      参数Menu指向内存中的一个对象,作为它的菜单使用----除非创建一个子窗口,如果是这样的话
               ,那么该参数是帮助父窗口识别子窗口的IDnumber
      参数Instance识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确的应用程序
                   的消息队列中。CWnd类填入Instance参数
      参数param是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结构指针
      返回的hwnd参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该窗口数返回值为NULL
      窗口句柄自动地保存在CWnd类的m_hWnd成员变量中.
     
       参数规则:
       a.窗口名称参数
         该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容。如果窗口没有标题
         栏,该参数可以为0
           然而,某些通过控件也使用该参数。例如,按钮控件把该参数的内容放在按钮的表面。在
           创建窗口标题栏后,可以用类CWnd的成员函数SetWindowText(),来改变窗口标题栏的名
           称.
       b.风格和扩展风格参数
         这两个是32位的参数,用来指定创建什么类型的窗口。可以选择多种类型,如下面的例子所示:
         .WS_CHILD|WS_VISIBLE
          
           窗口风格参数的作用包括:
          
               用于创建三种基本窗口类的风格,用WM_CHILD创建一个子窗口;用 WM_POPUP创建一个弹出
               窗口,WM_OVERLAPPED创建一个重叠窗口。如果不为窗口指定任何一种风格,那么窗口风格
               默认为WM_OVERLAPPED.
              
               用以增添窗口的非客户区特色的风格。例如可用WS_VSCROOLL窗口添加一个垂直滚动条.
              
               由每个通用控件定义的风格。例如,BS_FLAT按钮风格告诉按钮控件绘制一个二维按钮
              
               用来标识控件组起始控件的风格,或者当用户敲击Tab键控制焦点在窗口中变化时,用
               来指示哪个控件有资格获得输入焦点的风格.
              
              
               在创建窗口以后,可以用CWnd的成员函数ModifyStyle()和ModifyStyleEx()改变窗口
               风格。某些风格可能要求重画窗口,这时,可以给ModifySytle()函数添加三第三个参
               数,自动激发类CWnd成员函数SetWindowPos()做重画工作。
              
               CWnd wnd;
               wnd.ModifyStyle(0,WS_BORDER,SWP_NOZORDER);
              
    事实上,给MOdifyStyle()或给MOdifyStyleEx()添加任何第三个参数,都要添加下面
    的SetWindowpos()选项:SWP_NOZORDER,SWP_NOMOVE,SWP_NOACTIVATE,SWP_SHOW.
    
  
  c.X和Y位置参数
  
              这是两个32位的参数,用于以象素为单位指定窗口的位置。创建重叠窗口和弹出窗口时,
              X和Y是相对于桌面窗口左上角的位置。而创建子窗口时,X和Y是相对于父窗口客户区的左
              上角位置。如果把X和Y参数都设置为CW_USEDEFAULT,那么系统将自动为窗口选定一个位置。
             
              然而,如果X和Y参数都设置为CW_USEDEFFAULT,那么子窗口在创建的时候,总被创建在
              (0,0)的位置
              创建窗口以后,可以用类CWnd的成员函数MoveWindow()移动窗口
             
           d.宽度和高度参数
           
              这是两个32位的参数,用于以像素为单位指定窗口的大小。如果将参数Width和Heihght都
              设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小。然而,对于
              一个子窗口来说,系统系统将创建一个长和宽为0的窗口。如果窗口的风格是WS_MINIMIZE
              或WS_MAXIMIZE,那么系统将忽视用户为Width和Height设置的任何值。
              创建窗口以后,可以用类CWnd的成员函数MoveWindow()重新设置窗口的大小。
             
           e.Z_Order
          
              当几个窗口占据屏幕上同一区域时,Z_Order决定哪个窗口显示在哪个窗口之上。
              创建窗口后,可以用CWnd的成员函数SetWindowPos()改变窗口Z的顺序
             
           f.父窗口或物主窗口参数
           
             该参数是指向类CWnd对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口。
            
             如果创建的是一个子窗口,那么用该参数来标识它的父窗口,该值不能为NULL。子
             窗口只能出现在它的父窗口里面,当父窗口被销毁时它他们也被销毁;物主窗口最
             小化时,则从属窗口被隐藏;但当物主窗口被隐藏时,从属窗口并不被隐藏
            
            
      
      怎么使用MFC销毁一个窗口
     
           删除一个MFC窗口可能有些烦琐,必须按下面的顺序删除两个对象:
          
           pWnd->DestroyWindow();//destroys window Object
           delete pWnd;          //destroys Cwnd Object
          
              也可以只删除CWnd对象,因为DestroyWindow()是从CWnd的析构函中调用中,但不提倡
              使用这种方法。销毁一个窗口而不先调用DestroyWindow()函数,将使某些析构消息不能
              被任何从CWnd派生的类处理。你几乎不需自己销毁一个窗口,用户或系统通常会做这项
              工作。如果需要在销毁窗口的同时销毁CWnd对象,则应该在CWnd的派生类中添加下面的
              重载函数:
                       CYourWnd::PostNcDestroy()
                       {
      delete this;
                       }      
               PostNcDestroy()是销毁窗口前调用的最后一个成员函数。但是,几乎不需要对该函数
               进行重载,因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的.
              
              
              
         捆绑到一个已有的窗口
        
             如果一个窗口是用Windows API在应用程序建立之前或外面创建的,并且需要把它封装到CWnd
             类中,可以用下面的语句实现:
              CWnd wnd;
              wnd.Attach(hwnd);
              这里的hwnd是已有窗口的句柄。Attach()只是把CWnd 的成员变量m_hWnd赋给hwnd.
             
              也可以使用CWnd::Fromhandle(hwnd),它查看是否有CWnd对象已经封装了该窗口句柄并
              返回该CWnd对象的指针。如果不存在这样的CWnd对象,将创建一个临时对象。如果是临时
              对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除。
             
       
       
        窗口类:
       
           一个窗口类不是一个C++类,而是早于并存在C++之外的窗口专用的类。窗口类的作用就像一个
           模板,可以由此创建其它窗口,并可以共享某些特征,包括下面所示的特征:
          
           类风格        包括能给予窗口的一些微小的特征
           类图标        如果窗口有图标,用它来指定窗口中显示的菜单
           类菜单        如果窗口有菜单,用它来指定窗口中显示的菜单
           类光标        当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状
           背景色        定义用什么颜色来擦除窗口的背景色。窗口的客户区将显示该颜色
           窗口进程      定义处理任何发送到该窗口的消息时应该调用的函数。定义窗口进程
                          可能是类唯一最重要的前提
                         
                         
                         
           窗口进程:
          
                     窗口与环境的交互是通过发送的接收消息实现的。如果系统要求窗口自己进行绘制
                     ,系统给它发送一个WM_PAINT消息;如果系统要求窗口销毁自己,则发送一个WM_
                     DESTROY消息。这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中
                     定义。对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进
                     程进行处理。
                    
                    
                    
                    
          怎样使用MFC创建一个窗口类:
         
                   当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个WNDCLASS
                   结构。系统为每个窗口类类型维护一个列表:
                  
                   系统全局类(System Global Class) 在系统启动时注册,且必须注册,对所有应用程序
                   都有效
                   
                   系统程序全局类(Application Global Class)由应用程序注册,只对应用程序及应用
                   程序的线程有效
                  
                   应用程序局部类(Application Local Class)由应用程序注册,并只对注册它们的应用
                   程序或DLL有效
                  
                   当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后
                   搜索系统全局类
                  
                  
                      要创建一个窗口类,可以及先创建WNDCLASS结构的实例,然后用MFC类库的
                      AfxRegisterClass()注册它。也可以用MFC类库的AfxRegisterWndClass()来创建一个
                      基于调用参数的WNDCLASS对象
                     
                 
                 
    使用AfxRegisterWndClass()函数注册一个窗口类:
   
        AfxRegisterWndClass()函数在使用上是非常自动化的,一些通常需要你提供的参数都能自己
        填入,甚至连新的窗口类的名字也能自动产生。
       
        LPCTSTR lpszClassName=AfxRegisterWndClass(UINT nClassStyle,HCURSOR hCursor=0,
                 HBRUSH hbrBackground=0,HICON hIcon=0);
                
        这些参数的使用规则如下:
       
          a. 类名:
          
            根据传给该函数的参数,为新的窗口类产生名字。如果说传输的参数完全相同,那么创建
            的窗口类也将完全相同。如果需要创建新的窗口类,可以用AfxRegisterClass()        
                 
          b.风格
            
             窗口类风格由下面选项列表中一系列标记的或(OR)运算提供:
            
             CS_OWNDC       为该窗口类创建的线个窗口分配唯一的设置环境
             CS_CLASSDC     分配一个设备环境给所有由该窗口类创建的窗口使用
             CS_SAVEBITS    由该类创建的任何窗口的视频存储区将被保存,以便窗口移动或关闭时,
                            不需要重画基础窗口----这对快速机器来说作用不大.
                           
             CS_BYTEALLGNCIENT     当计算机的显示卡和CPU速度较慢时,这两种风格有用。添加这些风格后,当                                 
             CS_BYTEALLGNWINDOW    窗口在字节边缘时,显示卡更容易移动窗口
            
             CS_GLOBALCLASS       如果设置该风格,则该类是应用程序的全局类,否则它是一个应用程序局部类
             CS_VREDRAW      如果设置了垂直风格,并且窗口的垂直大小发生了变化,则整个窗口被重画
             CS_HREDRAW           水平风格也这样
             CS_NOCLOSE           禁用系统菜单中的关闭命令
             CS_DBLCLKS           如果未           
                                           

原创粉丝点击