MiniGUI - 列表框

CTRL_LISTBOX
 
类型
单选列表框(默认)
多选列表框
高级列表框,含图标、位图或者复选框
 
风格选项
LBS_MULTIPLESEL 多选
LBS_USEICON 使用位图bitmap或图标icon
LBS_CHECKBOX 带复选框
LBS_NOTIFY 产生通知消息
LBS_SORT 排序
WS_BORDER 边框
WS_VSCROLL 垂直滚动条
WS_HSCROLL 水平滚动条
 
消息
1. 添加条目
1) 添加纯字符串的条目
添加字符串到列表框最后一项:SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM)string);
创建列表框时指定LBS_SORT选项则自动排序
 
添加字符串到列表框指定位置:SendMessage (hwndList, LB_INSERTSTRING, index, (LPARAM)string);
index=-1时,添加到最后一项
创建列表框时指定LBS_SORT选项则自动排序,忽略index
2) 添加含图标的条目
LISTBOXITEMINFO lbii;
 
lbii.hIcon = LoadIconFromFile (HDC_SCREEN, "res.ico", 1); 
lbii.cmFlag = CMFLAG_CHECKED;
lbii.string = "abcdefg";
 
SendMessage (hwndList , LB_ADDSTRING, 0, (LPARAM)&lbii);
3) 添加含位图的条目
LISTBOXITEMINFO lbii;
 
lbii.hIcon = (DWORD) GetSystemBitmap (SYSBMP_MAXIMIZE);
lbii.cmFlag = CMFLAG_CHECKED | IMGFLAG_BITMAP;
lbii.string = "abcdefg";
 
SendMessage (hwndList , LB_ADDSTRING, 0, (LPARAM)&lbii);
4) 添加多个纯字符串条目
int num = 2;
const char text[num][] = {“item1”, “item2”};
 
SendMessage (hwndList, LB_MULTIADDITEM, num, (LPARAM)text);
5) 添加多个含图标、位图或复选框的条目
int num = 2;
LISTBOXITEMINFO lbii[num]; 
 
lbii[0].hIcon = LoadIconFromFile (HDC_SCREEN, "res1.ico", 1);
lbii[0].cmFlag = CMFLAG_CHECKED;
lbii[0].string = "item1";
 
lbii[1].hIcon =LoadIconFromFile (HDC_SCREEN, "res2.ico", 1);
lbii[1].cmFlag = CMFLAG_CHECKED;
lbii[1].string = "item2";
 
SendMessage (hwndList, LB_MULTIADDITEM, num, (LPARAM)lbii);
返回值:
LB_ERRSPACE 内存不足
LB_ERR 其他原因错误
LB_OKAY 成功
 
2. 删除条目
删除指定条目:SendMessage (hwndList, LB_DELETESTRING, index, 0);
清空列表框内容:SendMessage (hwndList, LB_RESETCONTENT, 0, 0);
 
3. 选择和取得条目
获取条目个数:int count = SendMessage (hwndList, LB_GETCOUNT, 0, 0);
获取指定条目字符串长度:int length = SendMessage (hwndList, LB_GETTEXTLEN, index, 0);
获取指定条目字符串: int length = SendMessage (hwndList, LB_GETTEXT, index, (LPARAM)buffer);
设置指定条目字符串:SendMessage (hwndList, LB_SETTEXT, index, buffer);
设置高级列表框指定条目:
LISTBOXITEMINFO lbii;
lbii.hIcon = LoadIconFromFile (HDC_SCREEN, "res.ico", 1);
lbii.cmFlag = CMFLAG_CHECKED;
lbii.string = "set item";
SendMessage (hwndList  , LB_SETITEMDATA, index, (LPARAM)&lbii);
 
