REBARBANDINFO的利用措施简介--添置带区

来源:互联网 发布:vb里布尔型数据 编辑:程序博客网 时间:2024/05/16 18:24
REBARBANDINFO构造用来描写控件中的每个带区,穿越给CommamndBands_AddBands函数递交一个REBARBANDINFO构造数组,能够给利用过程增加带区。CommandBands_AddBands函数原型如下:
BOOL CommandBands_AddBands (HWND hWndCmdBands, HINSTANCE hinst, UINT cBands, LPREBARBANDINFO prbbi);
再调用该函数之前,您定然先把准备加到控件里的每个带区的消息填写到REBARBANDINFO构造中。该构造定义如下:
typedef struct tagREBARBANDINFO{
UINT cbSize;
UINT fMask;
UINT fStyle;
COLORREF clrFore;
COLORREF clrBack;
LPTSTR lpText;
UINT cch;
int iImage;
HWND hwndChild;
UINT cxMinChild;
UINT cyMinChild;
UINT cyMinChild;
UINT cx;
HBITMAP hbmBack;
UINT wID;
UINT cyChild;
UINT cyMaxChild;
UINT cyIntegral;
UINT cxIdeal;
LPARAM lParam;
} REBARBANDINFO;
走运地是,固然该构造看上去很雄伟壮观,但其中的众多域能够被疏忽掉,因为对未初始化的域有默认值。和等闲的Windows构造一样,做为一种容错平安措施,cbSize必需添补为构造的尺寸。fMask域则添补了众多符号,用来指出构造中其它域中哪些域填写的是管用消息。在谈论到每个域的时候,我会描写这些符号的。

万一fMask域中指定了RBBIM_STYLE符号,那fStyle域就定然利用带区的风格符号来添补。实用的符号如下:
RBBS_BREAK 带区重新的一行开始
RBBS_FIXEDSIZE 带区不能被调剂大小。当指定了该符号,带区的“小把手”将不揭示。
RBBS_HIDDEN 当号召带被创立后,带区不可视。
RBBS_GRIPPERALWAYS 带区有可调尺寸的小把手,即任务令带只有一个带区。
RBBS_NOGRIPPER 带区未曾可调尺寸的小把手,因而用户不能挪动带区
RBBS_NOVERT 万一利用CCS_VERT风格,号召带控件垂直揭示的话,带区不会揭示出来。
RBBS_CHILDEDGE 在带区的顶部和底端描摹边线
RBBS_FIXEDBMP 当带区改换大小的时候,带区的背景位图不挪动。
大约上这些符号是自解释型的。固然号召带等闲揭示在窗口顶部,然而他们能够创立成垂直号召带并揭示在窗口左边。在这种情形下,RBBS_NOVERT风格批准过程员来指定当号召带在垂直方向时,带区不揭示。包括菜单或略宽一些控件的带区是很合乎这种符号的,因为它们在垂直带区上不能被准确揭示。

clrFore和clrBack域中填写的是颜色消息,在利用过程描摹带区的时候,会用这些颜色描摹前景色和背景色。必需当心的是,只有在掩码域中设置了RBBIM_COLORS符号时这两个域才有用。对这两个域以及用来为带区指定背景位图的hbmBack域来说,只有在带区包括透明号召条的时候才有用。否则号召条会割据带区的大局部空间,并遮蔽任何背景位图可能颜色。在“搭配独自带区”一节中,我将解释如何任务令条透明。

lpText域指定了用来符号个体带区的可选文本。这些文字将直接揭示在带区条的左边。iImage域用于指定一个揭示在带区条左边的位图,利用包括在图像列表控件中的图象列表的索引来添补iImage域。当和号召带控件的RBS_SMARTLABELS风格配套利用的时候,文字和位图显地更激化要。指定了RBS_SMARTLABELS风格尔后,万一带区被还原可能最大化,文字就会揭示出来;万一带区被最小化,位图就揭示出来。该技巧被H/PCExplorer用在它的号召带控件上。

wID域中添补的是带区的ID值。带区ID是很重要的,万一您计划在创立带区后搭配它们可能想查询它们的事态的话。即便您不计划在过程里利用带区ID,坚持每个带区ID单一也是很重要的,因为控件切身利用该ID来管教带区。只有在fMask域中设置了RBBIM_ID符号时才会察看wID域。

万一带区中默认的号召条控件必需被另一个控件轮换的话,hwndChild域即便很有用的了。为了轮换号召条控件,定然率先创立新控件,再把该控件的窗口句柄放到hwndChild域中。只有在fMask域中设置了RBBIM_CHILD符号时才会察看hwndChild域。

