WIN 下的超動態菜單(一)介紹 作者:黃山松,發表於博客園:http://www.cnblogs.com/tomview/ WINDOWS 編程中,通常彈出菜單的方法是在資源文件中建立菜單資源,然後在程式中裝載資源顯示菜單;另外可以用動態創建菜單的方法,但是逐次調用創建菜單添加菜單項的函數很麻煩。... ...
WIN 下的超動態菜單(一)介紹
作者:黃山松,發表於博客園:http://www.cnblogs.com/tomview/
WINDOWS 編程中,通常彈出菜單的方法是在資源文件中建立菜單資源,然後在程式中裝載資源顯示菜單;另外可以用動態創建菜單的方法,但是逐次調用創建菜單添加菜單項的函數很麻煩。本文給出一個封裝的自動創建動態菜單的類。
此類 auto_dynamenu 中只有一個靜態函數 dynamenu,封裝到類中的原因是這樣可以把函數體放在頭文件裡面,使用的時候,直接包含頭文件就可以了,不需要在工程內部添加實現文件,使用方便,這也是這個類叫做 auto_… 的原因。
叫超動態菜單的原因是各種菜單都可以非常容易地通過按照格式寫簡單的字元串來實現,不需要創建菜單資源,不需要再手工調用WIN32菜單函數,非常方便創建各種複雜的菜單。在代碼中隨時隨地,通過寫一個菜單的字元串就可以再通過一個函數調用顯示菜單,獲取菜單的選擇。
先舉幾個例子:
【1】顯示普通動態菜單:
char szMenu[] = "選項1=1\n" "選項2=2\n" "~\n" "選項3=3\n" ; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);
【2】顯示多級動態普通菜單
char szMenu[] = "第一組|選項1=1\n" "第一組|選項2=2\n" "~\n" "第二組|選項3=3\n" ; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);
【3】顯示有標記的菜單
char szMenu[] = "第一組|^選項1=1\n" "第一組|選項2=2\n" "第一組|~\n" "第一組|*選項3=3\n" "第一組|選項4=4\n" "~\n" "第二組|#禁用的菜單=5\n" "~\n" "#禁用的菜單(灰色)=6\n" ; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);
【4】通過動態菜單設置標記位
自動在該位標記為1的選項上顯示選中標記,菜單中可以有多個項有選中標記。
char szMenu[] = "標記1=1\n" "標記2=2\n" "標記3=4\n" "標記4=8\n" "標記5=0x10\n" "標記6=0x20\n" "標記7=0x40\n" "標記8=0x80\n" ; flags = (DWORD)auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 2, flags);
【5】通過菜單選擇整數值
自動在選定的整數選項前加選中標記,菜單項中僅有一項相等的數值的選中。
char szMenu[] = "整數1=1\n" "整數20=20\n" "整數32=32\n" "整數0x99=0x99\n" ; val = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 1, val);
【6】根據程式數據生成動態的菜單字元串
手動管理每個菜單選項前面的選中標記。
char szMenu[1024] = {0}; int n = 0; if (value == 2) n += sprintf(szMenu + n, "^"); n += sprintf(szMenu + n, "值2=2\n"); if (value == 4) n += sprintf(szMenu + n, "^"); n += sprintf(szMenu + n, "值4=4\n"); value = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);
【7】返回字元串的菜單
char szMenu[] = "字元串1=字元串值1\n" //選這個選項,返回等號後字元串“字元串值1” "字元串2\n" //這個選項沒有等號,選這個選項,返回菜單字元串“字元串2” ; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);
if (index != 0)
{
char* string = (char*)index;
}
【8】可以自動確定顯示菜單的位置
可以指定顯示菜單的坐標位置,也可以自動根據滑鼠的當前位置的控制項類型自動確定顯示的菜單位置。譬如,自動顯示在按鈕的下方,顯示在工具欄按鈕的下方,顯示在列表當前項的下方等,如下圖所示:
待續
後續還要發表:《WIN 下的超級動態菜單(二)用法》,《WIN 下的超級動態菜單(三)代碼》。
可以在下麵的鏈接下載代碼和示常式序:
http://files.cnblogs.com/files/tomview/dynamenu_20160524.rar