精华内容
下载资源
问答
  • 如果你想显示一个模态对话框,你需要先将所有者窗口禁用,然后启用模态对话框,当关闭一个模态对话框时,则要确保严格按照相反的流程来进行。 为什么要按照这样的流程呢? 如果你没有按照正确的顺序启用或禁用窗口...

    调用顺序很重要

    如果你想显示一个模态对话框,你需要先将所有者窗口禁用,然后启用模态对话框,当关闭一个模态对话框时,则要确保严格按照相反的流程来进行。

    为什么要按照这样的流程呢?

    如果你没有按照正确的顺序启用或禁用窗口,则窗口的输入焦点可能会被搞乱。
    如果关闭了一个模态对话框,你可能想要这样做:
    > 关闭并销毁模态对话框
    > 重新启用所有者窗口

    但是,如果你按照上面的顺序操作的话,你会发现:所有者窗口将不会像正常的那样在前景激活。它会随机地激活一些其他的窗口。可以显式的调用激活函数来解决这个问题,但是,这种做法会带来窗口的闪烁,并且窗口的Z序也乱了。

    到底发生了什么?

    当你销毁一个模态对话框时,你是在销毁一个前景激活的窗口。Windows窗口管理器需要找到下一个被激活的窗口。它首先会尝试激活模态对话框的所有者窗口,但是此时所有者窗口被禁用了。
    这个时候,Windows窗口管理器会跳过所有者窗口并寻找系统中其他未被激活的窗口。这就是导致出现上述现象的原因。

    那么,应该怎么做?

    正确的销毁模态对话框的流程如下:
    > 启用模态对话框所有者窗口
    > 销毁模态对话框

    这次,当我们的模态对话框被销毁时,Windows窗口管理器发现所有者窗口是已启用状态,所以它就会将输入焦点设置到所有者窗口并将它激活为前景窗口。

    总结

    按照上面提到的顺序,可以避免诸如界面闪烁,输入焦点混乱的问题。虽然是一个小知识点,但是也值得一试。

    最后

    Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
    本文来自:《The correct order for disabling and enabling windows》

    关闭模态对话框的正确顺序

     

    展开全文
  • 显示和关闭对话框

    千次阅读 2016-08-16 18:23:04
    一、显示对话框 1.显示模式对话框: CDialogDemo dlg; dlg.DoModal(); 2.显示非模式对话框: CDialogDemo *dlg=new CDialogDemo(this); dlg->Create(IDD_GENERAL_CONTROL);...二、关闭对话框: 1.CDialog::

    一、显示对话框

    1.显示模式对话框:

    CDialogDemo dlg;
    dlg.DoModal();

    2.显示非模式对话框:

    CDialogDemo *dlg=new CDialogDemo(this);
    dlg->Create(IDD_GENERAL_CONTROL);
    dlg->ShowWindow(SW_SHOW);


    二、关闭对话框

    1.CDialog::OnOK();   //确定按钮按下         CDialog::OnCancel(); //取消按钮被按下

    2.CDialog::DestoryWindow();  

    3.CDialog::EndDialog(0);  

    4.CDialog::CloseWindow();     仅仅是最小化对话框

    5.向父窗口发送WM_CLOSE消息,然后自己关闭自己的窗口。

    获取将父窗口的句柄直接传给子窗口,然后子窗口可以直接关闭父窗口.

    AfxGetMainWnd()->PostMessage/SendMessage(WM_CLOSE);

    6.直接通过exit(0),ExitProcess(0);//不好的用法


    三、在模态对话框类中关闭自身对话框
    可以在模态对话框类中通过PostMessage(WM_CLOSE)来关闭自身对话框。关闭MessageBox对话框后模态对话框随之关闭。

    相关代码如下:

     1  BOOL CImportDataPromptDialog::OnInitDialog()
     2  {
     3      CDialog::OnInitDialog();
     4 
     5       //  TODO:  Add extra initialization here
     6      HANDLE hThread  =  StartImportDataThread();
     7       if  ( ! hThread)
     8      {
     9          LOG( " 启动导入数据线程失败 " )
    10      }
    11 
    12       return  TRUE;   //  return TRUE unless you set the focus to a control
    13       //  EXCEPTION: OCX Property Pages should return FALSE
    14  }
    15 
    16  DWORD WINAPI CImportDataPromptDialog::ImportDataThread(LPVOID Param)
    17  {
    18      CImportDataPromptDialog *  importDlg  =  (CImportDataPromptDialog * )Param;
    19 
    20       if  (CImportLog::ExtractionXMLData(importDlg -> m_sXmlFilePath, importDlg -> m_sDBPath))
    21      {
    22          importDlg -> MessageBox( " 导入数据成功 " , " 平台 " , MB_ICONINFORMATION);
    23          importDlg -> PostMessage(WM_CLOSE);
    24      }
    25       else
    26      {
    27          importDlg -> MessageBox( " 导入数据失败 " , " 平台 " , MB_ICONEXCLAMATION);
    28          importDlg -> PostMessage(WM_CLOSE);
    29      }
    30      
    31       return   0 ;
    32  }
    33 
    34  HANDLE CImportDataPromptDialog::StartImportDataThread()
    35  {
    36      LOG( " 启动导入数据线程 " );
    37      CWinThread *  hThread  =  AfxBeginThread((AFX_THREADPROC)CImportDataPromptDialog::ImportDataThread,(LPVOID) this );
    38 
    39       return  (hThread -> m_hThread);
    40  }


    相关函数详解:

    CloseWindow 
    函数功能:该函数最小化指定的窗口,但并不销毁该窗口。
      函数原型:BOOL CloseWindow(HWND hWnd);
      参数:
      hWnd:将要最小化的窗口的句柄。
      返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
      备注:窗口尺寸被最小化成一个图标,并移动到屏幕的图标区域。系统显示窗口的图标而不显示窗口,并在图标下显示窗口标题。应用程序必须使用DestroyWindow函数销毁窗口。

    DestroyWindow  
    函数功能:销毁指定的窗口。这个函数通过发送WM_DESTROY 消息和 WM_NCDESTROY 消息使窗口无效并移除其键盘焦点。这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。
      函数原型:BOOL DestroyWindow( HWND hWnd // handle to window to destroy);
      hWnd :将被销毁的窗口的句柄。
      返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
      备注:一个线程不能使用本函数销毁别的线程创建的窗口。如果这个窗口是一个不具有WS_EX_NOPARENTNOTIFY 样式的子窗口,则销毁窗口时将发WM_PARENTNOTIFY 消息给其父窗口。
      Windows CE: 本函数将不发送 WM_NCDESTROY 消息.

    EndDialog  
    函数功能:该函数清除一个模态对话框,并使系统中止对对话框的任何处理。
      函数原型:BOOL EndDialog(HWND hDlg,int nResult);
      参数:
      hDlg:表示要被清除的对话框窗口。
      NResult:指定从创建对话框函数返回到应用程序的值。
      返回值:如果函数调用成功,则返回值为非零值;如果函数调用失败则返回值为零。若想获得错误信息请调用GetLastError函数。
      备注:由DialogBox,DialogBoxParam、DialogBoxlndirect和DialogBoxlndirectParam函数创建的对话框一定要用EndDialog函数来清除。应用程序从对话框应用程序内部调用EndDialog函数,该函数不能为其他目的而供使用。对话框应用程序可以在任何时间调用EndDialog函数;甚至在WM_INITDIALOG消息处理过程中。如果应用程序在WM_INTDIALOG消息处理过程中调用该函数,则对话框在显示和输入焦点被设置之前对话框被清除。EndDialog函数并不立即清除对话框。而是设置一个标志,并且允许对话框应用程序把控制权返回系统。系统在试图从应用程序队列检索下一个消息之前检测标志。如果已经设置了标志则系统中止消息循环,清除对话框,且用nResUlt中的值作为从创建对话框的函数中返回的值。


    展开全文
  • ,结果用户输入空值时对话框还是会关闭正确做法如下: 先设置自定义对话框的属性: autoClose: false 然后当用户输入正确的值时 $.closeModal(); 关闭对话框。 转载于:https://www.cnblo...

    如果我们在对话框给用户输入值时,当用户输入空值点击确定按钮时,应该给个提示然后让用户继续输入。

    如果在方法里使用 return false;,结果用户输入空值时对话框还是会关闭。正确做法如下:

    先设置自定义对话框的属性:

    autoClose: false

    然后当用户输入正确的值时

    $.closeModal();

    关闭对话框。

     

    转载于:https://www.cnblogs.com/GGDong/p/10995520.html

    展开全文
  • vc 关闭对话框几种方法

    千次阅读 2015-07-26 09:55:51
    vc 关闭对话框几种方法注:以下代码以一个名为CTest6Dlg的对话框类为例 在任务栏隐藏对话框 ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);使对话框为顶层窗口 SetWindowPos(&this->wndTopMost, 0, 0, 0, 0...

    转自:http://blog.csdn.net/j6915819/article/details/8664567
    vc 关闭对话框几种方法

    注:以下代码以一个名为CTest6Dlg的对话框类为例

    1. 在任务栏隐藏对话框
      ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

    1. 使对话框为顶层窗口
      SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

    1. 在运行时添加最大化,最小化按钮
      SetWindowLong(this->m_hWnd, GWL_STYLE,
      GetWindowLong(this->m_hWnd, GWL_STYLE) |
      WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
      UpdateWindow();

    1. 使能对话框右上角关闭按钮
      在OnInitDialog中
      方法一:
      CMenu* menu = GetSystemMenu(FALSE);
      menu->ModifyMenu(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED );
      方法二:
      CMenu* menu = GetSystemMenu(FALSE);
      menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);

    1. 当对话框一部分在屏幕外时,显示全部对话框
      SendMessage(DM_REPOSITION);

    1. 改变鼠标外形
      添加 WM_SETCURSOR 消息映射函数
      BOOL CTest6Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
      {
      SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HELP));
      return 0;
      }

    1. 改变对话框背景色和文本颜色
      在CTest6App的InitInstance中添加
      SetDialogBkColor(RGB(255,0,0), RGB(0,255,0));

    1. 改变对话框caption上的图标
      导入自己的图标资源到工程中,把原来ID为 IDR_MAINFRAME 的资源删除,把新的图标的ID命名为IDR_MAINFRAME

    1. 在主对话框显示前,显示一个login对话框
      BOOL CTest6App::InitInstance()
      {
      //…
      int nResponse;
      CLoginDlg loginDlg;
      nResponse = loginDlg.DoModal();
      if (nResponse == IDOK)
      {
      }
      if (nResponse == IDCANCEL)
      {
      return FALSE;
      }

         CTest6Dlg dlg;
         m_pMainWnd = &dlg;
         int nResponse = dlg.DoModal();
         if (nResponse == IDOK )
         {
         }
         else if (nResponse == IDCANCEL)
         {
         }
         return FALSE;
      

      }
      然后重载CLoginDlg对话框的哦OnOK(),在其中判断条件
      void CLoginDlg::OnOK()
      {
      if (条件满足)
      CDialog::OnOK();
      else
      AfxMessageBox(_T(“invalid password!”));
      }


    1. 在对话框中添加工具栏
      方法一:添加以下代码到 OnInitDialog 中

      if ( !m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1) )
      {
      TRACE0(“Failed to Create Dialog Toolbar/n”);
      EndDialog(IDCANCEL);
      }
      CRect rcClientOld; // 久客户区RECT
      CRect rcClientNew; // 加入TOOLBAR后的CLIENT RECT
      GetClientRect(rcClientOld); //
      // Called to reposition and resize control bars in the client area of a window
      // The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.
      // And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.
      //重新计算RECT大小
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
      AFX_IDW_CONTROLBAR_LAST,
      0,
      reposQuery,
      rcClientNew);
      // All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
      //所有的子窗口将被移动,以免被TOOLBAR覆盖
      // Offest to move all child controls after adding Tollbar
      //计算移动的距离
      CPoint ptOffset(rcClientNew.left-rcClientOld.left,
      rcClientNew.top-rcClientOld.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); // 得到对话框RECT
      rcWindow.right += rcClientOld.Width() - rcClientNew.Width(); // 修改对话框尺寸
      rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
      MoveWindow(rcWindow,FALSE); // Redraw Window
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
      方法二:
      http://www.codeproject.com/dialog/dlgtoolstatusbar.asp


    11.响应对话框的最大化、最小化、关闭、恢复事件
    方法一:添加 WM_SYSCOMMAND 消息映射函数
    void CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ( (nID & 0xFFF0) == IDM_ABOUTBOX )
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    if ( nID == SC_MAXIMIZE )
    {
    AfxMessageBox(_T(“最大化”));
    }
    else if ( nID == SC_MINIMIZE )
    {
    AfxMessageBox(_T(“最小化”));
    }
    else if ( nID == SC_CLOSE )
    {
    AfxMessageBox(_T(“关闭”));
    }
    CDialog::OnSysCommand(nID, lParam);
    }
    方法二:添加 WM_SIZE 消息映射函数
    void CTest6Dlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialog::OnSize(nType, cx, cy);
    if ( nType == SIZE_MAXIMIZED )
    {
    AfxMessageBox(_T(“最大化”));
    }
    else if ( nType == SIZE_MINIMIZED )
    {
    AfxMessageBox(_T(“最小化”));
    }
    else if ( nType == SIZE_RESTORED )
    {
    AfxMessageBox(_T(“恢复”));
    }
    }


    12.代码实现窗口最小化,最大化,关闭
    PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);
    PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
    PostMessage(WM_SYSCOMMAND, SC_CLOSE);


    13.按下ESC和ENTER键时禁止关闭对话框

     方法一:
      (1) 重载OnCancel和OnOk,屏蔽其中的CDialog::OnCancel()和CDialog::OnOk();
      (2) 添加以下代码 
      void CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam)
      {
          if ((nID & 0xFFF0) == IDM_ABOUTBOX)
           {
              CAboutDlg dlgAbout;    //if you have an about dialog
               dlgAbout.DoModal();
           }
           else if ((nID & 0xFFF0) == SC_CLOSE)
           {
               //用户点击右上角"X"
               EndDialog(IDOK);  
    
           }
           else
           {
               CDialog::OnSysCommand(nID, lParam);
           }
      }
     方法二:
      BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
      {
           if ( pMsg->message == WM_KEYDOWN )
           {
                switch(pMsg->wParam)
                {
                case VK_ESCAPE:
                 return TRUE; //直接返回TRUE
                 break;
                case VK_RETURN:
                 return TRUE;
                 break;
                }
           }
           return CDialog::PreTranslateMessage(pMsg);
      }
      方法三:
          Q122489:
          How to Disable Default Pushbutton Handling for MFC Dialog
         http://support.microsoft.com/kb/122489/en-us
    

    14.在对话框中处理键盘鼠标消息
    处理PreTranslateMessage消息
    以下代码示例只演示了键盘WM_KEYDOWN消息,你也可以处理鼠标消息,比如WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN等。
    BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
    {
    /************************************************/
    /* 当焦点在combobox(drop down风格)的edit上,响应回车 */
    /*************************************************/
    if ( pMsg->message == WM_KEYDOWN )
    {
    switch( pMsg->wParam )
    {
    case VK_RETURN:
    CEdit pEdit = (CEdit)m_combo1.GetWindow(GW_CHILD);
    if(pMsg->hwnd == pEdit->m_hWnd )
    {
    AfxMessageBox(“在combobox的edit中按下了Enter!”);
    }
    return TRUE;
    }
    }

     /****************************************/ 
     /*    ALT为WM_SYSKEYDOWN                   */ 
     /****************************************/
     if( pMsg->message == WM_SYSKEYDOWN ) 
     {    
         switch( pMsg->wParam ) 
         { 
         case VK_F1:     
             if(::GetKeyState(VK_MENU) < 0)//ALT+F1
             { 
                 AfxMessageBox("按下了ALT+F1"); 
                 return TRUE; 
             }             
         }         
     } 
    
     /****************************************/ 
     /*      在clistctrl中按ctrl+A选中所有项   */ 
     /****************************************/ 
     if( pMsg->message == WM_KEYDOWN ) 
     {    
         if(pMsg->hwnd == GetDlgItem(IDC_LIST1)->m_hWnd) 
         { 
             switch( pMsg->wParam ) 
             { 
             case 65://A     
               if(::GetKeyState(VK_CONTROL) < 0)//Shift+enter 
               { 
                     for(int i=0; i<m_list.GetItemCount(); i++) 
                     { 
                         m_list.SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, 
                                             LVIS_SELECTED|LVIS_FOCUSED); 
                     } 
               } 
               return TRUE; 
             } 
         } 
     }  
    
     /****************************************/ 
     /*     当焦点在combobox,弹出自定义菜单    */ 
     /****************************************/      
     if(pMsg->message == WM_RBUTTONDOWN) 
     { 
         CEdit *pEdit = (CEdit*)m_combo1.GetWindow(GW_CHILD); 
         if(pMsg->hwnd == pEdit->m_hWnd) 
         { 
             DWORD dwPos = GetMessagePos(); 
             CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); 
             ScreenToClient(&point); 
             ClientToScreen(&point); 
    
             CMenu menu; 
             VERIFY( menu.LoadMenu( IDR_MENU1 ) ); 
             CMenu* popup = menu.GetSubMenu(0); 
             ASSERT( popup != NULL ); 
             popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this ); 
         }         
     } 
    
     return CDialog::PreTranslateMessage(pMsg); 
    

    }


    15.对话框启动即隐藏

     添加 WM_SHOWWINDOW 的消息映射
      void CTest6Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
      {
           if ( GetStyle() & WS_VISIBLE )
           {
                CDialog::OnShowWindow(bShow, nStatus);
           }
           else
           {
                long Style = ::GetWindowLong(*this, GWL_STYLE);
                ::SetWindowLong(*this, GWL_STYLE, Style | WS_VISIBLE);
                CDialog::OnShowWindow(SW_HIDE, nStatus);
           }
      }
    

    16.对话框自动停靠在屏幕边
    const int DETASTEP = 50;
    BOOL AdjustPos(CWnd pWnd, CRect lpRect)
    {
    //自动靠边
    int iSX = GetSystemMetrics(SM_CXFULLSCREEN);
    int iSY = GetSystemMetrics(SM_CYFULLSCREEN);
    RECT rWorkArea;
    BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0);
    CRect rcWA;
    if ( !bResult )
    {
    //如果调用不成功就利用GetSystemMetrics获取屏幕面积
    rcWA = CRect(0,0,iSX,iSY);
    }
    else
    rcWA = rWorkArea;
    int iX = lpRect->left;
    int iY = lpRect->top;
    if ( iX < rcWA.left + DETASTEP && iX!=rcWA.left )
    {
    //调整左
    pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(rcWA.left-iX,0);
    AdjustPos(lpRect);
    return TRUE;
    }
    if ( iY < rcWA.top + DETASTEP && iY!=rcWA.top )
    {
    //调整上
    pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(0,rcWA.top-iY);
    AdjustPos(lpRect);
    return TRUE;
    }
    if ( iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width() )
    {
    //调整右
    pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(rcWA.right-lpRect->right,0);
    AdjustPos(lpRect);
    return TRUE;
    }
    if ( iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height() )
    {
    //调整下
    pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
    lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
    return TRUE;
    }
    return FALSE;
    }
    //然后在ONMOVEING事件中使用如下过程调用
    CRect r=*pRect;
    AdjustPos(this, &r);
    *pRect=(RECT)r;


    17.单击窗口任意位置都可拖动窗口
    方法一:
    添加 WM_LBUTTONDOWN 的消息映射
    void CTest6Dlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);
    CDialog::OnLButtonDown(nFlags, point);
    }
    方法二:
    添加 WM_NCHITTEST 的消息映射
    注意:在classwizard->message中找不到WM_NCHITTEST的,需要在选项卡class info->message filter中选择window后该消息才会出现在message中。
    void CTest6Dlg::OnNCHitTest(CPoint point)
    {
    return HTCAPTION;
    // return CDialog::OnNCHitTest(point);
    }
    或者参考
    http://msdn.microsoft.com/msdnmag/issues/02/12/CQA/default.aspx


    18.用Enter键替换Tab键实现焦点切换
    BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
    {
    if ( pMsg->message == WM_KEYDOWN )
    {
    if ( pMsg->wParam == VK_RETURN )
    pMsg->wParam = VK_TAB;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }


    19.在对话框添加快捷键
    (1) 在CXXXApp中类中添加声明
    HACCEL m_haccel;
    (2) 在resource view中右键点击树的根目录,选择insert,添加一个新的Accelerator,默认ID为IDR_ACCELERATOR1。
    在其中添加相应菜单的快捷键。
    (3) 在BOOL CXXXApp::InitInstance()中添加代码
    m_haccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
    (4) 添加CXXXApp类的 ProcessMessageFilter 消息映射函数
    BOOL CTest6App::ProcessMessageFilter(int code, LPMSG lpMsg)
    {
    if ( m_haccel )
    {
    if ( ::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg) )
    return TRUE;
    }
    return CWinApp::ProcessMessageFilter(code, lpMsg);
    }
    或者参考
    Q100770:
    How to use accelerator keys and a main menu on the dialog box in Visual C++
    http://support.microsoft.com/kb/100770/en-us
    Adding Hot Keys to your Application
    http://msdn.microsoft.com/msdnmag/issues/1200/c/default.aspx


    20.对话框全屏
    int cx, cy;
    HDC dc = ::GetDC(NULL);
    cx = GetDeviceCaps(dc,HORZRES) + GetSystemMetrics(SM_CXBORDER);
    cy = GetDeviceCaps(dc,VERTRES) + GetSystemMetrics(SM_CYBORDER);
    ::ReleaseDC(0,dc);
    // Remove caption and border
    SetWindowLong(m_hWnd, GWL_STYLE,
    GetWindowLong(m_hWnd, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER)));
    // Put window on top and expand it to fill screen
    ::SetWindowPos(m_hWnd, HWND_TOPMOST,
    -(GetSystemMetrics(SM_CXBORDER)+1),
    -(GetSystemMetrics(SM_CYBORDER)+1),
    cx+1,cy+1, SWP_NOZORDER);
    或参考
    http://www.codeguru.com/cpp/w-d/dislog/dialog-basedapplications/article.php/c1837/


    21.控制对话框最大最小尺寸
    (1) 对话框的属性的必须是resizing的
    (2) 打开classwizard->class info标签页->message filter中选择window
    (3) 添加 WM_GETMINMAXINFO 消息映射
    void CTest6Dlg::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
    {
    lpMMI->ptMinTrackSize = CPoint(200, 200);
    }


    1. 创建无模式对话框
      Q103788:
      Creating a Modeless Dialog Box with MFC Libraries
      http://support.microsoft.com/kb/103788/EN-US/
      Visual C++ MFC Samples
      MODELESS Sample: Uses a CDialog Object as a Modeless Dialog Box
      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/_sample_mfc_MODELESS.asp

    23.在对话框中改变菜单项状态(enable/disable, check/uncheck, change text)
    Q242577:
    You cannot change the state of a menu item from its command user-interface handler if the menu is attached to a dialog box in Visual C++
    http://support.microsoft.com/kb/242577/en-us


    1. 按下F1出现帮助
      Q141724:
      Context-Sensitive Help in a CDialog Object
      http://support.microsoft.com/kb/141724/en-us

    msdn中的介绍
    http://msdn2.microsoft.com/en-us/library/dyd1yfww.aspx
    或者如果你要屏蔽按下F1后出现的“找不到*.hlp文件”的提示对话框
    添加 WM_HELPINFO 消息映射
    BOOL CTest6Dlg::OnHelpInfo(HELPINFO* pHelpInfo)
    {
    return TRUE;
    //return CDialog::OnHelpInfo(pHelpInfo);//屏蔽该句
    }


    1. 对话框初始化设置输入焦点的问题
      默认情况下,对话框初始化显示的焦点按照在对话框编辑期间设置的tab order的第一个控件来设置的。(设置tab order可在对话框的resource view中用Ctrl+D显示出来,点鼠标进行顺序设置)。如果想人为的改变初始化时的输入焦点,可在对话框的OnInitDialog中把return TRUE; 改为 return FALSE;
      MSDN上的解释如下:
      Return Value
      Specifies whether the application has set the input focus to one of the controls in the dialog box. If OnInitDialog returns nonzero, Windows sets the input focus to the first control in the dialog box. The application can return 0 only if it has explicitly set the input focus to one of the controls in the dialog box.

    1. 在对话框间传递数据
      CDlg1::OnButton1()
      {
      CDlg2 dlg2;
      dlg2.m_str = _T(“你好”; )
      dlg2.m_bJudge = TRUE;
      dlg2.DoModal();
      }

    //Dlg2.h
    public:
    CString m_str;
    BOOL m_bJudge;

    //Dlg2.cpp
    CDlg2::OnInitDialog()
    {
    if (m_bJudge)
    GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);
    }


    1. 在 dlg1 中打开 dlg2 时,dlg2 能修改 dlg1 中的成员变量
      //dlg1.cpp
      #include “dlg2.h”
      CDlg1::OnButton1()
      {
      CDlg2 dlg2;
      dlg2.m_pDlg1 = this;
      dlg2.DoModal();
      }
      //dlg2.h
      class CDlg1;//添加dlg1类的声明
      class CDlg2 : public CDialog
      {

      public:
      CDlg1 *m_pDlg1;
      }
      //dlg2.cpp

    include “dlg1.h”

    至此,你可以在dlg2.cpp中通过m_pDlg1操作CDlg1类中的成员变量了。


    1. 改变对话框字体,对话框大小改变的问题
      Q145994:
      How to calculate dialog box units based on the current font in Visual C++
      http://support.microsoft.com/kb/q145994/
      Q125681:
      How To Calculate Dialog Base Units with Non-System-Based Font
      http://support.microsoft.com/kb/125681/en-us

    1. 进行大数据量计算的时候,导致界面挂起无响应的问题
      当在程序中需要进行大数据量计算的时候(比如搜索磁盘,大数据量传输等),由于这些计算过程是在界面线程(UI Process)中,由此引发了界面线程的消息阻塞。我们创建一个工作线程(worker thread)来处理计算过程,以解决该问题。
      下面是一个简单的创建一个工作线程的实现:
      //xxxdlg.h
      static UINT MyThread(LPVOID pParam);
      CWinThread* pMyThread;
      //xxxdlg.cpp
      CXXXDlg::OnButton1()
      {
      pMyThread = AfxBeginThread(MyThread, this);
      pMyThread = NULL;
      }
      UINT CXXXDlg::MyThread(LPVOID pParam)
      {
      CXXXDlg pDlg = (CXXXDlg )pParam;
      //这里添加计算过程
      return 0;
      }

    1. 工程资源的合并
      以把B对话框的资源插入到A对话框为例:
      (1) 生成一个*.ogx文件
      打开B工程,在ClassView中鼠标右键点击所需的对话框类,单击”Add to Gallery”。
      这时,会在 ” C:/Program Files/Microsoft Visual Studio/Common/MSDev98/Gallery/工程B ” 的目录下产生一个ogx文件。
      (2) 插入该*.ogx文件
      打开A工程,选择菜单Project->Add To Project->components and controls… ,选择刚生成的ogx文件,然后Insert。
      这时B对话框资源和对话框类就插入到A中了。。

    1. 在网上可以找到很多有用的代码,我只是把一些常用的功能列出链接,方便查看
      http://support.microsoft.com
      http://www.codeproject.com/dialog/
      http://www.codeguru.com/Cpp/W-D/dislog/

    改变对话框大小时同时改变控件大小
    http://www.codeproject.com/dialog/easysize.asp
    http://www.codeproject.com/dialog/resizabledialog.asp
    http://www.vchelp.net/vchelp/archive.asp?type_id=5&class_id=1&cata_id=1&article_id=548&search_term=
    http://www.vchelp.net/vchelp/archive.asp?type_id=5&class_id=1&cata_id=1&article_id=538&search_term=


    如何在可变大小(resizing)的对话框中实现滚动窗口
    Q262954:
    How to create a resizeable dialog box with scroll bars in Visual C++
    http://support.microsoft.com/default.aspx?scid=kb;en-us;262954
    http://www.codeproject.com/dialog/scrollablechilddialog.asp


    从某一点或某一边逐渐变大显示对话框
    http://www.codeproject.com/dialog/canidialog.asp


    一个重载的MessageBox类
    http://www.codeproject.com/dialog/xmessagebox.asp


    option设置对话框(左边是树,右边是子对话框)
    实现原理:create多个child类型的对话框,然后全部hide,点击左边树的item时,显示相应子对话框。
    Q103375:
    MultiDlg.exe Demonstrates Dynamic Child Dialog Boxes
    http://support.microsoft.com/kb/103375/en-us
    http://www.codeproject.com/dialog/ezoptionsdlg.asp
    http://www.codeproject.com/dialog/csettingsdlg.asp
    http://www.codeguru.com/cpp/w-d/dislog/optionsdialogs/article.php/c1953/
    http://www.codeguru.com/cpp/w-d/dislog/optionsdialogs/article.php/c2015/


    实现MSN的右下角的消息弹出提示窗口
    http://www.codeproject.com/dialog/statusbarmsgwnd.asp


    Tip of the day(每日一贴)功能的实现

    http://www.codeproject.com/dialog/XHTMLTipOfTheDay.asp
    http://www.codeguru.com/cpp/w-d/dislog/tipoftheday/article.php/c4993/


    不规则对话框

    http://www.codeproject.com/dialog/SimpleIrregular.asp


    扩展和收缩对话框

    http://www.codeproject.com/dialog/dlgexpand.asp


    对话框渐变色

    http://www.codeproject.com/dialog/WinMakeInactive.asp


    屏幕捕捉

    http://www.codeproject.com/dialog/screencap.asp


    对话框菜单添加“最近使用文件列表”功能

    http://www.codeproject.com/dialog/rfldlg.asp


    关闭对话框时,逐渐消失

    http://www.codeguru.com/cpp/w-d/dislog/animation/article.php/c5063/


    对话框背景bitmap

    http://www.codeguru.com/cpp/w-d/dislog/bitmapsimages/article.php/c1877/


    透明对话框

    http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5065/
    http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5019/


    在对话框中创建view

    http://www.codeguru.com/cpp/w-d/dislog/article.php/c5009/


    Splash Screen
    Q817372:
    How to insert a splash screen in a dialog-based application by using Visual C++ .NET or Visual C++ 2005
    http://support.microsoft.com/kb/817372/en-us
    Q815376:
    How to create and insert a splash screen in an SDI application or in an MDI application by using Visual C++ .NET or Visual C++ 2005
    http://support.microsoft.com/kb/815376/en-us
    http://www.codeguru.com/cpp/w-d/dislog/splashscreens/article.php/c2011/
    http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5019/
    http://www.codeguru.com/cpp/w-d/dislog/splashscreens/article.php/c5029/


    分割对话框
    http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c4973/
    http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c2031/
    http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c1979/


    标题栏Title Bar

    http://www.codeguru.com/cpp/w-d/dislog/titlebar/article.php/c1897/


    添加状态栏statusbar和工具栏toolbar
    Q123158:
    Adding Control Bars to Foundation Classes Dialogs
    http://support.microsoft.com/kb/123158/en-us
    Visual C++ MFC Samples
    DLGCBR32 Sample: Demonstrates Adding a Status Bar and Toolbar to Dialog Boxes
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/_sample_mfc_DLGCBR32.asp
    http://www.codeguru.com/cpp/w-d/dislog/toolbarsandstatusbars/article.php/c1955/
    http://www.codeguru.com/cpp/w-d/dislog/toolbarsandstatusbars/article.php/c1939/
    http://www.codeguru.com/cpp/w-d/dislog/toolbarsandstatusbars/article.php/c1949/


    Tooltip
    Q141758:
    How to add tooltips for controls to an MFC modal dialog box
    http://support.microsoft.com/kb/141758/en-us
    http://www.codeguru.com/cpp/w-d/dislog/tooltipsfordialogcontrols/article.php/c2017/
    http://www.codeguru.com/cpp/w-d/dislog/tooltipsfordialogcontrols/article.php/c1843/
    http://www.codeguru.com/cpp/w-d/dislog/tooltipsfordialogcontrols/article.php/c1839/
    http://www.codeproject.com/miscctrl/pptooltip.asp


    从对话框边缘平滑弹出对话框
    http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5061/

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=658248

    展开全文
  • vc中关闭对话框dialog

    千次阅读 2016-08-18 13:33:57
    对话框默认用的两个按钮的ID分别是IDOK和IDCANCEL,这两个都是在winuser.h 中预定义的系统标准控件ID。  对于标准ID,你不重载时MFC会自动调用父类的相应处理函数。  比如IDOK映射到CDialog::OnOK()函数,...
  • 关闭对话框的方法

    千次阅读 2013-06-17 12:29:11
    参考网上资料,对话框关闭流程如下: 从用户单击关闭按钮(标题栏最右边)或者用鼠标或键盘选择系统菜单的“关闭”选项,直到窗口消失,应用程序结束。这期间到底发生了什么呢?  1、首先会产生一个WM_...
  • 通过AlertDialog 弹出对话框进行密码修改,密码正确之后才关闭对话框 public void modifyPwd(View v) { final SharedPreferences sharedPreferences = getBaseContext().getSharedPreferences(GlobalVar.SHARE_...
  • 实现点击AlertDialog上按钮时不关闭对话框
  • Android实现点击AlertDialog上按钮时不关闭对话框的方法开发过程中,有时候会有这样的需求:点击...如果内容为空则不关闭对话框,并toast提示。使用AlertDialog.Builder创建对话框时,可以使用builder.setNegativeButto
  • 开发过程中,有时候会有这样的需求: ...如果内容为空则不关闭对话框,并toast提示。 使用AlertDialog.Builder创建对话框时,可以使用builder.setNegativeButton和builder.setPositiveButton两个方...
  • <style name="activityDialog" parent="@android:style/Theme.Holo.Dialog...--触摸背景遮罩层是否关闭,默认true--> <item name="android:windowCloseOnTouchOutside">false</item> </style>
  • 对话框

    千次阅读 2014-12-08 05:05:51
    对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是个对话框,只是它做了很多美工方面的工作,将其大大美化了。  创建对话框主要分两大步,第一,创建对话框...
  • 本文实例讲述了Android实现点击AlertDialog上按钮时不关闭对话框的方法。分享给大家供大家参考。具体如下:开发过程中,...如果内容为空则不关闭对话框,并toast提示。使用AlertDialog.Builder创建对话框时,可以使...
  • Android自定义对话框提供用户输入选项 最近在写一个关于服务器站点性能量化评分的小功能,主要是根据Apdex公式来进行评判的,需要提供一个让用户自己设置最优响应时间门槛的值的选项。由于页面空间的限制,采取了...
  • 前几天发现自己的程序中使用非模态对话框,Debug版本有警告提示如下: Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or PostNcDestroy in derived class will not be called 由于是Warnning,就没有...
  • 最近做一个项目,excel导入数据,有一个同事使用模态对话框,上传并返回提示,如果正确上传文件,给提示,关闭模态对话框,刷新父窗口的列表。   1.打开一个模态对话框: function openWindow(innerWidth,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,809
精华内容 26,323
关键字:

关闭对话框的正确