对照源代码
以下是部分解释,打字太累……^_^
Toolbar(window containing buttons or other controls)
创建Toolbar
1.CreateToolbarEx(...,LPCTBBUTTON,iNumButton,...)
需要一个TBBUTTON结构数组,
其中TBBUTTON结构表示Toolbar上的每个按钮!
而按钮又是窗口,又有style,按钮标识符,也可能有按钮上面的图片的索引
2.创建时的style一部分信息:
TBSTYLE_FLAT效果:使toolbar上的按钮不突出!像平面一样
TBBUTTON中的state,TBSTATE_WRAP能使整个Toolbar下面有一条线
3.创建完了之后,Toolbar的Window procedure负责自动放置toolbar的位置和设置toolbar的大小!
4.在Toolbar上创建复选框
CreateWindowEx(...,...,nHeight,...hwndToolbar)
nHeight要大点,以便来显示在复选框中添加的字符串。
使用ComboBox_AddString,但是一次只能添加一个要添加许多,用for循环.
5.给toolbar加Bitmap
可以一个一个给button加bitmap,但是不是好方法.
如果想用标准的toolbar bitmaps,那么他们就在comctl32.dll中(可以利用Resource Hacker来看)
首先在TBBUTTTON中的int iBitmap设置为标准的bitmaps的索引
例如
{STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
其次在 CreateToolbarEx时指出这些标准bitmaps的hinstance,即HINST_COMMCTRL,然后还要指定
这个bitmaps在这个hinstance中的offset,也就是wBMID参数,可以0,1,2..打开comctl32.dll就可以看 出来了,这里指定IDB_STD_SMALL_COLOR
最后发送TB_ADDBITMAP 给toolbar.其实,不发送也可以显示图片的.
但是要改变的话,就要发送这个消息了
6.给toolbar添加tooltip
tooltip信息参考sdk user interface shell and common controls
1.需要指定TBSTYLE_TOOLTIPS style
2.定义好显示的字符串,使用string table
3.处理WM_NOTIFY
int Toolbar_OnNotify(HWND hwnd, UINT idCtrl, NMHDR * pnmh)
{
return 0;
}
过程:
Toolbar向父窗口发送WM_NOTIFY消息,并交给父窗口NMHDR结构,NMHDR结构中包含了对父窗口的要求
(信息),这些信息包括WM_NOTIFY由谁发过来的(pnmh->idForm)(就是toolbar上的button的ID),需要父窗口为他做什么(TTN_NEEDTEXT或TTN_GETDISPINFO).然而,父窗口就是我们,如何来回应子窗口的请求
通过判断是什么要求(pnmh->code),然后通过TOOLTIPTEXT结构来满足子窗口的请求
switch(pnmh->code)
{
case TTN_NEEDTEXT:
TOOLTIPTEXT *lpToolTipText=(LPTOOLTIPTEXT)pnmh;
//载入定义好的字符串到szBuf
LoadString (GetModuleHandle(NULL),
lpToolTipText->hdr.idFrom, // string ID == cmd ID
szBuf,
sizeof (szBuf));
//满足子窗口的要求,就是将文字放入子窗口要求提供的buffer中
lpToolTipText->lpszText = szBuf;
}
如图
NMHDR
(parent window)--WM_NOTIFY--1--(tool button)-----TTN_NEEDTEXT----(tooltip window)
3| |
TTN_NEEDTEXT----2---TOOLTIPTEXT--------|
| |
pnmh->idFrom-4-| buffer
|-buf++|
1234的顺序来执行
1.接受WM_NOTIFY信息,并在OnNotify中处理
2.定义TOOLTIPTEXT结构指针,让他指向pnmh
3.判断pnmh->code,如果是TTNEEDTEXT,那么根据pnmh->idFrom来取得对应id的tip字符串,放入临时buf
4.将临时buff放入lpToolTipText->lpszText中用来让tooltip window显示
总结:
tooltip是个窗口,tool button是个窗口 对话框是个窗口 tooltip要显示的文字在我的代码中定义,而tooltip是系统负责的阿,如何让他来读取我的文字。通过TTN_NEEDTEXT消息和TOOLTIPTEXT结构.
当tooltip窗口显示并需要文字时,它发送一个TTN_NEEDTEXT。其实TTN_NEEDTEXT是以WM_NOTIFY形式发送的,当对话框,也就是我的代码可以控制的窗口,收到WM_NOTIFY消息时,解析pnmh->code,来判断具体的消息
当是TTN_NEEDTEXT是,定以一个指向TOOLTIPTEXT结构的指针,并初始化为指向pnmh,最后填充TOOLTIPTEXT结构中的lpszText,但是如果不指定是谁来显示的话,全部都会显示的.而这个谁就是TOOLTIPTEXT中hdr中的idFrom表示,以他的名义来载入它需要显示的文字
int Toolbar_OnNotify(HWND hwnd, UINT idCtrl, NMHDR * pnmh)
{
TOOLTIPTEXT *lpToolTipText=(LPTOOLTIPTEXT)pnmh;
TCHAR szBuf[256]={0};
switch (pnmh->code)
{
case TTN_NEEDTEXT://tooltip告诉toolbar的父窗口,它需要显示的文本
//通过ToolTipText结构来和tooltip窗口交流
// Display the ToolTip text.
//lpToolTipText = (LPTOOLTIPTEXT)pnmh;
//载入定义好的字符串到szBuf
LoadString (GetModuleHandle(NULL),
pnmh->idFrom,//lpToolTipText->hdr.idFrom, // string ID == cmd ID
szBuf,
sizeof (szBuf));
//满足子窗口的要求,就是将文字放入子窗口要求提供的buffer中
lpToolTipText->lpszText = /*szBuf*/"123456";
break;
}
return 0;
}
7.给非button的control添加tips
处理combobox的WM_MOUSEMOVE, WM_LBUTTONDOWN, and WM_LBUTTONUP,在那里来显示文字.可是combobox是系统注册的,那么subclassing.
告诉tooltip窗口给谁添加tooltip
谁由TOOLINFO结构给出
// Fill out the TOOLINFO structure.
lpToolInfo.cbSize = sizeof (lpToolInfo);
// The uID is the handle of the tool (the combo box).
lpToolInfo.uFlags = TTF_IDISHWND | TTF_CENTERTIP;
// The string ID in the resource
lpToolInfo.lpszText = (LPTSTR)IDM_COMBO;
// The window that gets the ToolTip messages
lpToolInfo.hwnd = hwndToolbar;
// The tool
lpToolInfo.uId = (UINT)hwndCombo;
// The instance that owns the string resource
lpToolInfo.hinst = hinst;
SendMessage (hwndTT, TTM_ADDTOOL, 0,
(LPARAM)(LPTOOLINFO)&lpToolInfo);
coming soon.....