获取高级列表框指定条目:
LISTBOXITEMINFO lbii;
SendMessage (hwndList  , LB_GETITEMDATA, index, (LPARAM)&lbii);
单选列表框设置选中条目:SendMessage (hwndList, LB_SETCURSEL, index, 0);
单选列表框获取选中条目的索引项:int index = SendMessage (hwndList, LB_GETCURSEL, 0, 0);
如果没有条目被选中,返回LB_ERR
多选列表框设置指定条目的选中状态:SendMessage (hwndList, LB_SETSEL, wParam, (LPARAM)index);
wParam非0则选择并加亮某一条目,0则取消选中
多选列表框获取指定条目的选中状态:int select = SendMessage (hwndList, LB_GETSEL, index, 0);
select非0则选中,0则没选中
多选列表框获取当前选中的条目个数:int sel_count = SendMessage (hwndList, LB_GETSELCOUNT, 0, 0L);
多选列表框获取当前选中的条目索引:
int* sel_items;
sel_items = alloca (sizeof(int)*sel_count);
SendMessage (hwndList, LB_GETSELITEMS, sel_count, sel_items);
查找含有指定字符串的条目:
模糊匹配:int index = SendMessage (hwndList, LB_FINDSTRING, (LPARAM)string);
精确匹配:int index = SendMessage (hwndList, LB_FINDSTRINGEXACT, (LPARAM)string);
 
4. 设置和获取复选框状态
获取指定条目的复选框状态:int status = SendMessage (hwndList, LB_GETCHECKMARK, index, 0);
返回值:
CMFLAG_CHECKED 选择状态
CMFLAG_PARTCHECKED 部分选择状态
CMFLAG_BLANK 未选择状态
LB_ERR 没有找到指定条目
 
设置指定条目的复选框状态:int ret = SendMessage (hwndList, LB_SETCHECKMARK, index, (LPARAM)status);
返回值:
LB_OKAY 成功
LB_ERR 没有找到指定条目
 
5. 设置指定条目加粗显示
int ret = SendMessage (hwndList, LB_SETITEMBOLD, index, (LPARAM)status) ; 
参数:status为1则加粗,0则正常显示
 
6. 自定义排序方式
static int my_strcmp (const char* s1, const char* s2, size_t n);
SendMessage (hwndList, LB_SETSTRCMPFUNC, 0, (LPARAM)my_strcmp);
 
7. 附加数据
设置附加数据:
int addData
SendMessage(hwndList , LB_SETITEMADDDATA, index , addData);
 
获取附加数据:
int addData
addData = SendMessage(hwndList , LB_GETITEMADDDATA, curSel, 0);
8. 设置和获取条目高度
设置条目高度:SendMessage(hwndList , LB_SETITEMHEIGHT, 0, (LPARAM)height);
获取条目高度:int height = SendMessage(hwndList , LB_GETITEMHEIGHT, 0, 0);
 
