在Delphi中使用PrintDialog列印對話框的時候,這個控件有三個選項,就是PrintRang那個屬性的三個選項,其中有一個選項三,讓我們自定義選擇頁碼範圍來列印。但是比較蛋疼的是,這個地方選中了之後啥子效果都沒有。無法制定自己的頁碼範圍,很是蛋疼。這裡實際上應該要有一個Edit之類的編輯框的,這樣可以讓使用者輸入1,2,3-4之類的頁碼範圍來整就比較人性化了。起初以為是自己沒有指定某屬性神馬的導緻,于是在控件的各個屬性中找,找的我蛋都要裂開了,都沒找出來似乎是隐藏了那個Edit的屬性。。。。無果,整開了PrintDialog的源碼看。也未發現相關的代碼。咋辦,咋辦呢。路總是人走出來的,目的就是要在這個彈出的對話框上加一個編輯框就OK了,方式很多,可以在彈出來之後,查找句柄,然後建立一個Edit,然後SetParent就上去了。這是一方面,另外一方面,就是要配合對話框上,使用者點選上面的選項來相應的關聯這個Edit為可用或非可用狀态。這個自然也是有辦法的,我首先想到的就是Hook了,于是就用Hook整了,WH_CallWndProc消息處理過程函數的Hook,就行了。至于是要攔截神馬消息,嘿嘿,這個是WinSDK的範疇,不熟悉的人,去翻番書,或者百度一番,就可以知道是WM_Command這個消息來處理視窗中的某些控件的消息處理的。首先就是要擷取那個彈出的列印對話框的句柄了,我說過了可以用FindWindow來找。不過我這裡要使用消息過程鈎子,那麼自然就不要這個了,直接從鈎子中擷取對話框句柄,會更加Happy。看看PrintDialog的代碼,俺們可以知道,神馬PrintDialog,OpenDialog,FontDialog打開都要觸發WM_InitDialog這個消息,就是初始化對話框的消息。是以,第一步,俺們就攔截這個消息就 可以擷取到句柄,然後建立俺們的Edit,然後将Edit設定到對話框中,俺們需要他在的位置。第二步,就是來攔截WM_Command,然後來處理和使用者點選的關聯處理咯。然後就是在對話框的Destroy消息中登出Hook,釋放Edit。于是這個過程就OK了
首先在打開對話框之前,注冊我們的過程處理鈎子,必須要之前注冊,因為要攔截WM_InitDialog消息嘛
然後是鈎子函數過程處理
可見,我這裡登出了WM_Destroy中的處理。目的是因為俺們還需要傳回這個Edit中的内容嘛,是以我們直接在使用完了之後登出鈎子,釋放Edit就行了!

實作之後的效果,就是這樣的咯
本文轉自 不得閑 部落格園部落格,原文連結: http://www.cnblogs.com/DxSoft/archive/2013/04/22/3035565.html ,如需轉載請自行聯系原作者