vc中对话框使用技巧集合(下)

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);
         }


--------------------------------------------------------------------------------

22. 创建无模式对话框

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


--------------------------------------------------------------------------------

24. 按下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);//屏蔽该句
}

 

--------------------------------------------------------------------------------

25. 对话框初始化设置输入焦点的问题
默认情况下,对话框初始化显示的焦点按照在对话框编辑期间设置的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.


--------------------------------------------------------------------------------


26. 在对话框间传递数据
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);
}


--------------------------------------------------------------------------------


27. 在 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类中的成员变量了。

 

--------------------------------------------------------------------------------


28. 改变对话框字体,对话框大小改变的问题

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

--------------------------------------------------------------------------------


29. 进行大数据量计算的时候,导致界面挂起无响应的问题

     当在程序中需要进行大数据量计算的时候(比如搜索磁盘,大数据量传输等),由于这些计算过程是在界面线程(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;
}


--------------------------------------------------------------------------------

30. 工程资源的合并

以把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中了。。


--------------------------------------------------------------------------------

31. 在网上可以找到很多有用的代码,我只是把一些常用的功能列出链接,方便查看

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/

posted on 2008-04-02 15:55 wrh 阅读(1192) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2019年8月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(18)

随笔档案

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