青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

蝸牛的家
男兒當自強
posts - 48,  comments - 21,  trackbacks - 0
int CWnd::RunModalLoop(DWORD dwFlags)
{
 ASSERT(::IsWindow(m_hWnd)); 
// window must be created
 ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state

 
// for tracking the idle time state
 BOOL bIdle = TRUE;
 LONG lIdleCount 
= 0;
 BOOL bShowIdle 
= (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
 HWND hWndParent 
= ::GetParent(m_hWnd);
 m_nFlags 
|= (WF_MODALLOOP|WF_CONTINUEMODAL);
 MSG
* pMsg = &AfxGetThread()->m_msgCur;

 
// acquire and dispatch messages until the modal state is done
 for (;;)
 
{
  ASSERT(ContinueModal());

  
// phase1: check to see if we can do idle work
  while (bIdle &&
   
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
  
{
   ASSERT(ContinueModal());

   
// show the dialog when the message queue goes idle
   if (bShowIdle)
   
{
    ShowWindow(SW_SHOWNORMAL);
    UpdateWindow();
    bShowIdle 
= FALSE;
   }


   
// call OnIdle while in bIdle state
   if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
   
{
    
// send WM_ENTERIDLE to the parent
    ::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
   }

   
if ((dwFlags & MLF_NOKICKIDLE) ||
    
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
   
{
    
// stop idle processing next time
    bIdle = FALSE;
   }

  }


  
// phase2: pump messages while available
  do
  
{
   ASSERT(ContinueModal());

   
// pump message, but quit on WM_QUIT
   
//PumpMessage(消息泵)的實現和上面講的差不多。都是派送消息到窗口。
   if (!AfxGetThread()->PumpMessage())
   
{
    AfxPostQuitMessage(
0);
    
return -1;
   }


   
// show the window when certain special messages rec'd
   if (bShowIdle &&
    (pMsg
->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
   
{
    ShowWindow(SW_SHOWNORMAL);
   消息分為隊列消息(進入線程的消息隊列)和非隊列消息(不進入線程的消息隊列)。對于隊列消息,最常見的是鼠標和鍵盤觸發的消息,例如 WM_MOUSERMOVE,WM_CHAR等消息;還有例如:WM_PAINT、WM_TIMER和WM_QUIT。當鼠標、鍵盤事件被觸發后,相應的鼠標或鍵盤驅動程序就會把這些事件轉換成相應的消息,然后輸送到系統消息隊列,由Windows系統負責把消息加入到相應線程的消息隊列中,于是就有了消息循環(從消息隊列中讀取并派送消息)。還有一種是非隊列消息,他繞過系統隊列和消息隊列,直接將消息發送到窗口過程。例如,當用戶激活一個窗口系統發送 WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。創建窗口時發送WM_CREATE消息。
BOOL CWinThread::PumpMessage()
{
 ASSERT_VALID(
this);
 
 
//如果是WM_QUIT就退出函數(return FALSE),這將導致程序結束.
 if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) {
#ifdef _DEBUG
  
if (afxTraceFlags & traceAppMsg)
   TRACE0(
"CWinThread::PumpMessage - Received WM_QUIT.\n");
  m_nDisablePumpCount
++// application must die
   
// Note: prevents calling message loop things in 'ExitInstance'
   
// will never be decremented
#endif
  
return FALSE;
 }


#ifdef _DEBUG
 
if (m_nDisablePumpCount != 0)
 
{
  TRACE0(
"Error: CWinThread::PumpMessage called when not permitted.\n");
  ASSERT(FALSE);
 }

#endif

#ifdef _DEBUG
 
if (afxTraceFlags & traceAppMsg)
  _AfxTraceMsg(_T(
"PumpMessage"), &m_msgCur);
#endif

 
// process this message

 
if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
{
  ::TranslateMessage(
&m_msgCur); //鍵轉換
  ::DispatchMessage(&m_msgCur); //派送消息
 }

 
return TRUE;
}
BOOL CWinThread::PreTranslateMessage(MSG* pMsg)
{
 ASSERT_VALID(
this);

 
// 如果是線程消息,那么將會在消息映射表中找到消息入口,調用線程消息的處理函數
 if (pMsg->hwnd == NULL && DispatchThreadMessageEx(pMsg))
  
return TRUE;

 
// walk from target to main window
 CWnd* pMainWnd = AfxGetMainWnd();
 
if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), pMsg))
  
return TRUE;

 
// in case of modeless dialogs, last chance route through main
 
//   window's accelerator table
 if (pMainWnd != NULL)
 
{
   CWnd
* pWnd = CWnd::FromHandle(pMsg->hwnd);
   
if (pWnd->GetTopLevelParent() != pMainWnd)
   
return pMainWnd->PreTranslateMessage(pMsg);
 }


 
return FALSE;   // no special processing
}
注:1.一般用PostThreadMessage函數發送線程之間的消息,他和窗口消息不同,需要指定線程id,消息激被系統放入到目標線程的消息隊列中;用 ON_THREAD_MESSAGE( message, memberFxn )宏可以映射線程消息和他的處理函數。這個宏必須在應用程序類(從CWinThread繼承)中,因為只有應用程序類才處理線程消息。如果你在別的類(比如視圖類)中用這個宏,線程消息的消息處理函數將得不到線程消息。
   2.消息的目標窗口的PreTranslateMessage函數首先得到消息處理權,如果函數返回FALSE,那么他的父窗口將得到消息的處理權,直到主窗口;如果函數返回TRUE(表示消息已經被處理了),那么就不需要調用父類的PreTranslateMessage函數。這樣,保證了消息的目標窗口以及他的父窗口都可以有機會調用PreTranslateMessage,如果你想要消息不傳遞給父類進行處理的話,返回TRUE就行了
 
   //對話框程序的消息循環
int CWnd::RunModalLoop(DWORD dwFlags)
{
 ASSERT(::IsWindow(m_hWnd)); 
// window must be created
 ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state

 
// for tracking the idle time state
 BOOL bIdle = TRUE;
 LONG lIdleCount 
= 0;
 BOOL bShowIdle 
= (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
 HWND hWndParent 
= ::GetParent(m_hWnd);
 m_nFlags 
|= (WF_MODALLOOP|WF_CONTINUEMODAL);
 MSG
* pMsg = &AfxGetThread()->m_msgCur;

 
// acquire and dispatch messages until the modal state is done
 for (;;)
 
{
  ASSERT(ContinueModal());

  
// phase1: check to see if we can do idle work
  while (bIdle &&
   
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
  
{
   ASSERT(ContinueModal());

   
// show the dialog when the message queue goes idle
   if (bShowIdle)
   
{
    ShowWindow(SW_SHOWNORMAL);
    UpdateWindow();
    bShowIdle 
= FALSE;
   }


   
// call OnIdle while in bIdle state
   if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
   
{
    
// send WM_ENTERIDLE to the parent
    ::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
   }

   
if ((dwFlags & MLF_NOKICKIDLE) ||
    
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++)) 
         //發送WM_KICKIDLE消息,如果對話框中有狀態欄或是工具欄等,靠這個消息更新狀態,相當于OnIdle
   
{
    
// stop idle processing next time
    bIdle = FALSE;
   }

  }


  
// phase2: pump messages while available
  do
  
{
   ASSERT(ContinueModal());

   
// pump message, but quit on WM_QUIT
   
//PumpMessage(消息泵)的實現和上面講的差不多。都是派送消息到窗口。
   if (!AfxGetThread()->PumpMessage())
   
{
    AfxPostQuitMessage(
0);
    
return -1;
   }


   
// 消息為WM_SYSTIMER或者WM_SYSKEYDOWN,并且空閑顯示標志為真的話,就顯示窗口并通知窗口立刻重繪。
   if (bShowIdle &&
    (pMsg
->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
   
{
    ShowWindow(SW_SHOWNORMAL);
    UpdateWindow();
    bShowIdle 
= FALSE;
   }

   // 檢測對話框是否還是模式狀態,如果不是則退出
   
if (!ContinueModal())
    
goto ExitModal;

   
// reset "no idle" state after pumping "normal" message
   if (AfxGetThread()->IsIdleMessage(pMsg))
   
{
    bIdle 
= TRUE;
    lIdleCount 
= 0;
   }


  }
 while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
 }
 //無限循環

ExitModal:
 m_nFlags 
&= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
 
return m_nModalResult;
}
posted on 2008-09-02 23:16 黑色天使 閱讀(673) 評論(0)  編輯 收藏 引用 所屬分類: VC&MFC

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老司机凹凸av亚洲导航| 午夜日韩在线| 欧美在线视频导航| 久久综合九色综合久99| 亚洲一级特黄| 亚洲天堂av在线免费| 一区二区三区黄色| 亚洲婷婷在线| 亚洲欧美综合| 久久久久久久999精品视频| 久久久777| 欧美韩日高清| 国产精品视频久久| 亚洲国产精品传媒在线观看| 亚洲精品一区二区网址| 亚洲一区二区视频在线观看| 欧美一级成年大片在线观看| 另类激情亚洲| 99视频+国产日韩欧美| 欧美一区二区三区男人的天堂| 久久久之久亚州精品露出| 欧美激情精品久久久久久久变态| 国产精品家庭影院| 亚洲福利视频一区| 亚洲图片欧洲图片日韩av| 久久一区二区三区av| 亚洲精品久久在线| 欧美夜福利tv在线| 欧美国产精品专区| 国产一区二区成人久久免费影院| 99精品热视频只有精品10| 久久久国产精品一区二区三区| 亚洲精品少妇30p| 久久成人人人人精品欧| 欧美午夜精彩| 99精品欧美一区二区蜜桃免费| 久久精品2019中文字幕| 99国内精品| 欧美 日韩 国产精品免费观看| 国产日产欧美一区| 亚洲一区二区四区| 亚洲精品看片| 久久精品国产综合精品| 一区二区三区www| 欧美极品在线播放| 亚洲国产欧美久久| 久久综合久色欧美综合狠狠| 在线一区二区日韩| 欧美日韩中文| 亚洲午夜精品久久久久久app| 欧美国产日本| 免费黄网站欧美| 国精产品99永久一区一区| 亚洲欧美精品suv| 亚洲精品国产日韩| 欧美激情综合网| 亚洲乱码国产乱码精品精98午夜| 久久在线免费观看视频| 久久精品免费看| 激情综合激情| 蜜桃av综合| 老司机午夜精品视频| 亚洲精品日产精品乱码不卡| 亚洲黄一区二区| 欧美日韩一级大片网址| 亚洲一区二区影院| 亚洲欧美日韩成人| 国产一区美女| 欧美成人免费大片| 欧美国产亚洲精品久久久8v| 99国产精品久久久久老师| 99成人在线| 国产精品人成在线观看免费 | 国产精品久久久久毛片软件| 一区二区电影免费在线观看| 日韩午夜黄色| 欧美性猛交一区二区三区精品| 亚洲天堂偷拍| 欧美伊人久久| 黄色国产精品| 亚洲人成网在线播放| 国产精品久久久久久久久久妞妞| 小辣椒精品导航| 久久久久9999亚洲精品| 91久久综合| 亚洲一区中文| 伊人久久亚洲热| 亚洲毛片一区| 韩国一区电影| 亚洲免费观看在线观看| 国产精品免费观看在线| 久久久久久噜噜噜久久久精品| 久久夜精品va视频免费观看| 中日韩高清电影网| 欧美在线观看www| 亚洲国产高清一区| 99热精品在线| 激情综合中文娱乐网| 亚洲激情视频在线播放| 国产精品免费看久久久香蕉| 亚洲国产精品久久久久秋霞不卡 | 一区二区三区四区五区精品| 国产女主播一区| 亚洲国产精品高清久久久| 国产精品欧美日韩一区| 久久午夜激情| 欧美日韩亚洲综合| 欧美mv日韩mv国产网站| 国产精品区免费视频| 亚洲日本中文字幕| 怡红院精品视频| 亚洲字幕一区二区| 亚洲人成在线观看一区二区| 香港久久久电影| 亚洲制服av| 欧美成人一区二区在线| 久久久99爱| 国产精品系列在线播放| 亚洲精品日韩在线观看| 亚洲欧洲免费视频| 久久香蕉国产线看观看网| 亚洲香蕉在线观看| 欧美激情导航| 亚洲大胆人体在线| 亚洲电影在线免费观看| 欧美在线首页| 香蕉视频成人在线观看| 欧美日韩中文在线| 亚洲美女区一区| 最新高清无码专区| 久久久久综合网| 久久久91精品| 国产亚洲一级| 亚洲视频在线观看免费| 99精品视频免费全部在线| 欧美成人一区二区三区| 亚洲人成人一区二区在线观看| 亚洲麻豆视频| 欧美日韩免费一区二区三区视频| 亚洲人成久久| 一区二区三区视频在线观看| 欧美日本亚洲| 亚洲最新色图| 亚洲免费一级电影| 国产精品久久毛片a| 亚洲美女毛片| 99伊人成综合| 欧美精品乱人伦久久久久久| 免费日韩成人| 在线观看日韩av电影| 久久久夜夜夜| 久久综合精品一区| 国产精品久久久久久久久久直播 | 久久激情中文| 美女爽到呻吟久久久久| 亚洲欧洲一区二区在线播放| 欧美人在线观看| 亚洲在线视频网站| 久久人91精品久久久久久不卡| 亚洲二区三区四区| 欧美日韩一区精品| 久久精品视频在线免费观看| 激情综合色综合久久| 欧美精品色网| 亚洲欧美在线一区二区| 亚洲第一精品夜夜躁人人爽 | 久久久久久久综合狠狠综合| 在线不卡视频| 欧美日韩视频在线一区二区 | 午夜精品久久久久久久| 久久久夜色精品亚洲| 亚洲欧洲一区二区在线播放 | 欧美电影资源| 亚洲天天影视| 欧美wwwwww| 亚洲欧美激情精品一区二区| 国外成人在线视频网站| 欧美精品色综合| 久久精品一区二区三区中文字幕| 亚洲精品网站在线播放gif| 久久精品国产欧美激情| 亚洲乱码精品一二三四区日韩在线| 国产精品国产三级国产普通话三级| 久久九九有精品国产23| 亚洲午夜一级| 亚洲人线精品午夜| 免费在线成人| 久久精品免费电影| 中文一区二区在线观看| 亚洲第一精品在线| 国产欧美一区二区三区在线看蜜臀| 欧美电影在线免费观看网站| 欧美一级黄色网| 中国日韩欧美久久久久久久久| 欧美大尺度在线观看| 久久天天躁夜夜躁狠狠躁2022 | 国产麻豆精品在线观看| 久久综合一区二区| 午夜欧美视频| 欧美成人国产|