我用SDK创建了一个工具条,虽然可以显示出来,但显示不太正常,有两处不正常
1.工具条背景颜色变为白色(本来应为灰色),如果去除TBSTYLE_FLAT风格则恢复为灰色
2.窗体最大化后,工具条右端显示出主窗体背景颜色(正常情况应与菜单背景颜色相同,即使按工具条颜色,也应为白色),即使在WM_SIZE中调整工具栏尺寸也似乎无效。
研究了MFC的工具条代码后,修改了很多次依然无效,究竟该怎么搞法?特来请教各位。
部分代码如下//创建工具条
HWND CreateToolBar(HWND hWndParent)
{
HWND hWndTB;
TBBUTTON tbb[4];
HIMAGELIST hImageList,hHotImageList,hDisableImageList;
HBITMAP hBitmap;
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&icex);
hWndTB = CreateWindowEx(0,
TOOLBARCLASSNAME,TEXT(""),
WS_CHILD|WS_VISIBLE|WS_BORDER|TBSTYLE_FLAT|TBSTYLE_LIST|TBSTYLE_AUTOSIZE,
0,0,0,0,
hWndParent,
(HMENU)IDR_TOOLBAR,
g_hInst,
NULL);
if(!hWndTB)
return 0;
SendMessage(hWndTB, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
hImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBAR));
ImageList_Add(hImageList,hBitmap,NULL);
DeleteObject (hBitmap);
SendMessage(hWndTB,TB_SETIMAGELIST,0,(LPARAM)hImageList); hHotImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBARHOT));
ImageList_Add(hHotImageList,hBitmap,NULL);
DeleteObject (hBitmap);
SendMessage(hWndTB,TB_SETHOTIMAGELIST,0,(LPARAM)hHotImageList); hDisableImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBARDISABLE));
ImageList_Add(hDisableImageList,hBitmap,NULL);
DeleteObject (hBitmap);
SendMessage(hWndTB,TB_SETDISABLEDIMAGELIST,0,(LPARAM)hDisableImageList); ZeroMemory(tbb, sizeof(tbb));
tbb[0].iBitmap =MAKELONG(0,0) ;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[0].idCommand = ID_MENU_NEW;
//tbb[0].iString = (INT_PTR)TEXT("查找");
tbb[1].iBitmap =MAKELONG(1,0);
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[1].idCommand = ID_MENU_OPEN;
//tbb[1].iString = (INT_PTR)TEXT("后退");
tbb[2].iBitmap =MAKELONG(2,0);
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[2].idCommand = ID_MENU_SAVE;
//tbb[2].iString = (INT_PTR)TEXT("向前");
tbb[3].iBitmap =MAKELONG(3,0);
tbb[3].fsState = TBSTATE_ENABLED;
tbb[3].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[3].idCommand = ID_MENU_EXIT;
//tbb[3].iString = (INT_PTR)TEXT("视图");
SendMessage(hWndTB, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
SendMessage(hWndTB,WM_SIZE,0,0);
return hWndTB;
}
1.工具条背景颜色变为白色(本来应为灰色),如果去除TBSTYLE_FLAT风格则恢复为灰色
2.窗体最大化后,工具条右端显示出主窗体背景颜色(正常情况应与菜单背景颜色相同,即使按工具条颜色,也应为白色),即使在WM_SIZE中调整工具栏尺寸也似乎无效。
研究了MFC的工具条代码后,修改了很多次依然无效,究竟该怎么搞法?特来请教各位。
部分代码如下//创建工具条
HWND CreateToolBar(HWND hWndParent)
{
HWND hWndTB;
TBBUTTON tbb[4];
HIMAGELIST hImageList,hHotImageList,hDisableImageList;
HBITMAP hBitmap;
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&icex);
hWndTB = CreateWindowEx(0,
TOOLBARCLASSNAME,TEXT(""),
WS_CHILD|WS_VISIBLE|WS_BORDER|TBSTYLE_FLAT|TBSTYLE_LIST|TBSTYLE_AUTOSIZE,
0,0,0,0,
hWndParent,
(HMENU)IDR_TOOLBAR,
g_hInst,
NULL);
if(!hWndTB)
return 0;
SendMessage(hWndTB, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
hImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBAR));
ImageList_Add(hImageList,hBitmap,NULL);
DeleteObject (hBitmap);
SendMessage(hWndTB,TB_SETIMAGELIST,0,(LPARAM)hImageList); hHotImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBARHOT));
ImageList_Add(hHotImageList,hBitmap,NULL);
DeleteObject (hBitmap);
SendMessage(hWndTB,TB_SETHOTIMAGELIST,0,(LPARAM)hHotImageList); hDisableImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBARDISABLE));
ImageList_Add(hDisableImageList,hBitmap,NULL);
DeleteObject (hBitmap);
SendMessage(hWndTB,TB_SETDISABLEDIMAGELIST,0,(LPARAM)hDisableImageList); ZeroMemory(tbb, sizeof(tbb));
tbb[0].iBitmap =MAKELONG(0,0) ;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[0].idCommand = ID_MENU_NEW;
//tbb[0].iString = (INT_PTR)TEXT("查找");
tbb[1].iBitmap =MAKELONG(1,0);
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[1].idCommand = ID_MENU_OPEN;
//tbb[1].iString = (INT_PTR)TEXT("后退");
tbb[2].iBitmap =MAKELONG(2,0);
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[2].idCommand = ID_MENU_SAVE;
//tbb[2].iString = (INT_PTR)TEXT("向前");
tbb[3].iBitmap =MAKELONG(3,0);
tbb[3].fsState = TBSTATE_ENABLED;
tbb[3].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
tbb[3].idCommand = ID_MENU_EXIT;
//tbb[3].iString = (INT_PTR)TEXT("视图");
SendMessage(hWndTB, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
SendMessage(hWndTB,WM_SIZE,0,0);
return hWndTB;
}
解决方案 »
- 关于在DLL中的“C++异常”与“SEH异常”的一点心得与说明
- wtl 中的PreTranslateMessage 如何截获右键消息
- 一般的复制操作,比如说在E盘里右键点复制,到F盘里粘贴,怎么没有经过COPYFILE呢
- 如何获取编辑框的宽度?
- 请问哪里有关于COM的教学的书下载,谢谢!
- CListCtrl的行高能不能设置,怎么设置?
- 就当散分了
- CDC类中的GetClipBox和SelectClipRgn函数是什么意思?
- 请问clistctrl里LVN_GETDISPINFO什么时候被自动执行?我在该消息的响应函数里加入我的代码,可是并没有执行
- 滚动鼠标以鼠标光标为中心缩放问题
- 问一个OpenGL的基础问题:什么叫深度缓存
- 在VC中。怎样在一个列表框的一个单元格中显示多行文本(在线急等)
工程源代码:http://p.blog.csdn.net/images/p_blog_csdn_net/Y___Y/TestFrame.rar.jpg
源代码下载后去掉.jpg扩展名解压即得。
HINSTANCE hInstance=AfxGetInstanceHandle(); 对于待添加的工具条按钮可以根据情况细分为两种: 一种是Windows标准的一些工具条按钮比如打开文件、打印预览、在线帮助等等,这类工具条按钮可以直接使用预定义好的按钮图标的ID号,在VC自带的CommCtrl.h头文件中有详细定义; 另一种就是用户自己添加的工具栏按钮,只能由用户在资源视图中为其指定相应的图标。不论是那种工具条按钮的创建都是通过对TBBUTTON结构的设置来决定每一个工具条按钮的状态,对于第一个填充好的工具条按钮可以用CreateToolbarEx()来直接将其加入到工具条上,并返回指向工具条的窗口句柄,而对于以后工具条按钮的添加则只能通过向工具条发送TB_ADDBUTTONS消息来实现:……
//填充工具条按钮结构:
TBBUTTON ptoolbar[30]={{STD_HELP, //指定Windows的标准帮助图标
MU_ONE, //工具条按钮的ID
TBSTATE_ENABLED, //可用状态
TBSTYLE_BUTTON, //指定创建一个可以下按的按钮
0, //保留,由应用程序定义该参数意义
0}, //按钮字串索引
//创建一个分割按钮用的竖线
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0}};//在对话框上动态创建工具条,并添加工具条按钮:
HWND hToolsWindow=::CreateToolbarEx(hDlg, //指定对话框为父窗口,将工具条创建在对话框上
WS_CHILD|WS_VISIBLE|TBSTYLE_WRAPABLE|TBSTYLE_TOOLTIPS|
TBSTYLE_FLAT|CCS_ADJUSTABLE,//指定工具条的创建风格
IDB_TOOLBAR,//预定义的工具条资源ID
30,HINST_COMMCTRL, //包含图片资源的可执行文件的实例句柄
IDB_STD_SMALL_COLOR,//图片的资源ID
ptoolbar, //待添加的按钮
2, //加入到工具条的按钮的个数
0,0,0,0,sizeof(TBBUTTON));
……
//从IDR_TOOLBAR1资源中装载按钮图标到对话框的工具条上
TBADDBITMAP tab;
tab.hInst=hInstance;
tab.nID=IDR_TOOLBAR1;
iBmp=::SendMessage(hToolsWindow,TB_ADDBITMAP,(WPARAM)3,(LPARAM)&tab); 向工具条添加工具条按钮的关键在于对TBBUTTON数据结构的填充,该数据结构也是在CommCtrl.h头文件中定义的,原形为:typedef struct _TBBUTTON {
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
DWORD dwData;
int iString;
} TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON;
该结构的数据成员包含了处在工具条里的按钮的相关信息:成员iBitmap是从0开始记数的按钮图象的索引;idCommand标识了匹配的按钮,当按钮被按下产生WM_COMMAND消息的时候会用到该标识;fsState指定了按钮的状态标志,可以是以下8种标志的逻辑组合TBSTATE_CHECKED、TBSTATE_ELLIPSES、TBSTATE_ENABLED、TBSTATE_HIDDEN、TBSTATE_INDETERMINATE、TBSTATE_MARKED、TBSTATE_PRESSED、TBSTATE_WRAP。至于以上各标志的具体含义在MSDN的在线帮助中有详细说明;fsStyle成员指定了按钮的风格;dwData是应用程序定义的值,通常为0;iString为从0开始技术的按钮字串的索引。下面这段代码用于向工具条添加自定义的工具条按钮:TBBUTTON tb;
tb.iBitmap=iBmp+0;
tb.idCommand=MU_TWO;
tb.fsState=TBSTATE_ENABLED;
tb.fsStyle=TBSTYLE_BUTTON;
tb.dwData=0;
tb.iString=0; 完成对TBBUTTON结构的设置后可以通过窗口句柄hToolsWindow向工具条发送TB_ADDBUTTONS消息来添加按钮到工具条,如想添加按钮之间的分割条,只需将TBBUTTON结构的fsStyle成员变量取值为TBSTYLE_SEP即可:::SendMessage(hToolsWindow,TB_ADDBUTTONS,(WPARAM)1,(LPARAM)&tb);
TBSTYLE_TRANSPARENT Creates a transparent toolbar. In a transparent toolbar, the toolbar is transparent but the buttons are not. Button text appears under button bitmaps.把TBSTYLE_FLAT换成TBSTYLE_TRANSPARENT式是看
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
int nWidth;
switch (message)
{
case WM_CREATE:
hToolBar=CreateToolBar(hWnd);
hStatusBar=CreateStatusToolBar(hWnd); // 注意这里
hTreePanel=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG_TREE),hWnd,TreePanel_DialogFun);
ShowWindow(hTreePanel,SW_SHOW);
hCommandPanel=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG_COMMAND),hWnd,CommandPanel_DialogFun);
ShowWindow(hCommandPanel,SW_SHOW); return 0;
case WM_SIZE:
GetClientRect(hWnd,&rect);
nWidth=rect.right-rect.left;
MoveWindow(hTreePanel,0,30,Splitter_x,rect.bottom-rect.top-50,TRUE);
MoveWindow(hCommandPanel,Splitter_x,30,rect.right-rect.left,150,TRUE);
/*
GetClientRect(hToolBar,&rect);
MoveWindow(hToolBar,0,0,nWidth,rect.bottom-rect.top,TRUE);
*/
SendMessage(hToolBar,WM_SIZE,0,0);
SendMessage(hStatusBar,WM_SIZE,0,0);
return 0;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
GetClientRect(hWnd,&rect);
SetBkColor(hdc, RGB(128,128,128));
ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);
EndPaint (hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_MENU_NEW:
MessageBox(hWnd,"Ok","Ok",MB_OK);
return TRUE;
case IDOK:
return TRUE;
}
return FALSE;
return 0;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
狂汗!copy代码时没注意但背景颜色为白色这个问题仍然没解决,去掉TBSTYLE_FLAT|TBSTYLE_LIST风格才正常了
加CCS_NOMOVEY风格即可