在只允许使用API的情况下, 如何操作ListBox?(200分)

  • 主题发起人 主题发起人 mllee
  • 开始时间 开始时间
M

mllee

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]我想利用C语言调用API函数做一个多栏(column)的ListBox.<br>第一步应该用CreateWindow函数生成一个ListBox并返回其窗口句柄,<br>但怎样才能利用这个句柄去设定ListBox的栏数呢?<br>还有,生成的listbox没有头(最上一行和其他行没有区别),是不是要自己往上画?<br><br>谢谢!
 
用消息。
 
我知道用消息,问题是该发送什么消息<br>昨天我查了所有能查到的书和帮助文档,但没找到一个与之相关的
 
你查API的帮助就有了 &nbsp;查找“List Box Messages”<br>另外你还可以参考一下TCustomListBox的源代码
 
好像没有啊<br>我看过和ListBox有关的所有消息,但没找到想要的<br>谁能告诉我是哪几个消息?<br>
 
如xianjun说的<br>查找StdCtrls.pas,查找TCustomListBox<br>里面有很多
 
var<br>&nbsp; I: Integer;<br>&nbsp; LBHwnd: THandle;<br>&nbsp; S: string;<br>begin<br>&nbsp; LBHwnd := CreateWindow('ListBox', nil, WS_CHILD or WS_VISIBLE or LBS_MULTICOLUMN,<br>&nbsp; &nbsp; 0, 0, 200, 300, Handle, 0, HInstance, nil);<br>&nbsp; SendMessage(LBHwnd, LB_SETCOLUMNWIDTH, 100, 0);<br>&nbsp; for I := 0 to 30 do<br>&nbsp; begin<br>&nbsp; &nbsp; S := Format('String %d', );<br>&nbsp; &nbsp; SendMessage(LBHwnd, LB_ADDSTRING, 0, Integer(Pointer(S)));<br>&nbsp; end;<br>end;<br><br>Following are the messages used with list boxes. <br><br>LB_ADDFILE<br>LB_ADDSTRING<br>LB_DELETESTRING<br>LB_DIR<br>LB_FINDSTRING<br>LB_FINDSTRINGEXACT<br>LB_GETANCHORINDEX<br>LB_GETCARETINDEX<br>LB_GETCOUNT<br>LB_GETCURSEL<br>LB_GETHORIZONTALEXTENT<br>LB_GETITEMDATA<br>LB_GETITEMHEIGHT<br>LB_GETITEMRECT<br>LB_GETLOCALE<br>LB_GETSEL<br>LB_GETSELCOUNT<br>LB_GETSELITEMS<br>LB_GETTEXT<br>LB_GETTEXTLEN<br>LB_GETTOPINDEX<br>LB_INITSTORAGE<br>LB_INSERTSTRING<br>LB_ITEMFROMPOINT<br>LB_RESETCONTENT<br>LB_SELECTSTRING<br>LB_SELITEMRANGE<br>LB_SELITEMRANGEEX<br>LB_SETANCHORINDEX<br>LB_SETCARETINDEX<br>LB_SETCOLUMNWIDTH<br>LB_SETCOUNT<br>LB_SETCURSEL<br>LB_SETHORIZONTALEXTENT<br>LB_SETITEMDATA<br>LB_SETITEMHEIGHT<br>LB_SETLOCALE<br>LB_SETSEL<br>LB_SETTABSTOPS<br>LB_SETTOPINDEX<br>LBN_DBLCLK<br>LBN_ERRSPACE<br>LBN_KILLFOCUS<br>LBN_SELCANCEL<br>LBN_SELCHANGE<br>LBN_SETFOCUS<br>WM_CHARTOITEM<br>WM_CTLCOLORLISTBOX<br>WM_DELETEITEM<br>WM_VKEYTOITEM <br>
 
Messages.pas里面查找“{ Listbox messages }”,下面的就是<br>
 
昨天看过了,俺知道LBS_MULTICOLUMN和LB_SETCOLUMNWIDTH和LB_ADDSTRING<br>俺需要的是设定栏(column)的数目,但没找到类似LB_SETCOLUMNCOUNT的消息......<br>
 
Help!!!!!!!!!!!
 
哪个不是消息,直接添加就可以了!
 
你变通一下不就行了????<br>LISTBOX本身有一个宽度, LB_SETCOLUMNWIDTH可以设置一栏的宽度<br>两者相除不就是Cloumn的数目了???<br>叫你看VCL源代码不是没有道理的, TListBox是有一个Columns属性,但你有没有看到这个<br>Columns是怎么实现的吗? 就是在你设置Columns属性时重新CreateWnd,然后发消息:<br>procedure TCustomListBox.SetColumnWidth;<br>var<br>&nbsp; ColWidth: Integer;<br>begin<br>&nbsp; if (FColumns &gt; 0) and (Width &gt; 0) then<br>&nbsp; begin<br>&nbsp; &nbsp; ColWidth := Trunc(ClientWidth / FColumns);<br>&nbsp; &nbsp; if ColWidth &lt; 1 then ColWidth := 1;<br>&nbsp; &nbsp; SendMessage(Handle, LB_SETCOLUMNWIDTH, ColWidth, 0);<br>&nbsp; end;<br>end;<br><br>现在知道怎么回事了?
 
你可以再进一步看一下:<br>procedure TCustomListBox.WMSize(var Message: TWMSize);<br>begin<br>&nbsp; inherited;<br>&nbsp; SetColumnWidth;<br>end;<br><br>就是说,在Size改变的时候也要调用SetColumnWidth重新设置ColumnWidth,以确保<br>ListBox只有你指定的列数。
 
对不起,忘了散分了
 
可以用资源来定义
 
多人接受答案了。
 
后退
顶部