自己写了一个dlg的框架,在对话框类的OnInitDialog函数里写生成状态栏的代码,
//添加状态栏
HWND hDlg=GetSafeHwnd();
HINSTANCE hInstance=AfxGetInstanceHandle(); CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_MAXIMIZEBOX,
TEXT("This is MyDlg"), //显示在状态栏上的信息
hDlg, //父窗口句柄
IDS_STATE //预定义的资源ID
);
能够实现状态栏的添加,可是用
//添加状态栏
if (!m_wndStatusBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,AFX_IDW_STATUS_BAR)||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
}*/
的方法却添加不成功,请问这是为什么?
还有添加工具条和按钮的代码如下
//添加工具条
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
{
TRACE0("Failed to create toolbar\n");
}
//添加按钮
CButton myButton;
myButton.Create("about",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(10,20,10,30), this, 106);
都无法添加成功,是因为this的原因么?跟踪this值是正确的,请代码达人指教。
//添加状态栏
HWND hDlg=GetSafeHwnd();
HINSTANCE hInstance=AfxGetInstanceHandle(); CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_MAXIMIZEBOX,
TEXT("This is MyDlg"), //显示在状态栏上的信息
hDlg, //父窗口句柄
IDS_STATE //预定义的资源ID
);
能够实现状态栏的添加,可是用
//添加状态栏
if (!m_wndStatusBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,AFX_IDW_STATUS_BAR)||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
}*/
的方法却添加不成功,请问这是为什么?
还有添加工具条和按钮的代码如下
//添加工具条
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
{
TRACE0("Failed to create toolbar\n");
}
//添加按钮
CButton myButton;
myButton.Create("about",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(10,20,10,30), this, 106);
都无法添加成功,是因为this的原因么?跟踪this值是正确的,请代码达人指教。
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); 三、 状态栏的实现 状态栏的实现与工具条的实现相比非常简单,只需在CreateStatusWindow()函数中对其参数进行设置即可实现:HWND hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER,
TEXT("状态栏"),//显示在状态栏上的信息
hDlg, //父窗口句柄
IDS_STATUS); //预定义的资源ID 此时创建的状态栏只是一个位于对话框底部的长条,如需要将其分割为几部分可以在数组中设定好分割点的X坐标,然后通过向状态栏发送SB_SETPARTS消息即可,该消息的wParam参数指定了要将状态栏分割为几部分,lParam参数指定了各分割点的坐标值:int pint[4]={110,250,300,-1};//110,250,300设定间隔
::SendMessage(hStatusWindow,SB_SETPARTS,4,(LPARAM)pint); 如需向分割后的状态栏内填写信息,可以通过hStatusWindow向状态条发送消息SB_SETTEXT来完成,该消息的两个参数分别用来标识在第几个窗格显示和待显示的信息内容:::SendMessage(hStatusWindow,SB_SETTEXT,1,(LPARAM)TEXT("信息一"));
…… 小结:本文以SDK的方式实现了在MFC对话框程序下工具条和状态栏的动态添加,使普通的对话框程序也可以象SDI和 MDI程序一样拥有自定义风格的工具条和状态栏。全部实现过程的重点是在对相关结构的设置和消息的发送以及控件的动态创建。至于本文所涉及到的结构和函数的详细内容请参阅Microsoft 的MSDN Library 6.0。本文所述程序在Windows 98下,由Microsoft Visual C++ 6.0编译通过。
在视图框架中,主框架会自动调整各个Bar的大小,而对话框没有这个功能。