第九章 子視窗控制項part1

2021-05-12 07:17:09 字數 2782 閱讀 4316

hwndparent = getparent(hwnd);子視窗訊息處理程式能確定其父視窗的視窗控制代碼,hwnd是子視窗的視窗控制代碼.

如果想在您的電子**程式的某個角落放置乙個標有「recalculate」的按鈕,那麼您可以通過呼叫createwindow來建立這個按鈕。。要做的只是攔截wm_command訊息-當按鈕被按下時,它通過這一訊息通知您的視窗訊息處理程式。

9.1按鈕類別

子視窗向父視窗發訊息:

用滑鼠單擊按鈕時,子視窗控制項就向其父視窗傳送乙個wm_command訊息,攔截wm_command訊息並顯示wparam(低位:子視窗id)(高位:通知碼)和(子視窗控制代碼:lparam的值)

父視窗向子視窗傳送訊息:

知道id和父視窗控制代碼,您就能獲得子視窗控制代碼:hwndchild = getdlgitem(hwndparent, id);

按鍵:用來設計對話方塊時,bs_pushbutton控制項和bs_defpushbutton控制項的作用不同。但是當用作子視窗控制項時,兩種型態的按鈕作用相同,儘管bs_defpushbutton的邊框要粗一些。

按下滑鼠按鍵將使按鈕用三維陰影重畫自己,就好像真的被按下一樣。放開滑鼠按鍵時,就恢復按鈕的原貌,並向父視窗傳送乙個wm_command訊息和bn_clicked通知碼。

sendmessage(hwndbutton, bm_setstate, 1, 0);//通過給視窗傳送bm_setstate訊息來**按鈕閃動。

sendmessage(hwndbutton, bm_setstate, 0, 0);//使按鈕恢復正常,hwndbutton視窗控制代碼是從createwindow呼叫傳回的值。

也可以向按鍵傳送bm_getstate訊息,子視窗控制項傳回按鈕目前的狀態:如果按鈕被按下,則傳回true;如果按鈕處於正常狀態,則傳回false。

核取方塊:

核取方塊最常用的兩種樣式是bs_checkbox和bs_autocheckbox。

在使用bs_checkbox時,您需要自己向該控制項傳送bm_setcheck訊息來設定勾選標記。

sendmessage (hwndbutton, bm_setcheck, 1, 0) ;

當需要按鈕目前的狀態時,可以向控制項傳送bm_getcheck訊息:icheck = (int)sendmessage(hwndbutton, bm_getcheck, 0, 0);

其餘兩種核取方塊樣式是bs_3state和bs_auto3state,正如它們名字所暗示的,這兩種樣式能顯示第三種狀態-核取方塊內是灰色-它出現在向控制項傳送wparam等於2的wm_setcheck訊息時

單選按鈕:

當收到來自單選按鈕的wm_command訊息時,應該向它傳送wparam等於1的bm_setcheck訊息來顯示其選中狀態:sendmessage(hwndbutton, bm_setcheck, 1,  0);

分組方塊:

組方塊即樣式為bs_groupbox的選擇框,它是按鈕類中的特例,既不處理滑鼠輸入和鍵盤輸入,也不向其父視窗傳送wm_command訊息。分組方塊是乙個矩形框,分組方塊常用來包含其它的按鈕控制項。

改變按鈕文字:

setwindowtext(hwnd, pszstring) ;//hwnd是欲改變視窗的控制代碼,pszstring是乙個指向以null為終結的字串指標。

取得視窗目前的文字:

ilength = getwindowtext(hwnd, pszbuffer, imaxlength);

通過下面的呼叫來獲得特定文字的長度:

ilength = getwindowtextlength(hwnd);

可見的和啟用的按鈕:

如果在建立子視窗時,您沒有將ws_visible包含在視窗類別中,那麼直到呼叫showwindow時子視窗才會被顯示出來showwindow(hwndchild,sw_shownormal);如果將ws_visible包含在視窗類別中,就沒有必要呼叫showwindow。可以通過下面的呼叫來確定子視窗是否可見:iswindowvisible(hwndchild);

enablewindow(hwndchild, false);//使視窗不被啟用

enablewindow(hwndchild, true);//使視窗被啟用

iswindowenabled(hwndchild);//確定子視窗是否被啟用

按鈕和輸入焦點:

windows將輸入焦點從乙個視窗(例如乙個父視窗)轉換到另乙個視窗(例如乙個子視窗控制項)時,它首先給正在失去輸入焦點的視窗傳送乙個wm_killfocus訊息,wparam引數是接收輸入焦點的視窗的控制代碼。

9.2控制項與顏色

系統顏色:

可以使用getsyscolor和setsyscolors來獲得和設定這些系統顏色。

按鈕顏色:

color_btnface被用於按鍵主要的表面顏色,以及其它按鈕主要的背景顏色。

wndclass.hbrbackground = (hbrush)(color_btnface + 1) ;//加1目的是防止其值為null,而沒有任何其它目的。

使用settextcolor和setbkcolor將文字和文字背景的顏色改變為系統顏色

setbkcolor(hdc, getsyscolor(color_btnface)) ;  

settextcolor(hdc, getsyscolor(color_windowtext)) ;

擁有者繪製按鈕:

如果您只需要在按鈕中顯示圖示或位圖,您可以用bs_icon或bs_bitmap樣式,並用bm_setimage訊息設定位圖。但是,對於bs_ownerdraw樣式的按鈕,它允許完全自由地繪製按鈕。

第九章 子視窗控制項part2

9.3靜態類別 在createwindow函式中指定視窗類別為 static 靜態類別還包括了視窗樣式ss icon和ss useritem,但是當它們被用作子視窗控制項時卻沒有任何意義。在createwindow程式中指定視窗類別為 static 您就可以建立靜態文字的子視窗控制項。這些子視窗非常...

第九章 執行緒與核心物件的同步(1)

程序核心物件,是乙個 booble 值,程序執行的時候核心物件處於未通知狀態 false 當程序終止的時候處於已通知狀態 true 當執行緒等待的核心物件處於未通知狀態時,執行緒不可排程。當核心物件變為已通知狀態時執行緒立即變為可排程狀態並投入執行。可處於已通知態和為通知態的內和物件 程序 執行緒 ...

《TCP IP詳解 卷1 協議》 第九章 IP選路

需要進行選路的資料報可以由本地主機產生,也可以由其他主機產生。在後一種情況下,主機必須配置成乙個路由器,否則通過網路介面接收到的資料報,如果目的位址不是本機就要被丟棄。ip搜尋路由表的幾個步驟 1 搜尋匹配的主機位址 2 搜尋匹配的網路位址 3 搜尋預設表項 預設表項一般在路由表中被指定為乙個網路表...