cxMinChild和cyMinChild域中定义了带区能够缩小到的最小尺寸。当利用默认号召条以外的控件时,这两个域对定义带区的高度和最小宽度很有用。只有在fMask域中设置了RBBIM_CHILDSIZE符号时才会察看这两个域。

当带区被用户最大化er.ermucn.com的时候,会利用cxIdeal域。万一这个域未曾初始化,号召带最大化时会展开到全副控件宽度。穿越设置cxIdeal,利用过程能够局限带区最大化的宽度,这对于带区上的控件只占全副带区宽度一局部的情形来说是很得体的。只有在fMask域中设置了RBBIM_IDEALSIZE符号时才会察看这个域。

lParam域供给了一个空间来存储由利用过程定义的关于带区消息的值。只有在fMask域中设置了RBBIM_LPARAM符号时才会察看这个域。

REBARBANDINFO中的其它域多用于更灵便的rebar控件,而不但仅是号召带控件。下面的代码创立了一个号召带控件,初始化了一个带三个REBARBANINFO构造的数组并把带区加到控件里。
// Create a command bands control.
hwndCB = CommandBands_Create (hInst, hWnd, IDC_CMDBAND, RBS_SMARTLABELS | RBS_VARHEIGHT, himl);

// Initialize common REBARBANDINFO structure fields.
for (i = 0; i < dim(rbi); i++) {
rbi[i].cbSize = sizeof (REBARBANDINFO);
rbi[i].fMask = RBBIM_ID | RBBIM_IMAGE | RBBIM_SIZE | RBBIM_STYLE;
rbi[i].fStyle = RBBS_FIXEDBMP;
rbi[i].wID = IDB_CMDBAND+i;
}
// Initialize REBARBANDINFO structure for each band.
// 1. Menu band.
rbi[0].fStyle |= RBBS_NOGRIPPER;
rbi[0].cx = 130;
rbi[0].iImage = 0;

// 2. Standard button band.
rbi[1].fMask |= RBBIM_TEXT;
rbi[1].cx = 200;
rbi[1].iImage = 1;
rbi[1].lpText = TEXT ("Std Btns");

// 3. Edit control band.
hwndChild = CreateWindow (TEXT ("edit"), TEXT ("edit ctl"),
WS_VISIBLE | WS_CHILD | WS_BORDER,
0, 0, 10, 5, hWnd, (HMENU)IDC_EDITCTL,
hInst, NULL);

rbi[2].fMask |= RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILDSIZE | RBBIM_CHILD;
rbi[2].fStyle |= RBBS_CHILDEDGE;
rbi[2].hwndChild = hwndChild;
rbi[2].cxMinChild = 0;
rbi[2].cyMinChild = 25;
rbi[2].cyChild = 55;
rbi[2].cx = 130;
rbi[2].iImage = 2;
rbi[2].lpText = TEXT ("Edit field");

// Add bands.
CommandBands_AddBands (hwndCB, hInst, 3, rbi);
上面的代码中创立的号召带控件有三个带区ge.gexinghua.org,一个包括一个菜单,一个包括一组按钮,一个则利用编辑控件轮换了号召条。利用RBS_SMARTLABELS和 RBS_VARHEIGHT风格创立了控件。当号召条最小化的时候,智能标签揭示一个图标;当不在最小化事态时,揭示文字图标。RBS_VARHEIGHT风格则批准控件上的每行有不同的高度。

在一个循环里初始化了REBARBANINFO构造中共用的域。接下来,构造中富余的域根就据控件中的每个带区举行定制。包括编辑控件的第三个带区初始化是最混杂的。该带区必需更多的初始化,因为编辑控件必需贴切的调剂尺寸来相称其它带区中号召条控件的规范高度。

利用图像列表索引来初始化每个带区中的iImage域。该图像列表创立并递交进了CommandBands_Create函数。用在第二和第三个带区中的文本域被符号所添补。包括菜单的第一个带区中并不包括文本符号,因为菜单无须要符号。能够对第一个带区利用RBBS_NOGRIPPER风格,这么它就不能在控件上挪动了。这能够使菜单带区安宁揭示在控件中贴切的位置上。既然我们曾经创立了带区,那是时候来看看如何初始化它们了。不幸的是,随着工夫的挪动,客户代码可能会改换归来的Dimension对象的值,这个时候,追寻讹谬的起源是件枯燥且费时的事情,尤其是在多线程环境中。

原创粉丝点击