WEB开发网
开发学院软件开发VC Visual C++模态对话框消息处理机制的分析 阅读

Visual C++模态对话框消息处理机制的分析

 2008-11-14 19:33:15 来源:WEB开发网   
核心提示: 三、以模态的形式显示应用到文档/视图框架结构实例(1)新建一工程文件:ModeFrame,选取MFC AppWizard(exe),Visual C++模态对话框消息处理机制的分析(4),(2)第二步选取Single document(单文档),(3)其余几步均为缺省值,可利用消息对Win

三、以模态的形式显示应用到文档/视图框架结构实例

(1)新建一工程文件:ModeFrame,选取MFC AppWizard(exe)。

(2)第二步选取Single document(单文档)。

(3)其余几步均为缺省值。

(4)用ClassWizard添加一新类CSubModeFrame,以CFrameWnd为基类。

(5)添加CsubModeFrame的实现函数DoMode();

int CsubModeFrame::DoModal()
{
 HWND hWndParent = m_hWndPrt;
 CRect rc(0,0,400,400);
 CWnd *pParent = CWnd::FromHandle(hWndParent);
 DWORD dwStyle=WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_THICKFRAME |  WS_VISIBLE | WS_SYSMENU | WS_CAPTION;
 if(!Create(NULL,"模态文档/试图框架 ",dwStyle,rc,pParent,NULL)) return FALSE;
  BOOL bEnableParent = FALSE;
  if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
  {
   ::EnableWindow(hWndParent,FALSE);
   ::EnableWindow(m_hWnd,TRUE);
   bEnableParent = TRUE;
  }
  CenterWindow();
  TRY
  {
   // enter modal loop
   DWORD dwFlags = MLF_SHOWONIDLE;
   if (GetStyle() & DS_NOIDLEMSG) dwFlags |= MLF_NOIDLEMSG;
    VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
  }
  CATCH_ALL(e)
  {
   DELETE_EXCEPTION(e);
   m_nModalResult = -1;
  }
  END_CATCH_ALL
 
 if (bEnableParent)
  ::EnableWindow(hWndParent, TRUE);
  if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
   ::SetActiveWindow(hWndParent);
   // destroy modal window
   DestroyWindow();
   return m_nModalResult;
 }

(6)添加CsubModeFrame的实现函数EndMode()

void CSubFrame::EndModal(){
 ASSERT(::IsWindow(m_hWnd));
 if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL)) {
  EndModalLoop(1);
 }
}

(7)添加CModeFrameView的实现函数OnLButtonDblClk()

在此函数的消息处理中:可以象显示对话框一样处理CsubModeFrame类。

CSubModeFrame SubModeFrame;
If(SubModeFrame.DoMode()){ MessageBox("Mode Ok");}

(8)编译运行工程,双击视图,就会弹出模态的子文档/视图框架结构

结论: 通过上面的分析和实例可以看出,深入研究了解Windows的消息处理机制,可利用消息对Windows的事件进行任意的定制和处理,不用拘泥于系统原有的模式。对进行深入Windows编程是很有必要的。

上一页  1 2 3 4 

Tags:Visual 模态 对话框

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接