如何有效的使用对话框?

类别:VC语言 点击:0 评论:0 推荐:
 

如何有效的使用对话框?
译者:徐景周(原作:VGirish)

Q:如何在对话框中加入工具条

     在 OnInitDialog 中加入下面代码:

 

  BOOL CYourDlg::OnInitDialog()

  {

       CDialog::OnInitDialog();    

 

       // Create the toolbar. To understand the meaning of the styles used, you

       // can take a look at the MSDN for the Create function of the CToolBar class.

       ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_BORDER_BOTTOM);

 

      // I have assumed that you have named your toolbar's resource as IDR_TOOLBAR1.

      // If you have given it a different name, change the line below to accomodate

      // that by changing the parameter for the LoadToolBar function.

      ToolBar.LoadToolBar(IDR_TOOLBAR1);

 

      CRect rcClientStart;

      CRect rcClientNow;

      GetClientRect(rcClientStart);

 

      // To reposition and resize the control bar

      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,0, reposQuery, rcClientNow);

     CPoint ptOffset(rcClientNow.left - rcClientStart.left,rcClientNow.top-rcClientStart.top);

 

     CRect rcChild;

     CWnd* pwndChild = GetWindow(GW_CHILD);

 

     while (pwndChild)

     {

       pwndChild->GetWindowRect(rcChild);

       ScreenToClient(rcChild);

       rcChild.OffsetRect(ptOffset);

       pwndChild->MoveWindow(rcChild, FALSE);

       pwndChild = pwndChild->GetNextWindow();

     }

 

     CRect rcWindow;

     GetWindowRect(rcWindow);

     rcWindow.right += rcClientStart.Width() - rcClientNow.Width();

     rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();

     MoveWindow(rcWindow, FALSE);  

 

     // And position the control bars

     RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

 

     return TRUE;  // return TRUE  unless you set the focus to a control

  }

    

Q:如何改变对话框的形状?

    可用下面一些涵数:

     CreatePolygonRgn
     CreateRectRgn
     CreateRoundRectRgn
等.

  CRgn m_rgn;  // Put this in your dialog's header file. i.e. a member variable

 

  // This Gets the size of the Dialog: This piece of code is to be placed in the

  // OnInitDialog Function of your dialog.

 

  CRect rcDialog

  GetClientRect(rcDialog);

 

  // The following code Creates the area and assigns it to your Dialog

  m_rgn.CreateEllipticRgn(0, 0, rcDialog.Width(), rcDialogHeight());

  SetWindowRgn(GetSafeHwnd(), (HRGN) m_rgn, TRUE);

Q:如何实现非客户区移动?

    可用下面二种方法:

 

  // Handler for WM_LBUTTONDOWN message

 

  void CYourDialog::OnLButtonDown(UINT nFlags, CPoint point)

  {

     CDialog::OnLButtonDown(nFlags, point);

     PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y));

  }

 

  // Handler for WM_NCHITTEST message

 

  LONG CYourDialog::OnNcHitTest( UINT uParam, LONG lParam )

  { 

     int xPos = LOWORD(lParam);

     int yPos = HIWORD(lParam);

     UINT nHitTest = CDialog::OnNcHitTest(CSize(xPos, yPos));

     return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;

  }

 

Q:如何使对话框初始为最小化状态?

    在 OnInitDialog 中加入下面代码:

  SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, NULL);

Q:如何限定对话框大小范围?

    在 WM_SIZING中加入下面代码:

 

  void CYourDialog::OnSizing(UINT fwSide, LPRECT pRect)

  {

     if(pRect->right - pRect->left <=200)

         pRect->right = pRect->left + 200;

        

     if(pRect->bottom - pRect->top <=200)

         pRect->bottom = pRect->top + 200;

 

     CDialog::OnSizing(fwSide, pRect);

  }

 

Q:如何在对话框中加入状态条?

     定义 CStatusBar 变量:

  CStatusBar m_StatusBar;

     定义状态条指定状态:

  static UINT BASED_CODE indicators[] =

  {

     ID_INDICATOR_CAPS,

     ID_INDICATOR_NUM

  };

     在 OnInitDialog 中加入下面代码:

 

  m_StatusBar.CreateEx(this,SBT_TOOLTIPS,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,AFX_IDW_STATUS_BAR);

  // Set the indicators namely caps and nums lock status

  m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));

 

  CRect rect;

  GetClientRect(&rect);

                

  m_StatusBar.SetPaneInfo(0,ID_INDICATOR_CAPS,SBPS_NORMAL,rect.Width()/2);

  m_StatusBar.SetPaneInfo(1,ID_INDICATOR_NUM,SBPS_STRETCH ,rect.Width()/2);

 

  RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,ID_INDICATOR_NUM);

 

  m_StatusBar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));

本文地址:http://com.8s8s.com/it/it2307.htm