在編寫分隔條的視窗過程之前,我先來處理對話方塊的wm_size訊息作為分隔條視窗過程的乙個熱身。**如下(你會發現在整個的**中我沒有對htree、hstatus、hsplitter以及hlist做任何的宣告,那是因為對於這個簡單的示例,我將所有的這些東西都宣告為了全域性變數):
case wm_size:
break;
你肯定已經注意到了,這段**的大部分篇幅都是在和矩形做遊戲。的確是這樣,因為調整視窗大小的過程就是乙個改變各個子視窗的位置和大小的過程。這個過程用語言敘述就是:1、首先,將狀態列放置在對話方塊的最下方;2、第二步,不改變樹形檢視的位置和寬度,重設它的高度;3、不改變分隔條的位置和寬度,重設它的高度;4、使列表檢視佔滿剩餘的客戶區。
如果你弄懂了上面的**,那麼分隔條的視窗過程也就沒有任何難度了:
lresult callback procsplitter(hwnd hwnd, uint msg, wparam wparam, lparam lparam)
}break;
default:
return defwindowproc(hwnd, msg, wparam, lparam);
}return 0;
}setcapture和releasecapture是分別在滑鼠左鍵按下與釋放的時候捕獲和釋放滑鼠,這是分隔條的一般要求。這段**中的核心部分就是在處理滑鼠移動的事件,就是當滑鼠左鍵按下並且分隔條捕獲滑鼠的時候來改變三個相關視窗的位置和寬度。具體的矩形操作與主視窗wm_size的**原理相似,我就不多說了。我之所以不使用movewindow之類的函式來實現改變大小,就是因為這些函式會使窗體的多次重繪而導致整個窗體的閃爍——而事實上我並不希望狀態列也一起閃爍。
上邊的分隔條是一種「動態」的分隔條,就是說在移動分隔條的同時視窗的大小也發生了改變。以下我再介紹一種「靜態」的分隔條,即在拖動分隔條的時候出現一條豎線,由這一條線來指示分隔條的分隔結果。
如果說動態的分隔條是在和矩形做遊戲,那麼靜態的分隔條就是在和圖形做遊戲了。首先請大家看我的**:
lresult callback procsplitter(hwnd hwnd, uint msg, wparam wparam, lparam lparam)
break;
case wm_lbuttonup:
break;
case wm_mousemove:
}break;
default:
return defwindowproc(hwnd, msg, wparam, lparam);
}return 0;
}這段**的核心部分,就是它的畫線和擦線部分。在這裡我玩弄了乙個小把戲,就是利用了setrop2函式的r2_notxorpen模式:在這個模式下作圖,只要在先前畫過線的地方再畫一道線,那麼使用者看到的效果就是原來的線被擦除了。這樣一來,只需要再使用乙個static變數x,就可以完成這個過程了。
當然分隔條的種類有很多,例如vcl中的tsplitter中就包括了不同樣式的分隔條,不過效果無非是改變了畫線的樣式之類,在此我就不多討論了。
在sdk中使用進度條
include windows.h include commctrl.h initcommoncontrols pragma comment lib,comctl32 initcommoncontrols 過程函式的返回值都是lresult,型別都是callback lresult callback...
MFC分屏之後分隔條固定
分割視窗的方法見mfc基於單文件分割視窗這篇文章 採用這種思想但是最後最終在 中實現的是分成兩一列,再把第一行分成一行兩列的效果 分割之後想固定分隔條的大小 類檢視 新增類 然後再手動改為繼承csplitterwnd類 過載onlbuttondown,onlbuttonup,onlbuttondbl...
semantic UI按鈕 容器分隔條概要總結
3 分隔條divider 乙個按鈕只能有乙個圖示。圖示大小,顏色可記性設定 開關按鈕 詳細描述,請參考 容器是乙個元素,根據使用者螢幕的大小將頁面元素包含到合理的最大寬度。容器與 grid 或者 menu 一起使用,能將其寬度限制為合理尺寸,保證頁面的美觀。降低其最大寬度更自然地容納一列文字。文字容...