返回列表 发帖

【教学视频】《C语言也能干大事》第十节:常见控件及菜单

《C语言也能干大事》已经录制第二版,不推荐初学者学习这里的旧版,因此请到下面的地址( http://www.rupeng.com/forum/forum-52-1.html )学习第二版。

在线视频(非清晰在线版):




如鹏电骡(verycd)下载站:http://www.verycd.com/topics/2800166/

高清版
不提供下载

由于录制视频后半段的时候电脑有一些故障,所以后半段的画面和声音有些不同步,请同学们看到那块儿的时候不要困惑,以后我会尽力避免此类情况。

板书:
7ListBox
1)添加项:
如果采用LBS_SORT样式,那么填入清单方块最简单的方法是借助LB_ADDSTRING消息:
SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) szString) ;

如果没有采用LBS_SORT,那么可以使用LB_INSERTSTRING指定一个索引值,将字符串插入到清单方块中:
SendMessage (hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString) ;
示例代码:
SendMessage(hwndLB,LB_INSERTSTRING,0,(LPARAM)TEXT("你好"));
2)删除项:
在指定索引值的同时使用LB_DELETESTRING参数,这就可以从清单方块中删除字符串:
SendMessage (hwndList, LB_DELETESTRING, iIndex, 0) ;
3)取得有多少项:
iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0) ;(4)选定某一项SendMessage (hwndList, LB_SETCURSEL, iIndex, 0) ;将iParam设定为-1则取消所有选择(5) 确定目前选项的索引:iIndex = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;如果没有项目被选中,那么从呼叫中传回的iIndex值为LB_ERR。(6)将某项目复制到文字缓冲区中:iLength = SendMessage (
hwndList, LB_GETTEXT, iIndex,

(LPARAM) szBuffer) ;
确定清单方块中字符串的长度:iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) ;对以NULL字符终结的字符串长度来说,szBuffer数组必须够大。您也许想用LB_GETTEXTLEN先分配一些局部内存来存放字符串。
课下练习:
用户在【姓名】中输入姓名,点击【输入】按钮,如果姓名已经存在,则提示“姓名重复”不能添加,否则将此姓名加入ListBox
用户在【姓名】中输入姓名,点击【查找】按钮,如果姓名存在于ListBox中,则将此姓名选中;
用户点击【显示当前姓名】按钮,则将用户当前选择的姓名MessageBox出来,如果没有任何被选中,则提示“没有人员被选中。”

10RadioButton的分组
         各个组内按钮的id要从小到大排列,而且各组之间的id段不能重叠。举例:
第一个组:
#define IDC_RBN1 1002
#define IDC_RBN2 1003
第二个组:
#define IDC_RBN3 1007
#define IDC_RBN4 1008
#define IDC_RBN5 1010
一定要设置所有RadioButtonAuto属性为False。然后在响应WM_COMMAND的代码中如下编写:


case IDC_RBN1:



case IDC_RBN2:



CheckRadioButton(hwnd,IDC_RBN1,IDC_RBN2,id);




break;



case IDC_RBN3:



case IDC_RBN4:



case IDC_RBN5:



CheckRadioButton(hwnd,IDC_RBN3,IDC_RBN5,id); //
选中
IDC_RBN3
IDC_RBN5
段的idid的控件。


break;

9、菜单资源
1)制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。
2)响应菜单操作。菜单点击后会发送WM_COMMAND消息,使用HANDLE_MSG进行映射后id就是被选择菜单的id。例子:


case IDM_QUIT:



EndDialog(hwnd,id);



本节课源代码下载(请自己敲代码,而不是直接下载老师的代码): listboxzy.rar (14.53 KB)

未命名.JPG
2010-2-25 12:23

这是我的最后的程序

mingguanli.rar (24.17 KB)

1

评分人数

TOP

看不太懂啊,要努力了啊

TOP

