返回列表 发帖

【教学视频】《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

看看这个做的怎么样
QQ截图未命名.png

(如鹏)班级点名系统v1.0 软件应用领域.rar (14.96 KB)

努力学习!知识改变命运!

TOP

(6)将某项目复制到文字缓冲区中:int ListBox_GetText(
    HWND hwndCtl,    int index,    LPCTSTR lpszBuffer);
这个函数将某项目复制到文字缓冲区中是什么意思啊

TOP

回帖是必须的,这个可以有!

TOP

返回列表