SDK创建工具条难题

Y___Y 2007-12-20 03:51:56
我用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_AUTOSIZ

E,
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;
}
...全文
1040 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skying510 2010-09-02
  • 打赏
  • 举报
回复
????????
asTyler 2008-08-27
  • 打赏
  • 举报
回复
我下了你的工程,也加了CCS_NOMOVEY风格可是还是没效果,不知道是哪里有问题
better0332 2007-12-23
  • 打赏
  • 举报
回复
挺羡慕你的!从小公司做起不是很好吗,又没有锁链锁着你,初来乍到者大公司很难重用你的
wangbinboy 2007-12-22
  • 打赏
  • 举报
回复
大家都是高手呀,我还不入行哦,怎么找个工作那么不容易,
难道专科生就找不到一个好一点的工作吗??
一群势力眼,
Y___Y 2007-12-20
  • 打赏
  • 举报
回复
谢谢大家的回答,问题已经解决
加CCS_NOMOVEY风格即可
Y___Y 2007-12-20
  • 打赏
  • 举报
回复
谢谢 高手.高手.高高手
狂汗!copy代码时没注意

但背景颜色为白色这个问题仍然没解决,去掉TBSTYLE_FLAT|TBSTYLE_LIST风格才正常了
zhoujianhei 2007-12-20
  • 打赏
  • 举报
回复

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);
}
Chivalry 2007-12-20
  • 打赏
  • 举报
回复
TBSTYLE_FLAT Creates a flat toolbar where both the toolbar and the buttons are transparent. Button text appears under button bitmaps. When this style is used, the button underneath the cursor is automatically highlighted.


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式是看
tcxjia 2007-12-20
  • 打赏
  • 举报
回复
工具条的实现过程

  MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC对其做了过多的封装,以至无法了解内部的一些核心技术。因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI应用程序接口来实现的。在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。由于对话框和状态栏属于程序界面的一部分,需要程序启动时就显示出来,因此获取句柄的代码和后面创建显示工具条、状态栏的全部代码都应当放在对话框初始化消息WM_INITDIALOG的响应函数OnInitDialog()中进行:

HWND hDlg=GetSafeHwnd();
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);
Y___Y 2007-12-20
  • 打赏
  • 举报
回复
图片:
工程源代码:http://p.blog.csdn.net/images/p_blog_csdn_net/Y___Y/TestFrame.rar.jpg
源代码下载后去掉.jpg扩展名解压即得。
Chivalry 2007-12-20
  • 打赏
  • 举报
回复
mark
iPhone自从发布的那一天起就成为科技界的焦点。但一直为人诟病的是,其本身并不支持开源软件开发,也一直没有推出相应的第三方开发工具。而iPhone SDK的发布无疑解决了这一难题。 开发人员可以使用iPhone SDK轻易地为iPhone和iPod Touch创建应用程序。其简单易学的操作方式和强大的功能为开发人员带来了超强的能力。 本书提供了关于iPhone SDK和iPhone开发的全面信息,对Objective-C编程语言、Xcode和Interface Builder开发工具进行了深入浅出的介绍,同时对iPhone开发的基本流程、原理和原则进行了详细和通俗的讲解。本书采用理论与实践相结合的方式,指导读者创建一系列应用程序,让读者能在实践中理解iPhone应用程序的运行方式和构建方式,掌握具体的iPhone特性,学会如何控制这些特性或与之交互。 全书共18章,分为3个部分。前4章介绍iPhone开发中的相关基本概念和开发人员所需的必备知识,并通过示例演示了一些标准的iPhone用户界面控件。第5章至第16章深入介绍如何开发各种高级iPhone特性,其中包括自动旋转、工具栏控制器、表视图、分层列表、应用程序设置、数据管理、绘图、手势输入、Core Location、加速计以及照相机和相片库。最后两章介绍如何将iPhone应用程序翻译为其他语言,从而让更多的用户接受并使用它,以及看完本书之后应该努力的方向。 本书覆盖面广、结构清晰,是一本有关iPhone开发的全新入门指南。它面向具备基本Objective-C知识的iPhone初、高级开发用户,不论你是经验丰富的开发人员,还是初涉编程领域的新手,都可以从本书中得到有用的信息。书中的示例通用性高,特别适合读者参考使用,这使 本书成为广大读者的首选。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