老师:我在运行下面的代码时提示错误:[Error] E:\学习资料\如鹏c代码\listbox\main.cpp:31: error: expected `)' before numeric constant

        case IDC_BTN1:
        {
       SendMessage(hwnd IDC_LST1 ,LB_ADDSTRING,0,(LPARAM)TEXT("你好"));
        }
        break;
弄了很久,都不知道错在哪,在qq群里提问没人回答,只好来问你...

TOP

原帖由 635260101 于 2009-4-23 23:07 发表
        case IDC_BTN1:
        {
       SendMessage(hwnd IDC_LST ...



hwnd 参数后边少个逗号吧
@娄攵码ㄝ屆裡穿垳,祇为寻找伱啇全蔀
     1.~昨夜西风凋碧树,独上高楼,望尽天涯路
        2.~衣带渐宽终不悔,为伊消得人憔悴
           3.~众里寻他千百度,蓦然回首,那人却在,灯火阑珊处

TOP


  1.         case IDC_BTN1:
  2.         {
  3.                SendMessage(hwnd IDC_LST1 ,LB_ADDSTRING,0,(LPARAM)TEXT("你好"));
  4.         }
  5.         break;
复制代码
不是少了逗号的问题,SendMessage就只有4个参数,原型如下:
  1. WINUSERAPI LRESULT WINAPI SendMessageW(HWND,UINT,WPARAM,LPARAM);
复制代码

TOP

其实可以用SendDlgItemMessage

用SendMessage

   HWND iIndex=GetDlgItem(hwnd,IDC_LST1);
   SendMessage (iIndex, LB_ADDSTRING, 0, (LPARAM)cdui) ;


SendMessage第一个参数是控件的句柄,不是对话框句柄

TOP

rediobutton控件的使用


void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_RBN1:
case IDC_RBN2:
{
CheckRadioButton(hwnd,IDC_RBN1,IDC_RBN2,id);
}
break;
case IDC_RBN3:
case IDC_RBN4:
case IDC_RBN5:
case IDC_RBN6:
case IDC_RBN7:
{
CheckRadioButton(hwnd,IDC_RBN3,IDC_RBN7,id);
}
break;
case IDC_BTN1:
{
int i=xuanzhong(hwnd,IDC_RBN1,IDC_RBN2);
TCHAR k[256];
GetDlgItemText(hwnd,i,k,sizeof(k)/sizeof(TCHAR));
int j=xuanzhong(hwnd,IDC_RBN3,IDC_RBN7);
TCHAR k1[256],k2[256];
GetDlgItemText(hwnd,j,k1,sizeof(k1)/sizeof(TCHAR));
wsprintf(k2,TEXT("性别:%s 年龄:%s"),k,k1);
MessageBox(hwnd,k2,TEXT(""),MB_OK);
}
break;
default:break;
}

}

int xuanzhong(HWND hwnd,int i,int j)
{
int k;
for(k=i;k<=j;k++)
{
BOOL a=SendDlgItemMessage(hwnd,k,BM_GETCHECK,0,0);
if(a)
{
return k;
}

}
}

界面

QQ截图未命名.jpg

TOP

分享下:
  要在菜单项中插入分隔的横线,只要在编辑菜单时插入一个标题为减号“-”的菜单项,名称(ID)不需要输入就可以了。
menu.jpg
2009-6-22 16:27
  
menu2.jpg
2009-6-22 16:27


问题:
  但我为菜单项设置了热键,比如“打开”我设置了“Ctrl + O”,为什么在运行时我按了“Ctrl + O”没有反应呢?

TOP

未命名.jpg
2009-6-30 22:08

10.rar (57.23 KB)

TOP

用的是ListBox控件,呵呵。。没有分栏直接来的字符串组合...基本上的功能都有....当然这个listbox的空间删除和查找功能都不理想,我下一步要做的就是实现不用listbox空间进行分栏存储信息(把信息都放在一个文件内,要不每次启动都要从新出入),这样也好进行查找和删除操作!

[ 本帖最后由 ysur 于 2009-8-11 11:39 编辑 ]
10.作业.jpg

ListBox.rar (21.38 KB)

TOP

做的这个Listbox控件费了好几个小时的时间,我也把三种信息输入到同一个文本中,但是这样就有一个缺陷,输入重复的姓名不能提示,试了很多种方法费了好长时间也没能解决这个问题,其他的功能都能够实现,如输入完成一组数据后姓名栏清空,分布提示,如果一个数据都没有输入,先提示输入姓名,姓名输入完成后再提示以后的内容。
未命名.jpg

10.rar (25.35 KB)

TOP

能够把三种信息全部输入到ListBox中

没有选择性别身高能够提示
能够查找姓名
删除选定的姓名

输入重复的姓名能够提示

我实现的方法是定义2个ListBox ,一个放3种信息,一个专门放姓名。放姓名的ListBox2处于隐藏状态。

工程在附件里面 有注释 代码写的不咋地 欢迎大家指教。
未命名.jpg

test10.rar (22.88 KB)

TOP

第一个作业
绝对完美

listbox2.rar (20.91 KB)

第一个作业listbox

TOP

返回列表