创建不能改变大小的对话框

来源:互联网 发布:移动网络玩dnf组队卡 编辑:程序博客网 时间:2024/05/18 18:54

原文:http://blog.csdn.net/shining100/article/details/5383670

 在我们开发的过程中,需要实现大量的弹出式对话框。其中有一些对话框由于在响应WM_SIZE消息时没有移动相应控件的位置,导致了在改变对话框的大小后,对话框中的控件并不会随着窗体大小的改变而移动位置。解决这个问题有两个方法:一是在WM_SIZE消息中添加相应的处理代码,使控件随着窗口大小的改变而移动其位置和调整其大小。二就是创建不能改变大小的对话框。至于选择哪一种方法则要根据具体的要求而定,个人认为程序的主对话框需要使用方法一,而程序的一些提供给用户输入的弹出对话框,我认为使用第二种方法更加的方便。下面让我们来看看第二种方法的实现方法。

      对话框的外观是由窗体样式(Windows Styles)决定的,通过定义窗体样式,我们可以指定对话框中是否有标题栏、是否有滚动条以及是否可以改变对话框的大小等。窗体样式是一个32位的字段值,我们可以通过标志组合的方法,来定义自己的窗体样式。比如你组合下列标志: WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXMIZEBOX,就可以创建一个带有标题栏、系统目录、最小化按钮以及最大化按钮的可以改变大小的对话框。所以,如果你想创建一个不能改变大小的对话框,只需要将WS_THICKFRAME和WS_MAXMIZEBOX标志去除即可。

      明白了创建不能改变大小对话框的原理后,下面让我们再来看看用什么方法可以创建一个不能改变大小的对话框。方法一是通过使用资源编辑器,讲对话框的Border属性设置为Dialog Frame,然后将Maxmize Box属性设为False,这也是资源编辑器在插入一个对话框时候的默认设置。该方法最为简单,但是该方法无法实现在程序中动态改变对话框的大小。方法二是使用GetWindowLong函数和SetWindowLong函数,我们使用GetWindowLong函数获取对话框所有的窗口样式,然后通过位操作去掉WS_THICKFRAME和WS_MAXMIZEBOX标志位,最后再通过SetWindowLong函数设置新的窗口样式到原来的窗口上即可。应该注意的是我们应该在窗口初始化的时候执行上述操作,即我们应该将代码添加到处理WM_INITDIALOG消息的对话框过程中。如果使用WIN32式的经典编程方法,则代码如下所示。

[cpp:nogutter] view plaincopy
  1. BOOL CALLBACK DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     switch(msg)  
  4.     {  
  5.     case WM_INITDIALOG:  
  6.         DWORD dwStyle;  
  7.     dwStyle = GetWindowLong(m_hWnd, GWL_STYLE);  
  8.     dwStyle &= ~WS_THICKFRAME;  
  9.         dwStyle &= ~WS_MAXMIZEBOX  
  10.     ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);  
  11.         return TRUE;  
  12.         }  
  13.     return FALSE;  
  14. }  
 

如果使用的是MFC的话,则可以将代码添加到OnInitDialog函数中,代码如下所示。

[cpp] view plaincopy
  1. BOOL CXXDlg::OnInitDialog()  
  2. {  
  3.     CDialog::OnInitDialog();  
  4.     SetIcon(m_hIcon, TRUE);           
  5.     SetIcon(m_hIcon, FALSE);  
  6.       
  7.         DWORD dwStyle;  
  8.     dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);  
  9.     dwStyle &= ~WS_THICKFRAME;  
  10.     dwStyle &= ~WS_MAXSIZEBOX;  
  11.     ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);  
  12.           
  13.         return TRUE;  
  14. }  
 

方法三就是使用MFC中的CWnd类中的ModifyStyle函数,代码如下所示。

[cpp] view plaincopy
  1. BOOL CXXDlg::OnInitDialog()  
  2. {  
  3.     CDialog::OnInitDialog();  
  4.     SetIcon(m_hIcon, TRUE);           
  5.     SetIcon(m_hIcon, FALSE);  
  6.       
  7.         ModifyStyle(WS_THICKFRAME, 0);  
  8.         ModifyStyle(WS_MAXSIZEBOX, 0);  
  9.           
  10.         return TRUE;  
  11. }  
方法三: 

在VS2010中对话框默认border  值是:Resizing  我们把它改为:Dialog Frame 就可以了