mfc静态分割窗口的方法
MFC静态分割视图窗口,切换,固定 收藏所谓静态分割窗口,就是窗口在程序生存期其窗口的分割状态保持不变,而动态就是相对静态而言的,
简单地说动态就像SQL Server2K的查询分析器那样,右边的窗口可以动态地分割成sql编辑环境和消息结果显示环境.
在MFC中要分割窗口,就需要用到CSplitterWnd类,但是有时候为了能够对分割实现更多的控制,就需要通过继承CSplitterWnd类来实现.
下面简述一下其操作过程.
在创建了一个单文档的工程后,先添加类CSplitterWndEx,其基类为CSplitterWnd,在MainFrame引用了头文件后就添加一个CSplitterWndEX的成员变量:
CSplitterWndEx m_wndSplitter; 然后在MainFrame的客户区创建事件的处理函数中添加分割的代码:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rect; GetClientRect(rect);
if (!m_wndSplitter.CreateStatic(this,1,2))
{ return FALSE; }
if (!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CLeftPaneView),CSize(rect.Width()/4,100),pContext))
{ return FALSE; }
if (!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMainInterface),CSize(100,100),pContext)) { return FALSE; }
return TRUE;
//return CFrameWnd::OnCreateClient(lpcs, pContext); } m_wndSplitter.CreateStatic(this,1,2)中的CreateStatic函数是用来静态拆分视图窗口,拆分成1行2列的情况,左边一般为操作的导航栏,而右边作为模块显示.
m_wndSplitter.CreateView (0,0,RUNTIME_CLASS(CLeftPaneView),CSize(rect.Width()/4,100),pContext)是用来 创建拆分后每一个Pane的视图的.
前两个参数为Pane的位置索引,(0,0)就是指首行首列的位置;RUNTIME_CLASS是用动态创建类对象,
也就是要在Pane显示的视图(函数中的CLeftPaneView);后面的CSzie是创建的宽度和高度的值. 上面的操作就基本上完成了静态分割视图窗口的创建.
创建好静态的拆分视图窗口后,就可能需要通过在左边的区域来实施右边区域的视图切换,来显示不同的操作界面.
实现视图切换,需要在左区域的切换事件中添加处理函数,来调用在MainFrame中的切换函数.在MainFrame中的视图切换函数如下:
void CMainFrame::SwitchToView(int nViewType) { //视图切换,获取分割区域,按行,列索引作为参数 CView* pView=(CView*)m_wndSplitter.GetPane(0,1);
//获取分割后右边的视图对象 CRect rcRight,rcFrame; pView->GetClientRect(&rcRight); GetClientRect(&rcFrame); switch(nViewType)
//判断视图切换,case中的比较参数是预先定义的宏 { case MAININTERFACE: { if (!pView->IsKindOf(RUNTIME_CLASS(CMainInterface)))
//判断分割的视图类 { m_wndSplitter.DeleteView(0,1);
//删除原Pane中的视图 m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMainInterface),CSize(rcRight.Width(),rcRight.Height()),NULL);
//创建新视图 m_wndSplitter.RecalcLayout();
//在调整后重新显示分割窗口 } }
break;
case CUSTOMERMGT: { if (!pView->IsKindOf(RUNTIME_CLASS(CCustomerMgt))) { m_wndSplitter.DeleteView(0,1);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCustomerMgt),CSize(rcRight.Width(),rcRight.Height()),NULL); m_wndSplitter.RecalcLayout(); } }
break;
default: break;
}
}
就是通过删除原视图,创建新视图,重新显示这三个操作再加简单的逻辑分支判断就实现了视图的切换.
当实现了基本的视图切换后,一个静态视图分割的过程就算是基本完成.不过有时候可能出于界面布局和美工的各方面考虑,希望对分割窗口实现大小固定,限制 使用者拖动分割条来调整两个分割的视图大小.
此时,可以在实现继承了的CSplitterWndEx类中添加LButtonDown(鼠标按下), MouseMove(鼠标移动),LButtonUp(鼠标恢复)这三个事件处理函数.通过自定义处理函数里面的内容,可以实现限制拖动的效果.在这三个 事件处理函数中都将其他的代码删掉,包括调用CSplitterWnd基类的相应函数,都统统删除,然后添加一句简单的return,取消了鼠标拖动的默 认效果,如下: void CSplitterWndEx::OnLButtonDown(UINT nFlags, CPoint point) { //固定左右视图的大小,禁止了对分割条的点击 return; }
基本的静态视图创建,切换和固定就完成了.
============================================================================
方法1:
================================================
//CMySplitter.h
#pragma once
#include "stdafx.h"
class CMySplitter:public CSplitterWnd
{
DECLARE_DYNAMIC(CMySplitter)
public:
DECLARE_MESSAGE_MAP()
protected:
//重载进行非客户区鼠标测试函数
afx_msg UINT OnNcHitTest(CPoint point);
};
================================================
//CMySplitter.cpp
#include "Cmysplitter.h"
IMPLEMENT_DYNAMIC(CMySplitter,CSplitterWnd)
BEGIN_MESSAGE_MAP(CMySplitter,CSplitterWnd)
ON_WM_NCHITTEST()
END_MESSAGE_MAP()
UINT CMySplitter::OnNcHitTest(CPoint point)
{
//返回HTNOWHERE...
return HTNOWHERE;
}
================================================
方法2:
================================================
//CMySplitter.h
#pragma once
#include "stdafx.h"
class CMySplitter : public CSplitterWnd
{
DECLARE_DYNCREATE(CMySplitter)
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
================================================
//CMySplitter.cpp
#include "CMySplitter.h"
IMPLEMENT_DYNCREATE(CMySplitter, CSplitterWnd)
BEGIN_MESSAGE_MAP(CMySplitter, CSplitterWnd)
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
void CMySplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
// 直接返回
return;
}
BOOL CMySplitter::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// 当光标进入分割窗口时,不允许改变样子
return FALSE;
}
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
//跳过调用CSplitterWnd::OnMouseMove,因为他会引起光标的改变
CWnd::OnMouseMove(nFlags, point);
}
===============================================================================
嵌入dlg
1.资源管理器中编辑你要的对话框资源/属性设为child,还有Title Bar去掉比较 好看
2.建立你的对话框类
3.在视中添加你定义的对话框类为成员变量:m_YourDlg.
4.在视图的OnCreate中:
m_YourDlg.Create(IDD_YourDLG,this);
//设置显示位置和方式
m_YourDlg.setWindowPos(......);
新建对话框:
第一种方法:
CYourDlg dlg;///
dlg.DoModal();
关于CYourDlg类,可以自己手动从CDialog中继承,也可以在资源中用控件画好对话框,然后双击对话框就可以自动生成相应的类。
第二种方法:
CYourDlg *dlg; //这要放在某各类的头文件中,或直接声明为全局变量
/以下执行代码
dlg= new CYourDlg (); //记得程序退出时要执行 delete dlg
dlg.Create(IDD_DIALOG1,this);
dlg.ShowWindow(SW_SHOWNORMAL);
其中IDD_DIALOG1 为你的对话框的资源ID,在对话框的属性中可以看到
===============================================================================
对话框按比例放缩
对于基于对话框的MFC程序来说,窗口大小的改变并不会对控件造成影响,如下:
初始状态:
改变大小后,并不影响控件:
这样的情况显得不那么协调,毕竟有时候我们希望控件也能正常的随窗体的改变而改变,该怎么做呢?
首先,我们先创建一个CDWordArray对象,并且添加函数setArrayControl,用来保存希望修改的控件,如下:
CDWordArray m_arrayControl;
inline void setArrayControl( DWORD dwControlID )
{
m_arrayControl.Add( dwControlID );
}
然后我们在OnInitDialog函数中添加代码保存希望修改的控件,如下:
// 添加需要随窗体大小改变而改变的控件
setArrayControl( IDOK );
setArrayControl( IDCANCEL );
然后,我们要添加2个成员变量用于保存窗体最后一次改变后的宽和高,这样我们就能在窗体再次改变后去计算改变的比例了,如下:
int m_nOldCX; // 最后一次修改后窗体的宽
int m_nOldCY; // 最后一次修改后窗体的高
同时,我们需要在OnInitDialog函数中添加代码保存窗体初始的宽和高,如下:
// 保存初始窗体的宽和高
CRect rect;
GetClientRect( &rect );
m_nOldCX = rect.right;
m_nOldCY = rect.bottom;
最后,我们需要在源代码中添加OnSize消息映射,这个消息在窗口大小改变时被回调,如下:
BEGIN_MESSAGE_MAP(COnSizeDlg, CDialog) // COnSizeDlg为定义的类名
ON_WM_SIZE()
END_MESSAGE_MAP()
afx_msg void OnSize( UINT nType, int cx, int cy ); 这个函数有3个参数,第一个参数nType定义了窗体请求调整大小的原因,可以取值如下:
SIZE_MAXIMIZED:窗体被最大化了
SIZE_MINIMIZED:窗体被最小化了
SIZE_RESTORED:窗体尺寸被调整了,但既不是SIZE_MAXIMIZED也不是SIZE_MINIMIZED。
SIZE_MAXHIDE:其他某些窗体最大化时,消息将发送至所有弹出式窗体。
SIZE_MAXSHOW:其他某些窗体恢复到以前大小时,消息将发送至所有弹出式窗体。
第二个参数cx指定了客户区的新宽度,第三个参数cy指定了客户区的新高度。
在回调OnSize的时候,我们知道窗体大小被改变了,此时,我们就要自己写代码,实现控件的变化,如下:
void COnSizeDlg::OnSize( UINT nType, int cx, int cy )
{
CDialog::OnSize( nType, cx, cy );
// 窗体宽改变的比例
double dCXPercent = ( 0 == m_nOldCX ) ? 1 : ( static_cast<double>(cx)/m_nOldCX );
// 窗体高改变的比例
double dCYPercent = ( 0 == m_nOldCY ) ? 1 : ( static_cast<double>(cy)/m_nOldCY );
CRect rect;
CWnd *pWnd;
for ( int i = 0; i != m_arrayControl.GetSize(); ++i )
{
pWnd = GetDlgItem( m_arrayControl[i] );
if ( NULL == pWnd )
{
continue;
}
pWnd->GetWindowRect( &rect ); // 得到控件大小
ScreenToClient( &rect ); // 转换到客户区大小
// 随窗体同比例改变
rect.left = static_cast<long>( rect.left * dCXPercent );
rect.right = static_cast<long>( rect.right * dCXPercent );
rect.top = static_cast<long>( rect.top * dCYPercent );
rect.bottom = static_cast<long>( rect.bottom * dCYPercent );
pWnd->MoveWindow( &rect );
}
// 保存最后次改变的宽和高
m_nOldCX = cx;
m_nOldCY = cy;
}
如此,我们的任务便完成了,来看看成果吧^-^!
another
CRect rect;
GetWindowRect(rect);
ScreenToClient(rect);
dlg1.MoveWindow(rect);
dlg1.ShowWindow(SW_SHOWNORMAL);
==============================================================================
在MFC中应用CTreeCtrl控件的技巧
作者:阿宽
下载源代码
首先,我们要创建一个基本对话框的MFC工程MFC_TreeCRTL(名字随便给一个)。然后在资源视图中插入两个Dialog,ID分别为IDD_DIALOG11和IDD_DIALOG211,都更改Style属性为Child,Border属性为None,为它们建立两个类,分别命名为Cdialog11和Cdialog211,并在MFC_TreeCRTLDlg.CPP文件中包含dialog11.h和dialog211.h两个头文件。再导入几个资源图标作为树形控件节点的图标及装饰面板。最后在主面板上添加一个CTreeCtrl控件,ID为默认,并在ClassWizard中添加它的一个变量,命名为m_mytree。
接着,我们进行具体代码编写。
我们必须在CMFC_TreeCRTLDlg类中加入这些变量和函数
CDialog * m_treePages[2];
CString node_name;
BOOL InitMytree();
我们还要在CMFC_TreeCRTLDlg类的构造函数中为m_treePages[2]分配空间,
m_treePages[0]=new Cdialog11;
m_treePages[1]=new Cdialog211;
InitMytree()函数为m_mytree的初始化过程
BOOL CMFC_TreeCRTLDlg::InitMytree()
{
//节点的图标
int i=0;
int i_count=2;
//载入图标
HICON icon[4];
icon[0]=AfxGetApp()->LoadIcon (IDI_ICON6);
icon[1]=AfxGetApp()->LoadIcon (IDI_ICON7);
//创建图像列表控件
CImageList *m_imagelist=new CImageList;
m_imagelist->Create(16,16,0,7,7);
m_imagelist->SetBkColor (RGB(255,255,255));
for(int n=0;n<i_count;n++)
{
m_imagelist->Add(icon[n]); //把图标载入图像列表控件
}
m_mytree.SetImageList(m_imagelist,TVSIL_NORMAL); //为m_mytree设置一个图像列表,使CtreeCtrl的节点显示不同的图标
m_mytree.SetBkColor(RGB(0,250,255));//设置m_mytree的背景色
//创建节点
//父节点
HTREEITEM root0=m_mytree.InsertItem("Dialog1",0,1,TVI_ROOT,TVI_LAST);
HTREEITEM root1=m_mytree.InsertItem("Dialog2",0,1,TVI_ROOT,TVI_LAST);
//一层子节点
HTREEITEM sub_son0=m_mytree.InsertItem("Dialog 1-1",0,1,root0,TVI_LAST);
HTREEITEM sub_son1=m_mytree.InsertItem("Dialog 2-1",0,1,root1,TVI_LAST);
//二层孙子节点
HTREEITEM sub_m_son0=m_mytree.InsertItem("Dialog 2-1-1",0,1,sub_son1,TVI_LAST);
//建立节点对应的Dialog
m_treePages[0]->Create(IDD_DIALOG11,this);
m_treePages[1]->Create(IDD_DIALOG211,this);
m_treePages[0]->ShowWindow(SW_SHOW);
m_treePages[1]->ShowWindow(SW_HIDE);
//把Dialog移到合适位置
CRect m_rect;
GetClientRect(m_rect);
m_rect.left=200;
m_treePages[0]->MoveWindow(m_rect);
m_treePages[1]->MoveWindow(m_rect);
return true;
}
始初化完成后,我们要添加CTreeCtrl的消息响应事件,这样才能让它按我们的要求起作用。我们打开Class Wizard点选IDC_TREE1添加TVN_SELCHANGED消息,并在消息响应函数中写入代码。
void CMFC_TreeCRTLDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
UpdateData(true);
node_name=m_mytree.GetItemText(pNMTreeView->itemNew.hItem);
//在标题栏显示节点信息
SetWindowText(node_name);
//切换面板
if(node_name=="Dialog 1-1"){
m_treePages[0]->ShowWindow(SW_SHOW);
m_treePages[1]->ShowWindow(SW_HIDE);
}
else if(node_name=="Dialog 2-1-1"){
m_treePages[0]->ShowWindow(SW_HIDE);
m_treePages[1]->ShowWindow(SW_SHOW);
}
UpdateData(false);
*pResult = 0;
}
最后,我们在 CMFC_TreeCRTLDlg::OnInitDialog()初始化函数里调用InitMytree()函数。程序运行效果:
=============================================================================
树形控件中右键菜单的添加和响应
要求很简单:用户右键单击树控件的条目(在单击何种条目才弹出可以控制)弹出菜单,选择菜单项目,做出响应。
首先来看在树形控件中添加右键菜单
选中树形控件,点击右键,选择为树形控件添加右键单击的事件处理程序,在其中添加菜单代码。.cpp文件中如下所示,h文件就不用列出了
void CMatDialog::OnNMRclickDevTree(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint cp;
GetCursorPos(&cp);
m_MatTree.ScreenToClient(&cp);
HTREEITEM titem = m_MatTree.HitTest(cp, NULL);
// 以上很关键,保证右键点击的位置是树叶或树枝
if(titem)
{
// 可以在此过滤点击树叶或树枝才弹出菜单,我没有限制
m_MatTree.SelectItem(titem);
m_MatTree.ClientToScreen(&cp);
// 创建自定义菜单
CMenu *pMenu = new CMenu();
VERIFY(pMenu->CreatePopupMenu());
pMenu->AppendMenu(MF_STRING,IDM_MATREP_EXPORT,"导出材料表");
pMenu->AppendMenu(MF_STRING,IDM_MATREP_IMPORT,"导入材料表");
// 注意需要在资源文件Resource.h中定义菜单资源
// #define IDM_MATREP_EXPORT 1002
// #define IDM_MATREP_IMPORT 1003
pMenu->TrackPopupMenu(TPM_LEFTALIGN,cp.x,cp.y,this);
pMenu->DestroyMenu();
}
*pResult = 0;
}
然后为菜单添加响应代码
在消息映射中添加消息响应函数,其实就是把菜单ID和你的响应函数建立一个连接,如果不明白可看看《深入浅出MFC》
BEGIN_MESSAGE_MAP(CMatDialog, CAcUiDialog)
ON_COMMAND(IDM_MATREP_EXPORT,OnSelectExport)
ON_COMMAND(IDM_MATREP_IMPORT,OnSelectImport)
ON_NOTIFY(NM_RCLICK, IDC_DEV_TREE, OnNMRclickDevTree)
END_MESSAGE_MAP()
头文件中照猫画虎
afx_msg void OnNMRclickDevTree(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnSelectExport();
afx_msg void OnSelectImport();
源文件中当然要添加处理代码
void CMatDialog::OnSelectExport()
{
// 得到选择项
HTREEITEM hr = m_MatTree.GetSelectedItem();
long lData = m_MatTree.GetItemData(hr);
// ....
}
void CMatDialog::OnSelectImport()
{
// .....
}
当然最重要的功能在这两个消息处理函数中,但是对我来说,最重要的之外才是重要的
void CPlayListDlg::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint cp;
GetCursorPos(&cp);
m_myplaytree.ScreenToClient(&cp);
HTREEITEM titem = m_myplaytree.HitTest(cp, NULL);
// 以上很关键,保证右键点击的位置是树叶或树枝
if(titem)
{
m_myplaytree.SelectItem(titem);
m_myplaytree.ClientToScreen(&cp);
CString str = m_myplaytree.GetItemText(titem);
// 创建自定义菜单
if( !m_myplaytree.GetParentItem(titem) && str != "最近播放列表" )
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,cp.x,cp.y,this);
}
// pMenu->TrackPopupMenu(TPM_LEFTALIGN,cp.x,cp.y,this);
// pMenu->DestroyMenu();
else
if(m_myplaytree.GetParentItem(titem)
&& str!= "最近追加项目" && str != "最近播放项目") //判断树节点,如果有父节点,则弹出资源ID为IDR_MENU2的菜单
{ //调用弹出菜单IDR_MENU2
CMenu menu;
menu.LoadMenu(IDR_MENU2);
CMenu *pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,cp.x,cp.y,this);
}
}
*pResult = 0;
}
===============================================================================
MFC ListControl如何使用
我写过的一个mfc文件系统(用的是list control,代码质量有点差)
首先呢拖个listcontrol控件,然后把转换
void CFileManageDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_list);
}
然后在你打开对话框的时候初始化
BOOL CFileManageDlg::OnInitDialog()
{...
m_list.InsertColumn(0, _T("文件名"));
m_list.InsertColumn(1, _T("大小"));
m_list.InsertColumn(2, _T("修改日期"));
m_list.InsertColumn(3, _T("文件类型"));
for(int j=0;j<4;j++)
m_list.SetColumnWidth(j ,140); //改变每一列宽度
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
要添加的时候
m_list.InsertItem(0,Foldername);
m_list.SetItemText(0,2,iDate);
m_list.SetItemText(0,3,iType);
要删除的时候
m_list.DeleteItem(m_list.GetNextItem(-1,LVNI_SELECTED));
==========================================================================
工具条按钮
(6)找到程序的CmainFrame框架类的成员变量m_wndToolBar,这东西就是工具条变量了,系统默认的是Ctoolbar类,将Ctoolbar修改成CtrueColorToolBar即可。 在程序的引用CtrueColorToolBar类的文件中包含其头文件,本例子是文件MainFrm.h的开头,增加一句: #include "TrueColorToolBar.h"
然后找到程序CmainFrame框架类的操作方法OnCreate函数。这里可是产生工具条的地方。增加这样一条语句: m_wndToolBar.LoadTrueColorToolBar( 48, IDB_NORMAL, IDB_NORMAL, IDB_DISABLED);
3个参数分别代表的意义是:48表示工具条按钮大小是48×48,第二个是normal工具条位图ID,第三个是hot工具条位图ID,最后一个是disable工具条位图ID。 增加的位置你参考例子代码。 现在可以编译运行了,怎么用,真彩工具条出来了吧。
(7)最后,你可以和一般程序一样,对系统产生的toolbar资源下的IDR_MAINFRAME工具条的按钮进行设置,编写相应的响应函数即可。例子程序中还有两个位图也添加到资源中了,你可以修改上面m_wndToolBar.LoadTrueColorToolBar函数中后3个参数看看效果,就知道了。
===============================================================================
VC/MFC 工具条不完全用法
工具条,在MFC编程中是常常用到的,其实创建的方法也很简单,待我慢慢说来。
一 新建一个ToolBar资源,设ID号为ID_FULLTOOLBAR;
二 在MainFrm.h中,添加一变量:
CToolBar m_FullToolBar;
三 在MainFrm.cpp的OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加以下代码:
//创建并加载工具条,CreateEx中的是一些常用风格,一般不用改变,其中CBRS_TOP 表示工具条的位置顶部,类似还有CBRS_LEFT,CBRS_BOTTOM,CBRS_RIGHT,大家一看便知其意了。
if (!m_FullToolBar.CreateEx(this, TBSTYLE_FLAT,WS_CHILD| WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_FullToolBar.LoadToolBar(IDR_TOOLBAR_FULL))
{
TRACE0("Failed to create toolbar/n");
return -1; // fail to create
}
四 为工具条添加可浮动功能
同样在MainFrm.cpp的OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加以下代码:
m_FullToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); //多个工具条,只写一次,一般情况MFC默认有一个工具条,所以这一句一般都已经有了,可以不写。
DockControlBar(&m_FullToolBar);
五 到此为止,工具条已经可以正常使用了。默认状态为停靠的,如果你要让工具条在程序启动时就浮动,可以添加下面这个代码:
FloatControlBar(&m_FullToolBar,CPoint(0,0));
//其中CPoint指明浮动的初始位置
六 显示和隐藏工具条
有时候我们要隐藏工具条,比如在全屏模式时。只要调用
ShowControlBar(&m_FullToolBar,FALSE,FALSE);
就可以了。
显然,要显示一个工具条,调用
ShowControlBar(&m_FullToolBar,TRUE,FALSE);
就行了。
七 说一下其它的可能用到的方法。
设置工具风格:SetBarStyle()
其中风格有:
CBRS_TOP (缺省的)位于顶部
CBRS_BOTTOM 放置在底部
CBRS_NOALIGN 在父窗口尺寸变化的时候,不要重新定位控制条
CBRS_TOOLTIPS 工具提示
CBRS_FLYBY 显示帮助提示
CBRS_SIZE_DYNAMIC 可动态改变工具条大小
还有很多风格,不一一列出了,详见MSDN吧。
刚才顺便在BAIDU中查了下工具更详细的知识,贴在下面,想了解更多的朋友可以看看:
----------------------------------------------------------------------------------------------------------
[From]http://blog.vckbase.com/iwaswzq/articles/1770.html
一、首先来看工具条类的派生关系
工具条类的派生关系如下:
//---------------------------
CObject
|_____CCmdTarget
|______CWnd
|____CControlBar
|_____CToolBar
//----------------------------
由于这样的继承关系,工具条类具有下列的特点和功能:
(1)从CObject继承来的功能
a. 串行化支持
b. 运行时刻的类信息
c. 对象诊断输出
d. 兼容 collection 类
如果在继承类的实现和声明中,使用了一些预定义宏,则派生类就可以实现CObject类的许多优点,
包括:
a.一级宏 DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC。使用该宏,将允许在运行时刻访问类的名字和它在继承表中的位置,也就意味着可以用来进行诊断。
b.二级宏 DECLARE_SERIAL 和 IMPLEMENT_SERIAL。该宏涵盖了一级宏的所有功能,并允许对象可以通过archive进行串行化。
(2)从CCmdTarget继承来的功能
CCmdTarget是MFC中所有具备消息循环的类的基类,主要包括CView, CWinApp, CDocument, CWnd, 和CFrameWnd。
除了消息循环,该类还提供了:
a. 漏斗鼠标
b. Dispatch映射,用于ole自动化中的IDispatch 函数,为VB调用提供了接口
(3)从CWnd类继承的功能
CWnd类提供可所有MFC库中窗口类的基本功能,CWnd类与windows下的窗口是有所区别的,但是两者有紧密的联系:CWnd类的构造函数和析构函数生成和销毁一个CWnd对象,窗口对象是CWnd类的Create函数生成的,在它的虚析构函数中销毁窗口对象。 DestroyWindow 函数也可以销毁窗口对象,但是不是CWnd对象。
CWnd类以及它的消息映射机制隐藏了WndProc函数,所有Windows消息被自动通过消息映射表转发到相应的OnMessage成员函数。应该在派生类中重载OnMessage成员函数来处理某个特定的消息。这意味着工具条可以有自己的消息映射表。
除此以外,CWnd还提供了很多功能,比如绘图,输出文字,设置菜单等等,但是某些功能在工具条中不能用,后面将通过剖析其源代码进行分析。
(4)从CControlBar继承的功能
CControlBar 是控制条类的基类,包括 CStatusBar, CToolBar, CDialogBar, CReBar 和COleResizeBar. 一个控制条窗口通常位于一个框架窗口的左侧或者右侧。它可以包含一些子项,有些是
窗口控件,比如列表框和编辑框,负责产生和响应Windows 消息,有些是非窗口控件,比如状态条面板和位图由应用程序和框架负责管理。
控制条窗口通常是一个框架窗口的子窗口,和客户区视窗口或者MDI客户区处于同一个地位。因此控制条
使用父窗口的客户区矩形信息来定位自己。而且负责把剩余的未使用的客户区大小通知父窗口。
二、使用CToolBar类
CToolbar对象具有一行位图按钮和可选的分割条,这些按钮的行为和下压按钮,check-box按钮和单选按钮一样。CToolBar对象通常嵌入 CFrameWnd 或者 CMDIFrameWnd对象里面。
CToolBar类的成员函数GetToolBarCtrl允许你使用Windows通用控件支持的特性来设计工具条或者添加额外的功能。CToolBar的成员函数已经提供了Windows通用控件的大多数功能,如果你调用GetToolBarCtrl,会返回一个CToolBarCtrl对象的引用,利用它可以实现 Windows 95工具条的许多特性。
Visual C++ 提供了两种生成工具条的方法:
要生成一个工具条,应该遵循下面的步骤:
1、生成一个工具条资源
2、构造工具条对象
3、调用 Create (或者 CreateEx) 函数生成一个工具条窗口,并把它关联到 CToolBar对象。
4、调用 LoadToolBar 函数加载工具条的资源。
或则采用下面的步骤:
1、构造一个工具条对象。
2、调用 Create (或者 CreateEx) 函数生成一个工具条窗口,并把它关联到 CToolBar对象。
3、调用 LoadBitmap 函数来加载包含工具条按钮图片的位图。
4、调用 SetButtons 函数来设置工具条按钮的样式并且把每个按钮与位图中的某个图片相关联。
一个工具条中的所有图片都来自于一个位图,该位图应该至少为每个按钮提供一个图片,所有的图片必需是相同的尺寸,缺省定义是 16 象素宽,15 象素高。在位图中,图片必需一个挨着一个。
SetButtons 函数使用一个指向 控制ID的数组指针和一个给出id数目的整数。该函数把工具条每个按钮的id设置成数组中对应的值,并且为每个按钮分配一个图片。如果数组中包含ID_SEPARATOR的项,则不会给它关联图片。
通常图片的顺序就是他们在屏幕上画的顺序,但是你可以通过函数SetButtonInfo来改变这个顺序。
一个工具条的所有按钮都是相同的尺寸。缺省定义是 24 x 22 象素,迎合了 Windows 软件设计接口规范的要求。在图片和按钮之外的其它多余空间是用来生成一个边框。
每个按钮有一个图片。不同的按钮状态和属性下 (压下,抬起,禁用,激活,以及中间态)的图片都从那个图片产生。虽然图片可以用任何颜色,但是带有灰色阴影的黑色图片效果最好。
工具条上的按钮初始状态都是下压按钮。然而,它们可以改成check-box 按钮或者单选按钮。Check-box 按钮具有三个状态:选中,清除和中间态,单选按钮只有两个状态:选中和清除。
要设置一个按钮或者分隔条的属性,可以通过函数 GetButtonStyle获得属性,然后调用 SetButtonStyle进行设置,而不用SetButtons。 SetButtonStyle函数在运行时刻改变按钮的属性十分好用。
要在按钮上显示文字,可以通过函数 GetButtonText获取文字,调用 SetButtonText设置文字。
要生成一个 check-box 按钮,只需加上 TBBS_CHECKBOX属性,或者在 ON_UPDATE_COMMAND_UI 处理函数中使用CCmdUI对象的SetCheck函数设置。只要调用SetCheck函数就会自动把下压按钮改变成为check-box按钮。
要生成一个单选按钮,可以在ON_UPDATE_COMMAND_UI处理函数中,调用CCmdUI对象的SetRadio函数。为了提供一组单选按钮的排它功能,你必须为该组的所有按钮都生成ON_UPDATE_COMMAND_UI处理函数。
三、关于通用控制条的认识(来自技术备忘录31:控制条)
本文所论及的内容包括MFC中的控制条类:
CControlBar, CStatusBar, CToolBar, CDialogBar, 和 CDockBar.
(一)CControlBar
ControlBar 派生自 CWnd,通常定位于框架窗口的顶端或者底部。它可以包含窗口类的子项,比如 CDialogBar,或者非窗口类的子项,比如CToolBar和 CStatusBar。
控制条支持的样式包括:
CBRS_TOP (缺省的)位于顶部
CBRS_BOTTOM 放置在底部
CBRS_NOALIGN 在父窗口尺寸变化的时候,不要重新定位控制条
从 CControlBar派生的类提供了更加有趣的功能:
(a) 状态条CStatusBar ,它的子项是包含文字的面板
(b) 工具条CToolBar ,对于工具条来说,子项是排列成一行的位图按钮
(c) 对话框条CDialogBar 象一个框架一样的工具条,包括标准windows控件 (从一个对话框模板资源生成)
(d) CDockBar,可以认为它是为其它控制条类提供对接区域的一个区域。该类的成员函数和变量在将来可能还要变化。
记住:所有的控制条对象必需是某个框架窗口的子窗口。通常它们被作为框架客户区(例如,一个MDI客户区或者一个视窗口)的同级窗口。对于一个控制条来说,它的子窗口ID是非常重要的。仅仅当它的ID的值位于AFX_IDW_CONTROLBAR_FIRST和AFX_IDW_CONTROLBAR_LAST之间时,控制条的缺省布局才能起作用。
#define AFX_IDW_CONTROLBAR_FIRST 0xE800
#define AFX_IDW_CONTROLBAR_LAST 0xE8FF
注意,虽然一共有256个控制条ID,前面的32个是做特殊用途的,它们直接被打印预览结构支持。
CControlBar类提供了
A.在框架窗口里面定位工具条的标准实现。
B.分配控制条项队列
C.支持派生类的实现
C++ 控制条对象通常作为成员嵌入一个CFrameWnd派生类对象中。而且当父窗口销毁的时候,它也被清除。如果你想在堆中分配一个控制条对象,你可以将它的 m_bAutoDestruct成员设置成 TRUE,从而当HWND销毁的时候允许它 “delete this”。
重要提示:如果你派生了自己的控制条对象,则必须重载Create函数,在其中设置 m_dwStyle数据成员,例如:
// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create( CWnd* pParentWnd, DWORD dwStyle, UINT nID )
{
m_dwStyle = dwStyle;
.
.
.
}
(二)控制条的布局原理
控制条的布局原理非常简单,框架窗口按照 Z-顺序发送消息 WM_SIZEPARENT给所有控制条子窗口,并跟随这个消息传递一个父窗口客户区矩形的指针。控制条使用这个矩形信息来定位自己,并且把父窗口的客户区尺寸减小,剩下的是正常的客户区域,用于定位主要的客户区窗口,通常是一个MDI客户区,视或者拆分窗口。
详细情况可以参考 CWnd::RepositionBars 和 CFrameWnd::RecalcLayout 两个函数。
MFC 私有窗口消息,包括WM_SIZEPARENT,都在技术备忘录24中说明。
(三)工具条
工具条支持两种按钮: 下压按钮和check box按钮。通过使用check box按钮组加上适当的ON_UPDATE_COMMAND_UI处理,可以得到单选按钮组的功能。
工具条中的所有按钮的图片都取自同一个位图。每个按钮尺寸相同(缺省尺寸是24x22象素大小),每个按钮的图片尺寸相同而且相连, 图片的缺省大小是16x15象素,所以如果一个工具条具有10个按钮,则需要位图的尺寸是160象素宽,15 象素高。
工具条按钮的所有状态的图片都是通过一定的算法从那一个图片中转换得到。因此,虽然理论上按钮图片可以使用任何颜色,但是对于这个算法来说,如果原始图片使用灰色阴影效果比较好。
项 Windows 颜色 缺省RGB值
工具条背景 COLOR_BTNFACE RGB(192, 192, 192)
工具条左/上边框 COLOR_BTNHIGHLIGHT RGB(255, 255, 255)
工具条右/下边框 COLOR_BTNSHADOW RGB(128, 128, 128)
对工具条的 CCmdUI 支持:
工具条按钮的更新是通过空闲时刻调用 ON_UPDATE_COMMAND_UI 完成的。通过这个函数可以:
1、允许/禁止工具条按钮。
2、设置按钮为check状态。注意调用SetCheck函数会把按钮变成check box 按钮。
3、SetRadio: 设置类似单选按钮的功能。
工具条按钮会象正常的按钮一样发送WM_COMMAND消息,通常被一个ON_COMMAND函数处理。
工具条按钮一共有四种样式(代表四种状态):
TBBS_CHECKED
TBBS_INDETERMINATE
TBBS_DISABLED
TBBS_PRESSED
正式的按钮状态定义是六种,它们是:
Up = 0
Mouse Down = TBBS_PRESSED (| any other style)
Disabled = TBBS_DISABLED
Down = TBBS_CHECKED
Down Disabled = TBBS_CHECKED | TBBS_DISABLED
Indeterminate = TBBS_INDETERMINATE
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cai0538/archive/2010/09/04/5862890.aspx
=========================================================================
派生工具条类
先从CToolBar派生一个类CSXBar(名字随便取啊)
头文件里(CSXBar.h)
class CSXBar : public CToolBar
{
public:
...
protected:
//{{AFX_MSG(CSXBar)
afx_msg BOOL OnEraseBkgnd(CDC* pDC); //声明消息相应函数
//}}AFX_MSG
}
源文件里(CSXBar.cpp)
添加消息
BEGIN_MESSAGE_MAP(CSXBar, CToolBar)
//{{AFX_MSG_MAP(CSXBar)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
添加消息相应函数
BOOL CSXBar::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap m_bk;
m_bk.LoadBitmap(IDB_BK);
CDC m_dcbk;
m_dcbk.CreateCompatibleDC(pDC);
BITMAP m_bkInfo;
m_bk.GetBitmap(&m_bkInfo);
m_dcbk.SelectObject(&m_bk);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&m_dcbk,0,0,m_bkInfo.bmWidth,m_bkInfo.bmHeight,SRCCOPY);
return 1;
}
一个新的类就做好了
然后在MainFrame头文件里包涵自己的类头文件
#include "SXBar.h"
最后一步,将原来的
CToolBar m_wndToolBar;
改成
CSXBar m_wndToolBar;
就完工了
记住了,分四步:
派生新的类
添加消息响应
编写消息相应函数
调用新的类
===============================================================================
CButtonST
效果一:在按钮上加入Icon,使Icon和文字同时显示
假设按钮ID为IDC_BUTTON1
1. 添加成员变量
CButtonST m_btn;
2. 添加Icon资源,设其ID设为IDI_ICON1
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetFlat(FALSE);
注意:为达到最好效果,请根据Icon的大小调整按钮的大小。
实例:演示程序中的Standar 按钮。
效果二:显示平面按钮
只需要在效果一的基础上把m_btn.SetFlat(FALSE);语句去掉。
效果三:使按钮上的图标可变
假设按钮ID为IDC_BUTTON1
1. 添加成员变量
CButtonST m_btn;
2. 添加两个Icon资源,ID设为IDI_ICON1和IDI_ICON2
IDI_ICON1是普通状态的图标,IDI_ICON2是按下时的图标
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON2,IDI_ICON1);
实例:演示程序中的Halloween 按钮。
效果四:设置按钮在不同状态下的底色和文字颜色
假设按钮ID为IDC_BUTTON1
1. 添加成员变量
CButtonST m_btn;
2. 添加Icon资源,设其ID设为IDI_ICON1
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
提示:SetColor函数和OffsetColor函数的第一个参数表示按钮的各个状态,前景色就是文字的颜色,它们的取值表示:
BTNST_COLOR_BK_IN //鼠标放在按钮内时的背景色
BTNST_COLOR_FG_IN, //鼠标放在按钮内时的前景色
BTNST_COLOR_BK_OUT, //普通状态时的背景色
BTNST_COLOR_FG_OUT, //普通状态时的前景色
BTNST_COLOR_BK_FOCUS, //按钮被按下后的背景色
BTNST_COLOR_FG_FOCUS, //按钮被按下后的前景色
实例:演示程序中的48×48 icon 按钮、Zip按钮等。
效果五:设置图标和文字的位置
假设按钮ID为IDC_BUTTON1
1.添加成员变量
CButtonST m_btn;
2.添加Icon资源,ID设为IDI_ICON1
3.在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
提示:SetAlign函数的第一个参数表示位置信息,缺省情况下,文字在图标右边
ST_ALIGN_HORIZ // 文字在右
ST_ALIGN_VERT //文字在下
ST_ALIGN_HORIZ_RIGHT// 文字在左
实例:演示程序中的Search 按钮。
效果六:根据Icon的形状设置按钮的形状
假设按钮ID为IDC_BUTTON1
1.添加成员变量
CButtonST m_btn;
2.添加Icon资源,设其ID设为IDI_ICON1
3.在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.DrawBorder(FALSE);
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_IN, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
注意:为达到最好效果,请根据Icon的大小调整按钮的大小。
并根据实际情况设置背景颜色。请事先将按钮的文字去掉。
效果七:添加Tooltips
假设按钮ID为IDC_BUTTON1
1.添加成员变量
CButtonST m_btn;
2.添加Icon资源,设其ID设为IDI_ICON1
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetTooltipText(_T("This is a tooltip./r/nMultiline!"));
============================================================================
VC++ MFC comboBox控件使用
1.你在编辑状态下点那个控件的向下的三角形,就出冒出来一个可以调高度的东东。将高度调高,否则在执行时会不能显示下拉选项。
2.为combo box添加选项,在编辑状态下选combo box控件的属性,选Data标签,在编辑框中添加选项,按Ctrl-Enter来添加下一个选项。
3.为combo box添加变量
combo box有两个变量,CComboBox类变量和CString变量。
CComboBox变量用来设置combo box的属性,一般在cdialog类中的oninitdialog()函数中使用。添加方法是在classwizard中添加变量,添加时Category中选Control。例如:CComboBox.SetCurSel(0)用来设置下拉菜单初始值,具体看MSDN。
CString变量用来存储下拉菜单所选的选项值。同样,当选项发生变化时要使用UpdateData(TRUE)函数更新该变量的值。
-----------------------------------------------------------------------------------------------------------------------------
一、初始化Combo Box控件
(1)在资源视图中,选择控件的"Properties",然后在Data选项卡里为控件添加初始化数据,换行是按Ctrl+Enter,然后,再修改Style选项卡里的Type属性为Drop List。
(2)在程序初始化时动态添加
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除ID为IDC_COMBO_CF现有所有内容
for(int i=1;i<=100;i++)
{
strTemp.Format("%d",i);
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp); //为控件添加初始化数据
}
(3)删除
DeleteString( UINT nIndex ) //删除指定行
(4)插入
InsertString( int nIndex, LPCTSTR lpszItem ) //将行插入到指定位置
(5)查找
FindString( int nStartAfter, LPCTSTR lpszItem ) //可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem ) //可以选中包含指定字符串的行
二、如何控制Combo Box的下拉长度
1,首先要知道两点:一、那就是在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是Combo Box的下拉调整框。
2,二、属性里有个 No integral height 钩选项,表示最大长度为设计长度,如果实际内容比设计长度多,就出现滚动条,少就以实际长度显示。
三、选择其中的某行
(1)选中:
int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
(2)设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。
四、取得Combo Box框内容
(1)取当前内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp); //将获取的值存放到CString类型变量strTemp中。
如果定义了关联的变量,例如m_combo,可以直接获取:m_combo->GetWindowText(strTemp);
(2)取其他行内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp); //其中n为从0开始的索引值
五、获取当前选择的行数
例如:((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel() 返回的是当前选中值的行数,是整型。
或者:UINT m_row = m_combo->GetCurSel()
六、获得焦点
通常要判断控件是否获得了焦点,可以用GetFocus()函数
例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。
但是combobox 的焦点不同,因为它是由edit和listbox两部分组成的
所以获得焦点要用GetParent():if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
------------------------------------------------------------------------------------------------------------------------------
一、如何添加/删除Combo Box内容
1,在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。
2,在程序初始化时动态添加
如: //控件内容初始化
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除现有所有内容
for(int i=1;i<=100;i++)
{
strTemp.Format("%d",i);
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
}
3,下拉的时候添加
如:
CString strTemp;
int iCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount(); //取得目前已经有的行数
if(iCount<1)//防止重复多次添加
{
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();
for(int i=1;i<=100;i++)
{
strTemp.Format("%d",i);
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
}
}
4,删除
DeleteString( UINT nIndex ) //删除指定行,
5,插入
InsertString( int nIndex, LPCTSTR lpszItem ) //将行插入到指定位置
6,查找
FindString( int nStartAfter, LPCTSTR lpszItem ) //可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem ) //可以选中包含指定字符串的行
二、如何控制Combo Box的下拉长度
1,首先要知道两点:一、那就是在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是Combo Box的下拉调整框。
2,二、属性里有个 No integral height 钩选项,表示最大长度为设计长度,如果实际内容比设计长度多,就出现滚动条,少就以实际长度显示。
三、选择其中的某行
1,选中:
int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
2,设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。
四、取得Combo Box框内容
1取当前内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);
2取其他行内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);
------------------------------------------------------------------------------------------------------------------------------
两个DropDownList 控件,选择第一个后,第二个根据第一个搜索数据库表内容填充信息。
问题是,第一个DropDownList 控件,我实现了SelectedIndexChanged事件,不过好像没反应啊。
谢谢
把Postback设成True
AutoPostBack="True"
===================================================================
通过下面的方法测试:
if(m_ToolBar.GetButtonStyle(0) == TBBS_BUTTON)
{
AfxMessageBox("This is Button Style");
}
必须添加以下的设置:
m_ToolBar.SetButtonStyle(0,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(1,TBBS_CHECKBOX);
SetButtonStyle函数的原型及其相关的说明:(引自MSDN)
1、void SetButtonStyle( int nIndex, UINT nStyle );
Parameters
nIndex
Index of the button or separator whose information is to be set.
nStyle
The button style. The following button styles are supported:
TBBS_BUTTON Standard pushbutton (default)
TBBS_SEPARATOR Separator
TBBS_CHECKBOX Auto check-box button
TBBS_GROUP Marks the start of a group of buttons
TBBS_CHECKGROUP Marks the start of a group of check-box buttons
Remarks
Call this member function to set the style of a button or separator, or to group buttons. A
button's style determines how the button appears and how it responds to user input.
2、还有一种修改Button属性的函数
void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );
===========================================================================
在MFC中创建动态控件的生成与响应(2)
时间:2011-04-22 风林
本例中我们创建一个CButton类的普 通按钮。注意不能直接定义CButton对象,如:CButton m_MyBut;这种定义只能用来给静态控 件定义控制变量,不能用于动态控件。
正确做法是用new调用CButton构造函数生成一 个实例:
CButton *p_MyBut = new CButton();
然后用CButton类的Create() 函数创建,该函数原型如下:
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
lpszCaption是按钮上显示 的文本;
dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:
窗口风格:
WS_CHILD 子窗口,必须有
WS_VISIBLE 窗口可见,一般 都有
WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用
WS_TABSTOP 可用Tab键选择
WS_GROUP 成组,用于成组的单选按钮中的第一 个按钮
按钮风格:
BS_PUSHBUTTON 下压式按钮,也即普通按钮
BS_AUTORADIOBUTTON 含自动选中状态的单选按钮
BS_RADIOBUTTON 单选按钮 ,不常用
BS_AUTOCHECKBOX 含自动选中状态的复选按钮
BS_CHECKBOX 复选按 钮,不常用
BS_AUTO3STATE 含自动选中状态的三态复选按钮
BS_3STATE 三态 复选按钮,不常用
以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。
BS_BITMAP 按钮上将显示位图
BS_DEFPUSHBUTTON 设置为默认按钮,只用于下 压式按钮,一个对话框中只能指定一个默认按钮
rect指定按钮的大小和位置;
pParentWnd指示拥有按钮的父窗口,不能为NULL;
nID指定与按钮关联的ID号 ,用上一步创建的ID号。
不同控件类的Create()函数略有不同,可参考相关资料。
例:p_MyBut->Create( "动态按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );
这样,我们就在当前 对话框中的(20,10)处创建了宽60,高30,按钮文字为“动态按钮”的下压式按钮 。
PS:系统按钮风格
/*
* Button Control Styles
*/
#define BS_PUSHBUTTON 0x00000000L
#define BS_DEFPUSHBUTTON 0x00000001L
#define BS_CHECKBOX 0x00000002L
#define BS_AUTOCHECKBOX 0x00000003L
#define BS_RADIOBUTTON 0x00000004L
#define BS_3STATE 0x00000005L
#define BS_AUTO3STATE 0x00000006L
#define BS_GROUPBOX 0x00000007L
#define BS_USERBUTTON 0x00000008L
#define BS_AUTORADIOBUTTON 0x00000009L
#define BS_PUSHBOX 0x0000000AL
#define BS_OWNERDRAW 0x0000000BL
#define BS_TYPEMASK 0x0000000FL
#define BS_LEFTTEXT 0x00000020L
#if(WINVER >= 0x0400)
#define BS_TEXT 0x00000000L
#define BS_ICON 0x00000040L
#define BS_BITMAP 0x00000080L
#define BS_LEFT 0x00000100L
#define BS_RIGHT 0x00000200L
#define BS_CENTER 0x00000300L
#define BS_TOP 0x00000400L
#define BS_BOTTOM 0x00000800L
#define BS_VCENTER 0x00000C00L
#define BS_PUSHLIKE 0x00001000L
#define BS_MULTILINE 0x00002000L
#define BS_NOTIFY 0x00004000L
#define BS_FLAT 0x00008000L
#define BS_RIGHTBUTTON BS_LEFTTEXT
===============================================================
置顶
如果你用SDK可以如此,基本同panda_w兄所言:
SetWindowLong(hWnd, GetWindowLong(hWnd, GWL_EXSTYLE, GWL_EXSTYLE) | WS_EX_TOPMOST );
SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
当你建立了一个基本对话框应用程序时,设置对话框置顶,可以在初始化对话框函数或者在消息响应函数里添加以下语句设置置顶:
SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);取消置顶:SetWindowPos(&wndNoTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);不需做任何修改即可完成。当建立的是单文档应用程序时,要在前面多一个窗口句柄函数。下面是更详细的说明:函数名: SetWindowPos
头文件: winuser.h
函数原型:
BOOLSetWindowPos
(
HWNDhWnd,//窗口句柄
HWNDhWndInsertAfter,//排列顺序的句柄
intX,//水平坐标
intY,//垂直坐标
intcx,//宽
intcy,//高
UINTuFlags//窗口定位标识
);
说明:
这个函数能改变窗口的大小、位置和设置子窗口、弹出窗口或顶层窗口的排列顺序。
===============================================================
在对话框编辑器中,可以用属性定义来做
1. 如果是点一下按下,再点一下弹起,可以用Checkbox,然后修改它属性为Push_Like.
1. 如果是一组按钮,只有一个是按下的。按下另一个,当前按下的按钮弹起,则可以用RadioButton,同样修改它们属性为Push_Like.
必须添加以下的设置:
m_ToolBar.SetButtonStyle(0,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(1,TBBS_CHECKBOX);
==================================================================================
在文档类的OnNewDocument函数中
this-> SetTitle( "Hollow World ");
或在VIEW类的任意地方这样做:
GetDocument()-> SetTitle( "Hello World ");