用VC 設計窗體探測器(控制代碼)

2021-05-21 18:11:06 字數 2412 閱讀 5981

目標很簡單,利用enablewindow函式啟用不可用或無效的控制項按鈕,當然,這窗體探測器是必不可少了,原以為很簡單,但實際行動起來,卻遇到不少麻煩,現將經過記錄下來,供有興趣的朋友參考。

我們大都見過spyxx中的窗體探測器,當滑鼠在窗體探測器上按下左鍵時,更改滑鼠樣式,同時捕獲滑鼠,探測滑鼠下的窗體直到滑鼠左鍵鬆開。這樣我們可以寫出**框架了:

case wm_lbuttondown://滑鼠左鍵按下,檢測拖動還是探測

//並且不屬於本執行緒

if(getwindowthreadprocessid(hwndpoint,null)!=getcurrentthreadid())

else

//顯示窗體資訊

showwindowmessage(hwnd,hwndnow);

} }

else }

//如果左鍵鬆開,則跳出

else if(msg.message==wm_lbuttonup) }

xorborder(hwndnow);

//釋放滑鼠並恢復滑鼠樣式

setcursor(loadcursor(null,(lpctstr)idc_arrow));

releasecapture();

} break;

} 這裡的問題就在 windowfrompoint 和 xorborder 中.這裡我們先看第一版xorborder:

void xorborder(hwnd hwnd)

然而結果總以失敗告終,檢視setrop2資料,隱隱約約感覺它僅對畫筆起作用,畫刷無效(僅代表個人觀點,正誤難辨)。於是將其改為rectangle,然而它可是連邊框帶矩形內部全部搞定了,這並不是我要的效果呀,這該怎麼辦呢?看我的最終解決方案:

void xorborder(hwnd hwnd)

我將當前畫刷選擇為空,我不知道這種方法是否正統,反正msdn未找到,雖然看著僅僅是小小的改動,倒是費了我好大功夫,我可是一直在framerect上打轉呀!

現在我們開看 windowfrompoint :msdn上說該函式跳過無效按鈕,需要使用childwindowfrompoint來解決,然而,問題並不是那麼簡單,先看下面這段資源檔案:

idd_dialog1 dialogex 0, 0, 186, 110

style ds_setfont | ds_modalframe | ds_fixedsys | ws_popup | ws_caption |

ws_sysmenu

caption "dialog"

font 8, "ms shell dlg", 400, 0, 0x1

begin

groupbox "靜態",idc_static,45,14,81,69

control "選中1",idc_check1,"button",bs_autocheckbox | ws_tabstop,

57,28,61,16

control "選中1",idc_check2,"button",bs_autocheckbox | ws_tabstop,

57,54,60,10

end

我試驗過,要想得到idc_check1,idc_check2,用上面的兩個函式是無法實現的,(你知道嗎,groupbox是button類,而不是static,直到今天我才知道),請不要告訴我改變groupbox的tab鍵順序,我們的探測器要面對各種情況,下面看我的解決方案:

hwnd brotherwindowfrompoint(hwnd hwndpoint,const point point)

else if(

((rcnow.bottomrcpoint.top)&&

(rcnow.left>rcpoint.left)&&(rcnow.leftrcpoint.top)&&

(rcnow.right>rcpoint.left)&&(rcnow.rightrcpoint.top)&&(rcnow.toprcpoint.left)&&(rcnow.leftrcpoint.top)&&(rcnow.toprcpoint.left)&&(rcnow.right

該函式檢測同層視窗,獲得指定點內,巢狀最深的視窗,由此我們便可以生成我們自己的windowfrompoint

hwnd mywindowfrompoint(const point point)

//*/

} return hwndpoint;

} 該函式首先判斷是否是頂層窗體,如果不是,首先進行寬度搜尋,雖然麻煩了些,然而卻不得不如此。順便說一下,vc資源編輯器中正在設計的對話方塊擁有disable屬性,spyxx你的窗體探測器也不能得到其內的所有控制項控制代碼,而該函式所向無敵,如果去掉brotherwindowfrompoint函式內的可見性判斷,隱藏窗體也無處藏身。有興趣的朋友可以親自設計一下,如果你是懶惰者,可到華軍軟體園下在該程式紅色間諜.

VC 製作透明窗體

在2000下 定義常量 define ws ex layered 0x00080000 define lwa alpha 0x00000002 宣告函式 extern c 標頭檔案 產生透明視窗 不要忘了給視窗的exstyle加入ws ex layered屬性 setwindowlong getsa...

用VC 來設計ActiveX控制項

用vc 來設計activex控制項 派生類基類實現功能 colecontrolmodule 控制項例項的初始化和撤消 ctestctrl colecontrol 控制項視窗的建立 更新及訊息處理 ctestproppage colepropertypage 控制項屬性頁的設定及與實際屬性值的交換 編...

用VC 來設計ActiveX控制項

用vc 來設計activex控制項 周勇生 2001年07月05日 14 03 我們假定專案名為test。建立工作完成後,開啟workspace檔案test.dsw,可以看到系統生成的test控制項框架,主要的類及實現功能描述見下表 編譯此專案,生成test.ocx。在當前的developer st...