论坛风格切换切换到宽版
  • 6648阅读
  • 10回复

[讨论]nsis自定义页面ListBox控件问题 [复制链接]

上一主题 下一主题
离线foolman
 
发帖
220
金钱
0
威望
0
只看楼主 倒序阅读 0 发表于: 2005-11-04
  有这个需要:在自定义页面上,ListBox控件中的内容,需要根据一按钮动作而改变。

  尝试用了SendMessage $1 ${WM_SETTEXT} 0 'STR:MyText'发送消息并不成功。 察看nsh,有LB List box control这一类型。 因为对此并不了解,不知道对这种类型能否发送消息,以什么方式发送。

  比如:SendMessage $1 ${LB_SETTEXT} 0 'STR:MyText' 这样写对不对? 特别的对ListBox控件起不起作用?
离线foolman
发帖
220
金钱
0
威望
0
只看该作者 1 发表于: 2005-11-04
仔细看了下文档,似乎可以用
CODE
GetDlgItem $1 $HWND 1027
SendMessage $1 ${LB_SETITEMDATA}  0 'STR:MyText'

来发送消息。。。 不知道这种用法是否有错呢?
离线蓝色网际
发帖
1795
金钱
0
威望
0
只看该作者 2 发表于: 2005-11-04
没有 LB_SETTEXT 这样的消息,List box 不能直接设置文本,只能删除后重新添加。Combo box 似乎可以直接用 WM_SETTEXT。
不要在 PM 里问问题,PM 不是用来问问题的。
离线foolman
发帖
220
金钱
0
威望
0
只看该作者 3 发表于: 2005-11-04
看message文档,LB有!define LB_SETITEMDATA 定义,这个能否用来发送消息?
离线蓝色网际
发帖
1795
金钱
0
威望
0
只看该作者 4 发表于: 2005-11-04
LB_SETITEMDATA 不是用来发送字符的,应该用 LB_DELETESTRING、LB_INSERTSTRING 来“替换字符串”。
不要在 PM 里问问题,PM 不是用来问问题的。
离线foolman
发帖
220
金钱
0
威望
0
只看该作者 5 发表于: 2005-11-04
QUOTE(蓝色网际 @ 2005年11月04日 21时58分)
LB_SETITEMDATA 不是用来发送字符的,应该用 LB_DELETESTRING、LB_INSERTSTRING 来“替换字符串”。
[snapback]253292[/snapback]


那也就是说,可以有notify时让listbox显示内容即时改变的方法了? 或者仅仅是只在ini文件中改变而不能即时显示?
离线蓝色网际
发帖
1795
金钱
0
威望
0
只看该作者 6 发表于: 2005-11-05
INI 只是在页面初始化的时候用的,页面显示之后要改就只能用发消息的方式了。
首先你要知道要改字串的索引,从 0 开始,然后根据索引发 LB_DELETESTRING 消息到控件删除字串,然后发消息 LB_INSERTSTRING 到控件在删除的地方重新添加字串。
消息的用法你可以去 MSDN 查一下。
不要在 PM 里问问题,PM 不是用来问问题的。
离线foolman
发帖
220
金钱
0
威望
0
只看该作者 7 发表于: 2005-11-05
看了能搜到的相关资料,有些细节还是不太清楚,唉,不懂编程哪。有两个问题:
1、就Listbox而言,发送消息时,是用控件句柄还是用窗口句柄?
2、知道需要修改字串索引后,发送消息时,以何种方式表达?查资料说第一消息参数为常量或窗口控件等句柄,第二消息参数为指向内存中数据指针。 那么索引位置放在第一参数是否恰当?
CODE

SendMessage $1 ${LB_DELETESTRING}  0 'STR:MyText'


QUOTE
4.9.14.9 SendMessage
窗口句柄 消息 第一个消息参数 第二个消息参数 [用户变量(返回值)] [/TIMEOUT=毫秒]
发送消息到 “窗口句柄”。如果指定了一个用户变量 $x 作为最后一个参数(或在 /TIMEOUT 之前的最后一个参数),SendMessage 的返回值将保存在该变量里。需要注意的是当指定 “消息” 时你只能用消息的整数值。如果你需要发送字串请使用 “STR:字串” 作为 “第一个消息参数” 或 “第二个消息参数”。
离线蓝色网际
发帖
1795
金钱
0
威望
0
只看该作者 8 发表于: 2005-11-05
假设控件句柄为 $0,要修改的字串索引为 2

MSDN:
SendMessage(
(HWND) hWnd,       // handle to destination window
LB_DELETESTRING,   // message to send
(WPARAM) wParam,   // string index
(LPARAM) lParam     // not used; must be zero
);

NSIS:
SendMessage $0 ${LB_DELETESTRING} 2 ""

MSDN:
SendMessage(
(HWND) hWnd,     // handle to destination window
LB_INSERTSTRING,   // message to send
(WPARAM) wParam,   // item index
(LPARAM) lParam   // string (LPCTSTR)
);

NSIS:
SendMessage $0 ${LB_INSERTSTRING} 2 "STR:新字串"
不要在 PM 里问问题,PM 不是用来问问题的。
离线foolman
发帖
220
金钱
0
威望
0
只看该作者 9 发表于: 2005-11-05
  谢谢蓝色网际的指导!

  这下子清晰明了了。 其实我查看了很多资料后,已经有眉目了,但是就是对二个消息参数怎么使用搞不清楚。查MSDN的Sendmessage资料对消息参数也没有详细说明,也可能因为网站是英文的,没找到地方。

  不懂编程也有好处,至少不少绞尽脑汁了。呵呵,今天看了很多消息和ListBox方面的资料,发觉那叫一个累呀,每个细节都可以控制和处理,不过人头脑有限,怎么可能考虑那么全面呢? 怪不得说程序员是吃青春饭的。