`
ub137ub
  • 浏览: 16093 次
社区版块
存档分类
最新评论

VC++日记(非模态,自定义消息,窗体移动……)

 
阅读更多

VC++日记(非模态,自定义消息,窗体移动……)
2011年07月07日
  1:如何做非模态对话框[/b]
  1)非模态对话框就是要控制对话框,不让它接管所有的消息循环。而DoModal()函数事实上就是“劫持”了所有的消息循环,只要它没有返回,任何“非该对话框消息”都会被忽略。事实上,如果我们避开使用DoModal(),我们就避免了这一层限制。我们重载对话窗的
  [b]BOOL Create(
LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 函数,在用到该对话窗的时候,像创建任意一个CWnd一样,使用Creat来创建就可以了。当然,如果这样的话,很多数据成员的初始化工作就最好放到这里了。另:注意要调用基类的Creat函数,下面是重载Creat的一个实例:
  BOOL myDlg02::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
  {
           // TODO: Add your specialized code here and/or call the base class
           m_bCapture = FALSE;
           CRect rect1;
       m_pview->GetWindowRect(rect1);
           m_pointToLeft = rect1.TopLeft();
           m_sizeOffset  = CSize(0,0);
           return CDialog::Create(IDD, pParentWnd);
  }
  2)使用非模态对话框时候,必须注意对话框跟视图类的“对话”。所以,我们往往提供一个Cview指针成员,用来和拥有该对话框的视图“沟通”。下面是一个例子:
  class myDlg02 : public CDialog
  {
  [/b]
  [b]…
[/b]
  [b]public:

           myDlg02(CWnd* pParent = NULL);   // standard constructor
           myDlg02(CView* pview);
           myDlg02(){m_pview=NULL;}
      CSize m_sizeOffset;
           CPoint m_pointToLeft;
           BOOL  m_bCapture;
           virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
  protected:
  CView* m_pview;[/b]
  [b]…
[/b]
  [b]…
[/b]
  [b]}

  同时呢,m_pview往往也是从对话框所发消息的目的地:
  void myDlg02::OnOK()
  {
      if (m_pview!=NULL)
      {
          UpdateData(TRUE);
          m_pview->PostMessage(WM_NICETOYOU,IDOK);
      }
      else
          CDialog::OnOK();
  }
  
  void myDlg02::OnCancel()
  {[/b]
  [b]    if (m_pview!=NULL)

          m_pview->PostMessage(WM_GOODBYE,IDCANCEL);[/b]
  [b]    else
[/b]
  [b]        CDialog::OnCancel();
[/b]
  [b]}
[/b]
  [b]上面的代码重载了
OnOKOnCancle函数,相当于控制了OKCancle按钮的行为――让该对话框的拥有者来控制它们好了~~
  2:如何使用用户消息[/b]
  先明白一点:消息是发送出去了,那么由谁来处理呢?――自然是接收消息的“客户”了啊。所以,消息响应函数必须由客户负责。那么,用户自定义消息的消息响应函数的格式是怎样的呢?――
  [b]afx_msg void OnmyDlgGBOK(WPARAM wParam,LPARAM lParam);

  afx_msg void OnmyDlgGBCancle(WPARAM wParam,LPARAM lParam);
  (在视图类的头文件中声明之)[/b]
  [b]还要在消息映射表中添加:
[/b]
  [b]         ON_MESSAGE(WM_NICETOYOU,OnmyDlgGBOK)

           ON_MESSAGE(WM_GOODBYE,OnmyDlgGBCancle)
  (在视图的CPP文件的消息映射表中添加)[/b]
  [b]其中
WM_NICETOYOU WM_GOODBYE是消息识别号。[/b]
  [b]这样,只要在必要的时候用视图的指针向视图发送消息,加上上面的链接,我们的消息响应函数就可以调用了。
[/b]
  [b]另:介绍一下
BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ) [/b]
  [b]LRESULT
SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 )这两个函数。首先,至于他们关于寄送和发送的区别就不谈了,关键要注意他们的参数。第一个参数是消息识别号,第二个和第三个参数是发给消息响应消息的参数,正好与消息响应函数的参数列表对应。WPARAM和LPARAM这两个类型其实际上是Long,也就是说,它们实质上是void指针,可以是任何类型的化身,可以根据实际情况灵活的运用它们。
  3:如何动态控制窗体的位置和大小
  MoveWindow(CRect(m_pointToLeft,size),TRUE);
  那么,如何向在标题栏上一样对整个对话框或者窗体进行动态移动呢?
  {
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  CSize m_sizeOffset;
  CPoint m_pointToLeft;
  BOOL  m_bCapture;
  }
  
  {
  void myDlg02::OnLButtonDown(UINT nFlags, CPoint point)
  {
           // TODO: Add your message handler code here and/or call default
           ClientToScreen(&point);
           m_sizeOffset = point - m_pointToLeft;
           m_bCapture = TRUE;
           SetCapture();
           CDialog::OnLButtonDown(nFlags, point);
  }
  
  void myDlg02::OnLButtonUp(UINT nFlags, CPoint point)
  {
           // TODO: Add your message handler code here and/or call default
           m_bCapture = FALSE;
           ReleaseCapture();
           CDialog::OnLButtonUp(nFlags, point);
  }
  
  void myDlg02::OnMouseMove(UINT nFlags, CPoint point)
  {
           // TODO: Add your message handler code here and/or call default
           if (m_bCapture)
           {       
           ClientToScreen(&point);
           m_pointToLeft = point - m_sizeOffset;
           CRect rect;
           GetWindowRect(rect);
           CSize size(rect.Width(),rect.Height());
           this->MoveWindow(CRect(m_pointToLeft,size),TRUE);
           CDialog::OnMouseMove(nFlags, point);
           }
  }
   BOOL myDlg02::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
  {
           // TODO: Add your specialized code here and/or call the base class
           m_bCapture = FALSE;
           CRect rect1;
      m_pview->GetWindowRect(rect1);
           m_pointToLeft = rect1.TopLeft();
           m_sizeOffset  = CSize(0,0);
           return CDialog::Create(IDD, pParentWnd);
  }
  }
  不知道为什么,在做窗体的移动时候如果使用客户坐标,移动的窗体老是出现跳动和闪烁,而改成屏幕坐标,这个问题就神秘的解决了[/b]
  [b]4
:如何控制窗体的初始化大小(最大,最小,默认)[/b]
  vc++ 窗口最大化方法
  一般的做法是在 C**App::InitInstance()中,修改成这样:
  [b]{

  //..
  [/b]
  [b]m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
  m_pMainWnd->UpdateWindow();
  return TRUE;..

  }
  或者,还在 CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,添加:
  {
  //...
  cs.style |= WS_MAXIMIZE;
  //...
  }
  但是,这种方法的最大化会体现出窗体的有效变大的过程,这个是因为在ShowWindow之前,还有地方显示了窗体,做法是:
  CCommandLineInfo cmdInfo;
  ParseCommandLine(cmdInfo);
  // Dispatch commands specified on the command line
  //ParseCommandLine之后,ProcessShellCommand之前,添加这句!!!
  m_nCmdShow = SW_SHOWMAXIMIZED; 
  if (!ProcessShellCommand(cmdInfo))
  return FALSE;

  // The one and only window has been initialized, so show and update it.
  m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
  m_pMainWnd->UpdateWindow();
  5:如何控制控件的层叠次序[b][/b]
  Ctrl+d,单击控件,会看到控件上的代号会变化,代号小的更底层。
分享到:
评论

相关推荐

    vc++制作非模态对话框

    本篇文章将深入探讨如何使用VC++来制作非模态对话框,以及与模态对话框的区别。 首先,我们要理解“模态”和“非模态”这两个术语。模态对话框是那些在显示时阻止用户与应用程序其他部分交互的对话框,直到用户关闭...

    C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果

    在C#编程中,窗口的显示方式主要分为两种:模态窗体(Modal Form)和非模态窗体(Non-Modal Form)。模态窗体通过`ShowDialog()`方法显示,它会阻塞父窗体的继续操作,直到该模态窗体关闭;而非模态窗体则使用`Show...

    详解VC++模态对话框和非模态对话框

    在VC++中,MFC(Microsoft Foundation Classes)框架提供了两种主要的对话框类型:模态对话框和非模态对话框。这两种对话框在程序执行流程和用户交互方面有着显著的区别。 模态对话框(Modal Dialog Box)是通过...

    vc模态和非模态对话框关闭过程

    为了更好地理解非模态对话框的关闭机制,我们需要了解VC++中消息的处理流程。 1. **AfxWndProc()**:所有窗口的消息都会先经过这里,然后根据消息类型转发给相应的对象进行处理。 2. **AfxCallWndProc()**:将...

    VC中模态对话框和非模态对话框的编程

    非模态对话框的创建过程与模态对话框类似,但是它不启动独立的消息循环,而是与应用程序共享消息循环。这意味着用户可以同时与非模态对话框和其他用户界面对象进行交互。 - **创建过程**:非模态对话框通常通过调用...

    C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果 .rar

    模态窗体强制用户与该窗体进行交互,直到完成或关闭该窗体后才能继续操作主窗体,而非模态窗体则允许用户在打开新窗体的同时,仍可与主窗体或其他窗口进行交互。本教程将重点讲解如何使用非模态窗体`Show`方法来模拟...

    非模态对话框数据回传(VC 6.0 源码)

    非模态对话框在软件开发中经常被使用,特别是在Windows应用程序设计中,它允许用户与主窗口和对话框同时交互。在这个场景中,我们关注的是如何在VC 6.0环境下实现非模态对话框的数据回传功能。下面将详细阐述这一...

    VC++实现创建模态对话框

    在Microsoft Visual C++(简称VC++)环境中,创建模态对话框是开发Windows应用程序时常见的任务,特别是对于需要用户输入特定信息或者进行一系列交互操作的场景。模态对话框是一种阻塞用户界面(UI)的窗口,用户...

    自定义Msgbox窗体图标代码

    5. **显示窗体**:在需要弹出自定义MsgBox的地方,实例化这个自定义窗体并调用其ShowDialog方法,这将使窗体以模态对话框的形式出现,等待用户交互。 6. **处理用户响应**:根据用户点击的按钮,自定义窗体可以返回...

    (VC++源代码)非模态对话框

    非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本代码将从主框架窗口创建一个简单的非模态...

    VC++ 非模态对话框的实现实例+源代码

    在VC++编程环境中,非模态对话框是一种常见的用户交互元素,它允许用户与应用程序的主窗口同时进行交互。非模态对话框不阻止用户与应用程序的其他部分进行操作,而模态对话框则会阻碍用户对其他窗口的访问,直到...

    vc非模态对话框例子

    非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本例将从主框架窗口创建一个简单的非模态...

    Windows 程序设计

    …………………… 非显示区域鼠标消息 …………………… 程序中的命中测试 …………………… 拦截鼠标 …………………… 鼠标滑轮 8. 定时器 …………………… 定时器入门 …………………… 定时器的使用:...

    Delphi 模态窗体下更新另一个窗体内容

    当一个模态窗体打开时,它会阻止用户与父窗体或其他非模态窗体的交互,直到该模态窗体被关闭。这种机制在需要用户输入关键信息或确认操作时非常有用。 在描述中提到的“更新另一个窗体内容”是指在模态窗体中进行...

    《Windows程序设计》中文chm版

    …………………… 非显示区域鼠标消息 …………………… 程序中的命中测试 …………………… 拦截鼠标 …………………… 鼠标滑轮 8. 定时器 …………………… 定时器入门 …………………… 定时器的使用:...

    VC++创建模态对话框

    总结,创建模态对话框是VC++开发中的常见任务,它涉及到MFC类的使用、资源编辑、消息处理和对话框生命周期管理等多个方面。熟练掌握这一技能将有助于构建更加交互丰富的Windows应用程序。在提供的压缩包文件中,你将...

    Silverlight开源控件--可用于MDI开发的模态非模态两用窗体.

    本项目聚焦于Silverlight的多文档界面(MDI)开发,通过一个开源控件实现模态和非模态窗体的灵活使用。 MDI(Multiple Document Interface)是一种用户界面设计模式,允许在一个应用程序中同时打开多个子窗口,这些...

    c#中如何控制模态子窗体中的进度条

    在C#编程中,控制模态子窗体中的进度条是一项常见的需求,特别是在进行耗时操作时,为了提供用户友好的界面,我们需要显示一个带有进度条的子窗口,让用户了解后台任务的执行进度。然而,由于模态窗体(Modal Form)...

Global site tag (gtag.js) - Google Analytics