通知
1. 具有 LBS_NOTIFY 风格的列表框可能产生的通知消息
LBN_ERRSPACE    内存分配失败。
LBN_SELCHANGE    单项选择列表框的当前选择项发生变化。
LBN_CLICKED    用户在列表框某条目上单击了鼠标左键。
LBN_DBLCLK    用户在列表框某条目上双击了鼠标左键。
LBN_SELCANCEL    用户取消了某个条目的选择。
LBN_SETFOCUS    列表框获得了输入焦点。
LBN_KILLFOCUS    列表框失去了输入焦点。
LBN_CLICKCHECKMARK    用户单击了条目的检查框。
LBN_ENTER    用户在列表框中按下 ENTER 键
2. 如果调用SetNotificationCallback函数设定了列表框控件的通知回调函数,则控件不会向父窗口发送 MSG_COMMAND 通知消息,而是会直接调用设定的通知回调函数
 
 mg-samples的列表框示例
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <stdarg.h>
  4 #include <string.h>
  5 #include <sys/stat.h>
  6 #include <sys/time.h>
  7 #include <sys/types.h>
  8 #include <unistd.h>
  9 #include <dirent.h>
 10 #include <pwd.h>
 11 #include <errno.h>
 12 
 13 #include <minigui/common.h>
 14 #include <minigui/minigui.h>
 15 #include <minigui/gdi.h>
 16 #include <minigui/window.h>
 17 #include <minigui/control.h>
 18 
 19 #define IDL_DIR    100
 20 #define IDL_FILE   110
 21 #define IDC_PATH   120
 22 
 23 #define     deleting_the_files              "Deleting the files"
 24 #define     directories                     "Directories:"
 25 #define     files_                          "Files:"
 26 #define     path_                           "Path: "
 27 #define     delete_                         "Delete"
 28 #define     cancel_                         "Cancel"
 29 #define     deleting_files_                 "Deleting files"
 30 
 31 static DLGTEMPLATE DlgDelFiles =
 32 {
 33     WS_BORDER | WS_CAPTION,
 34     WS_EX_NONE,
 35     100, 100, 500, 250,
 36     deleting_the_files,
 37     0, 0,
 38     7, NULL,
 39     0
 40 };
 41 
 42 static CTRLDATA CtrlDelFiles[] =
 43 { 
 44     {
 45         CTRL_STATIC,
 46         WS_VISIBLE | SS_SIMPLE, 
 47         10, 10, 130, 15,
 48         IDC_STATIC,
 49         directories,
 50         0
 51     },
 52     {
 53         CTRL_LISTBOX,
 54         WS_VISIBLE | WS_VSCROLL | WS_BORDER | LBS_SORT | LBS_NOTIFY,
 55         10, 30, 130, 100,
 56         IDL_DIR,
 57         "",
 58         0
 59     },
 60     {
 61         CTRL_STATIC,
 62         WS_VISIBLE | SS_SIMPLE, 
 63         150, 10, 130, 15, 
 64         IDC_STATIC, 
 65         files_,
 66         0
 67     },
 68     {
 69         CTRL_LISTBOX,
 70         WS_VISIBLE | WS_VSCROLL | WS_BORDER | LBS_SORT | LBS_AUTOCHECKBOX,
 71         150, 30, 260, 100,
 72         IDL_FILE,
 73         "",
 74         0
 75     },
 76     {
 77         CTRL_STATIC,
 78         WS_VISIBLE | SS_SIMPLE, 
 79         10, 150, 290, 15, 
 80         IDC_PATH, 
 81         path_,
 82         0
 83     },
 84     {
 85         "button",
 86         WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
 87         10, 170, 130, 25,
 88         IDOK, 
 89         delete_,
 90         0
 91     },
 92     {
 93         "button",
 94         WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
 95         150, 170, 130, 25,
 96         IDCANCEL,
 97         cancel_,
 98         0
 99     },
100 };
101 
102 static void fill_boxes (HWND hDlg, const char* path)
103 {
104 #ifdef __NOUNIX__
105     LISTBOXITEMINFO lbii;
106 
107     lbii.string = "file.1";
108     lbii.cmFlag = CMFLAG_BLANK;
109     lbii.hIcon = 0;
110     SendDlgItemMessage (hDlg, IDL_FILE, LB_ADDSTRING, 0, (LPARAM)&lbii);
111 
112     lbii.string = "file.2";
113     SendDlgItemMessage (hDlg, IDL_FILE, LB_ADDSTRING, 0, (LPARAM)&lbii);
114 
115     lbii.string = "file.3";
116     SendDlgItemMessage (hDlg, IDL_FILE, LB_ADDSTRING, 0, (LPARAM)&lbii);
117 #else
118     struct dirent* dir_ent;
119     DIR*   dir;
120     struct stat ftype;
121     char   fullpath [PATH_MAX + 1];
122 
123     SendDlgItemMessage (hDlg, IDL_DIR, LB_RESETCONTENT, 0, (LPARAM)0);
124     SendDlgItemMessage (hDlg, IDL_FILE, LB_RESETCONTENT, 0, (LPARAM)0);
125     SetWindowText (GetDlgItem (hDlg, IDC_PATH), path);
126     
127     if ((dir = opendir (path)) == NULL)
128          return;
129 
130     while ( (dir_ent = readdir ( dir )) != NULL ) {
131 
132         /* Assemble full path name. */
133         strncpy (fullpath, path, PATH_MAX);
134         strcat (fullpath, "/");
135         strcat (fullpath, dir_ent->d_name);
136         
137         if (stat (fullpath, &ftype) < 0 ) {
138            continue;
139         }
140 
141         if (S_ISDIR (ftype.st_mode))
142             SendDlgItemMessage (hDlg, IDL_DIR, LB_ADDSTRING, 0, (LPARAM)dir_ent->d_name);
143         else if (S_ISREG (ftype.st_mode)) {
144             LISTBOXITEMINFO lbii;
145 
146             lbii.string = dir_ent->d_name;
147             lbii.cmFlag = CMFLAG_BLANK;
148             lbii.hIcon = 0;
149             SendDlgItemMessage (hDlg, IDL_FILE, LB_ADDSTRING, 0, (LPARAM)&lbii);
150         }
151     }
152 
153     closedir (dir);
154 #endif
155 }
156 
157 static void dir_notif_proc (HWND hwnd, int id, int nc, DWORD add_data)
158 {
159     if (nc == LBN_DBLCLK || nc == LBN_ENTER) {
160         int cur_sel = SendMessage (hwnd, LB_GETCURSEL, 0, 0L);
161         if (cur_sel >= 0) {
162             char cwd [MAX_PATH + 1];
163             char dir [MAX_NAME + 1];
164             GetWindowText (GetDlgItem (GetParent (hwnd), IDC_PATH), cwd, MAX_PATH);
165             SendMessage (hwnd, LB_GETTEXT, cur_sel, (LPARAM)dir);
166 
167             if (strcmp (dir, ".") == 0)
168                 return;
169 
170             if (strcmp (dir, "..") == 0) {
171                 char* slash;
172 
173                 if (strcmp (cwd, "/") == 0)
174                     return;
175 
176                 slash = strrchr (cwd, '/');
177                 if (slash == NULL)
178                     return;
179                 if (slash == cwd)
180                     strcpy (cwd, "/");
181                 else
182                     *slash = '\0';
183             }
184             else {
185                 if (strcmp (cwd, "/") != 0)
186                     strcat (cwd, "/");
187                 strcat (cwd, dir);
188             }
189 
190             fill_boxes (GetParent (hwnd), cwd);
191         }
192     }
193 }
194 
195 static void file_notif_proc (HWND hwnd, int id, int nc, DWORD add_data)
196 {
197     /* Do nothing */
198 }
199 
200 static void prompt (HWND hDlg)
201 {
202     int i;
203 #ifdef _LANG_ZHCN
204     char files [1024] = "你选择要删除的文件是:\n";
205 #else
206     char files [1024] = "The files followed will be deleted\n";
207 #endif
208     for (i = 0; i < SendDlgItemMessage (hDlg, IDL_FILE, LB_GETCOUNT, 0, 0L); i++) {
209     char file [MAX_NAME + 1];
210         int status = SendDlgItemMessage (hDlg, IDL_FILE, LB_GETCHECKMARK, i, 0);
211         if (status == CMFLAG_CHECKED) {
212             SendDlgItemMessage (hDlg, IDL_FILE, LB_GETTEXT, i, (LPARAM)file);
213         strcat (files, file);
214         strcat (files, "\n");
215     }
216     }
217 
218     MessageBox (hDlg, files, deleting_files_, MB_OK | MB_ICONINFORMATION);
219 
220 }
221 
222 static int DelFilesBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
223 {
224     switch (message) {
225     case MSG_INITDIALOG:
226     {
227         char cwd [MAX_PATH + 1];
228         SetNotificationCallback (GetDlgItem (hDlg, IDL_DIR), dir_notif_proc);
229         SetNotificationCallback (GetDlgItem (hDlg, IDL_FILE), file_notif_proc);
230         fill_boxes (hDlg, getcwd (cwd, MAX_PATH));
231         return 1;
232     }
233         
234     case MSG_COMMAND:
235         switch (wParam) {
236         case IDOK:
237             prompt (hDlg);
238         case IDCANCEL:
239             EndDialog (hDlg, wParam);
240             break;
241         }
242         break;
243         
244     }
245     
246     return DefaultDialogProc (hDlg, message, wParam, lParam);
247 }
248 
249 int MiniGUIMain (int argc, const char* argv[])
250 {
251 #ifdef _MGRM_PROCESSES
252     JoinLayer(NAME_DEF_LAYER , "listbox" , 0 , 0);
253 #endif
254 
255     DlgDelFiles.controls = CtrlDelFiles;
256     
257     DialogBoxIndirectParam (&DlgDelFiles, HWND_DESKTOP, DelFilesBoxProc, 0L);
258 
259     return 0;
260 }
261 
262 #ifdef _MGRM_THREADS
263 #include <minigui/dti.c>
264 #endif

posted @ 2014-04-09 15:33  paullam  阅读(1627)  评论(0编辑  收藏  举报