然而切換ws_caption僅僅是工作的一半。關鍵技巧在於視窗樣式修改之後怎樣重新繪製視窗的非客戶區。呼叫cwnd::invalidate()不行,要用swp_drawframe引數呼叫setwindospos才可以:
setwindowpos (null, 0, 0, 0, 0, swp_nomove | swp_nosize | swp_nozorder | swp_drawframe);
這樣就使得整個視窗包括標題欄被重繪。其它傳遞給setwindowpos的swp標誌儲存了視窗的位置、大小、z次序,z次序是從前向後的視窗。
函式原型及用法如下:
cwnd::modifystyle
1.作用:
呼叫這個函式修改視窗的風格
2.函式原型:
bool modifystyle(dword dwremove,dword dwadd,uint nflags=0);
3.引數含義:
dwremove 指定修改時要刪除的視窗風格。
dwadd 指定修改時將要增加的視窗風格。
nflags 該引數將被傳給setwindowpos,預設為0
4.返回值:
如果該函式成功呼叫返回乙個非0值,否則返回0;
5.備註
如果nflags不為0, modifystyle 將呼叫windows api 函式setwindowpos 並且結合nflags和以下四個預先布置好的標誌重畫該視窗。
swp_nosize 保持當前大小。
swp_nomove 保持當前位置.。
swp_nozorder 保持當前的z次序。
swp_noactivate 不啟用該視窗。
6.用法:
1、修改控制項的原有屬性用 modifystyle(1,ws_disabled);(實際測試時只要是》=0的整形數就行)
2、改回來的話要用modifystyle(ws_disabled,1);(實際測試時只要是》=0的整形數就行)
cwnd::getsystemmenu
cmenu* getsystemmenu( bool brevert ) const;
返回值:
如果brevert為false,則返回系統選單的乙份拷貝;如果為true,則返回值沒有定義。返回的指標可能是臨時的,不能被儲存以供將來使用。
引數:brevert 指定要採取的動作。如果brevert為false,則getsystemmenu返回當前使用的控制選單的乙個拷貝的控制代碼。這個拷貝最初與控制選單一樣,但是可以被修改。如果brevert為true,getsystemmenu將控制選單復位到原來的狀態。以前控制選單可能發生的變化都被銷毀。這時返回值沒有定義。
系統選單id的值是有範圍的通常是 0xf**0的形式,最後一位一般是0
比如:sc_close-----0xf060 sc_size------0xf000等等
所以如果要讓(nid & 0xfff0) == idm_mysysitem成立,你的選單項id必須是0x***0的形式
比如0x0010,否則就會出錯。至於為什麼你的nid == idm_mysystem能執行,肯定是因為 你的idm_mysystem定義成了101,102之類的常量整數了吧
建議:
如果要在系統選單裡新增自定義的選單項,那麼最好將選單項id定義為0x***0的形式
就目前系統選單id為0xf000---0xf180加上分隔條0xf00f 一共20個
為了區別你可以將最高位置零定義成0x0000,0x0010,0x0020-------
在系統選單中新增選單項
1 新建乙個基於對話方塊的應用程式 2 在對話方塊類中定義乙個選單指標m pmenu,用於指向系統選單.3 主要程式 在對話方塊初始化時 oninitdialog函式中 獲取系統選單指標,向系統選單中新增選單項.m pmenu getsystemmenu false 獲取正在使用的系統選單指標 響應...
顯示和隱藏系統檔案
1 右鍵要隱藏的資料夾,點 屬性 選中隱藏 再開啟 我的電腦 工具 資料夾選項 檢視 勾選隱藏所有檔案和資料夾 確定即可。若要使用該隱藏資料夾,可開啟 我的電腦 工具 資料夾選項 檢視 勾選 顯示所有檔案和資料夾 就可。但由於只要選擇 顯示所有檔案 單選就能將它們全部顯示出來,因此,必須對 顯示所有...
窗體中新增控制項與窗體顯示和隱藏
對於乙個應用程式而言,控制項是使用者介面的積木,他們具備互動式的特徵 新增控制項的方法 拖 拉 拽 新增控制項的另一種方法 即通過窗體的controls類的 add方法,格式如下 窗體的標誌.controls.add 控制項識別符號 例子 建立乙個 mybut 乙個物件 button mybut n...