將非模態(tài)對(duì)話框顯示為模態(tài)對(duì)話框_.Net教程
推薦:如何實(shí)現(xiàn)無(wú)刷新的DropdownList聯(lián)動(dòng)效果ASP.NET給我們帶了了事件模型的編程機(jī)制,這使得我們將所有的任務(wù)都放在 服務(wù)器 上執(zhí)行哪怕是一個(gè)小小變動(dòng),其實(shí)這到不是什么問(wèn)題,可是有一點(diǎn)我們無(wú)法忍受,如果我們改變某一個(gè)輸入框中的內(nèi)容
1、意圖
有時(shí)候我們希望將非模態(tài)窗口顯示為模態(tài)窗口。比如在IE的“文件”菜單下選擇“打印”,彈出的“打印”對(duì)話框就是非模態(tài)的(也許我們不太清楚Microsoft的設(shè)計(jì)意圖,一般來(lái)說(shuō)這里的“打印”對(duì)話框應(yīng)該是模態(tài)的)。這種情況下如何將“打印”對(duì)話框顯示為模態(tài)的呢(這個(gè)對(duì)話框?qū)ξ覀儊?lái)說(shuō)是Black Box)?
2、簡(jiǎn)單實(shí)現(xiàn)
簡(jiǎn)單地說(shuō),模態(tài)窗口顯示時(shí),其父窗口是被Disable的,所以模態(tài)窗口才呈現(xiàn)“模態(tài)”,所以只要在顯示我們非模態(tài)窗口前將父窗口Disable即可實(shí)現(xiàn),如下:
以下為引用的內(nèi)容: …… AfxGetMainWnd()->EnableWindow(FALSE);//將主窗口Disable,顯示出的非模態(tài)窗口就變成模態(tài)的了 ShowModelessWindow(); …… |
問(wèn)題在于非模態(tài)窗口顯示之后是立即返回的,那我們將父窗口Enable的代碼放在哪里呢?笨辦法是用時(shí)鐘,不斷地檢測(cè)顯示出來(lái)的非模態(tài)窗口是否已經(jīng)關(guān)閉,若關(guān)閉則將父窗口Enable。
當(dāng)然,還要更好的辦法。
3、WH_CBT Hook
WH_CBT鉤子的詳細(xì)說(shuō)明請(qǐng)參閱MSDN,我們僅僅需要知道的是在窗口創(chuàng)建、銷毀之前系統(tǒng)都會(huì)調(diào)用掛上了WH_CBT的鉤子函數(shù),這正是我們需要的。具體就是在顯示非模態(tài)窗口之前掛上我們的WH_CBT鉤子處理函數(shù),之后非模態(tài)窗口創(chuàng)建的句柄就可以在鉤子函數(shù)的nCode為HCBT_CREATEWND(創(chuàng)建窗口)時(shí)從wParam參數(shù)獲得,將其保存下來(lái),并在鉤子函數(shù)的nCode為HCBT_DESTROYWND(銷毀窗口)時(shí)與wParam參數(shù)進(jìn)行比較,如果匹配則恢復(fù)主窗口的Enable狀態(tài)。
2、實(shí)現(xiàn)
1)首先定義兩個(gè)變量,此處為全局靜態(tài)變量。
以下為引用的內(nèi)容: static HHOOK g_hHook = NULL; static HWND g_hWndDialog = NULL;//用以保存窗口句柄 |
2)再添加一個(gè)函數(shù)CbtProc,由于是回調(diào)函數(shù),注意要聲明為static。
static LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam);
3)掛鉤
假設(shè)下面是我們的某個(gè)瀏覽器中調(diào)用“打印”對(duì)話框的函數(shù)
以下為引用的內(nèi)容: void CMyHtmlView::OnFilePrint() { AfxGetMainWnd()->EnableWindow(FALSE); g_hWndDialog = 0; //可能多次調(diào)用,需要重置保存窗口句柄的變量 g_hHook = SetWindowsHookEx(WH_CBT, CbtProc, NULL, GetCurrentThreadId()); if (!g_hHook) { AfxGetMainWnd()->EnableWindow(TRUE); return; } |
調(diào)用“打印”對(duì)話框
以下為引用的內(nèi)容: } LRESULT CALLBACK CMyHtmlView::CbtProc(int nCode, WPARAM wParam, LPARAM lParam) { switch (nCode) { case HCBT_CREATEWND: { HWND hWnd = (HWND)wParam; LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam; LPCREATESTRUCT pcs = pcbt->lpcs;
if ((DWORD)pcs->lpszClass == 0x00008002)//#32770,“打印”對(duì)話框類名 { if ( g_hWndDialog == 0 ) g_hWndDialog = hWnd; // 只保存一次保存“打印”窗口的句柄 } break; } case HCBT_DESTROYWND: { HWND hwnd = (HWND)wParam; if (hwnd == g_hWndDialog) { AfxGetMainWnd()->EnableWindow(TRUE);//恢復(fù)窗口狀態(tài) UnhookWindowsHookEx(g_hHook);//去除掛鉤 } break; } } return CallNextHookEx(g_hHook, nCode, wParam, lParam); } |
很簡(jiǎn)單吧,更重要的是這種方法確實(shí)有效。
分享:url傳遞中文的解決方案1、設(shè)置web.config文件。 以下為引用的內(nèi)容: <system.web> ...... <globalization requestEncoding="gb2312" responseEncoding=&
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 分析.NET上執(zhí)行多線程應(yīng)該注意的兩點(diǎn)
- 基于Asp.Net MVC4 Bundle捆綁壓縮技術(shù)的介紹
- 使用函數(shù)傳遞參數(shù)來(lái)執(zhí)行相應(yīng)的數(shù)據(jù)庫(kù)操作
- 專家詳解:復(fù)雜表達(dá)式的執(zhí)行步驟
- ASP.NET中的狀態(tài)管理
- 解析.Net框架下的XML編程技術(shù)
- 模板無(wú)憂:在.NET開(kāi)發(fā)中靈活使用TreeView控件
- 如何實(shí)現(xiàn)無(wú)刷新的DropdownList聯(lián)動(dòng)效果
- 揭秘.Net開(kāi)發(fā)人員必知的八個(gè)網(wǎng)站
- Asp.Net的繼承和多態(tài)性實(shí)例講解
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-將非模態(tài)對(duì)話框顯示為模態(tài)對(duì)話框。