读书笔记--MFC Windows程序设计(一)

前言:在看MFC Windows程序设计的时候,觉得有些地方还没掌握,觉得有必要把这些技能知识点记录下来,所以整理了下,把这些读书笔记发布出来,一来可以加深自己的理解,二来也可以贡献点微不足道的力量

 

创建工具栏方法:

1.CToolBar::Create创建工具栏

m_wndToolbar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,AFX_IDW_TOOLBAR);

 

也可以:m_wndToolBar.Create(this);

m_wndToolBar.SetBarStyle((m_wndToolBar.GetBarStyle() & ~CBRS_TOP) | CBRS_BOTTOM);

调用CToolBar::LoadBitmap加载包含按钮的命令

ID static UINT nButtonIDs[]={ ID_FILE_NEW, ID_FILE_OPEN, ...};

m_wndToolBar.Create(this);

m_wndToolBar.LoadBitmap(IDB_BITMAP);

m_wndToolbar.SetButtons(nButtonIDs,10);

CToolBar::SetSizes改变图象和按钮尺寸

 

2.从资源文件中加载--CToolbar::LoadToolBarCToolBar::SetButtonText改变按钮表面的字符串m_wndToolBar.Create(this);

m_wndToolBar.LoadToolBar(IDR_TOOLBAR);

m_wndToolBar.SetButtonText(0,_T("New"));

m_wndToolBar.SetButtonText(1,_T("Open"));

m_wndToolBar.SetSizes(CSize(48,42),CSize(40,19));

TBBS_CHECKBOX创建一个复选按钮TBBS_CHECKGROUP相当于TBBS_CHECKBOX | TBBS_GROUP这些属性实用CToolBar::SetButtonStyle 把工具栏添加单选按钮,选中其中一个作为默认按钮

int nState=m_wndToolBar.GetToolBarCtrl().GetState(ID_PART_LEFT);

m_wndToolBar.GetToolBarCtrl().SetState(ID_PART_LEFT,nState | TBSTATE_CHECKED);

只有调用工具栏的CControlBar::EnableDocking和框架窗口的CFrameWnd::EnableDocking函数,并有各自的位标志制定框架窗口一侧作为工具栏的安装位置,工具栏的可浮动和可摆放才有效

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

可使停放在父窗口的任一一侧用CFrameWnd的成员函数DockControlBar和FloatControlBar使工具栏浮动DockControlBar(&m_wndToolBar);

FloatControlBar(&m_wndToolBar,CPoint(x,y));

父窗口的坐标系 TBBS_WRAPPED相当于回车,后面的按钮放在下一行

m_wndToolBar.SetButtonStyle(1,m_wndToolBar.GetButtonStyle(0)|TBBS_WRAPPED);

 

 

工具栏的可见性:

1.CFrameWnd::OnBarCheck来隐藏或者显示CFrameWnd::OnUpdateControlBarMenu来选中或取消其ID和工具栏ID匹配的菜单项

On_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR,OnUpdateControlBarMenu)

On_COMMAND_EX(ID_VIEW_STATUS_BAR,OnBarCheck)

编写自己的命令和更新程序并用CFrameWnd::ShowControlBar隐藏或显示,通过查看WS_VISIBLE确定是否显示

ON_COMMAND(ID_VIEW_TOOLBAR,OnVieToolBar)ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR,OnUpdateViewToolBar)

void CMainFrame::OnViewToolBar()

ShowControlBar(&m_wndToolBar,(m_wndToolBar.GetStyle() & WS_VISIBLE)==0,FALSE);

}

 

void CMainFrame::OnUpdateViewToolBar(CCmdUI *pCmdUI)

pCmdUI->SetCheck((m_wndToolBar.GetStyle() & WS_VISIBLE)?1:0);

}

 

仅仅修改WS_VISIBLE无法实现显示隐藏,因为工具栏的显示隐藏时MFC会调整视图的大小,适应框架窗口客户区域内的变化 CControlBar::OnUpdateCmdUI是个虚函数,主结构在CPU空闲时调用,重载更新那些没有UI更新处理程序的控件设置工具栏永久化的两个函数:CFrameWnd::SaveBarState和CFrameWnd::LoadBarStateSaveBarState把每个工具栏的停放或浮动状态,位置,方向和可见性写到注册表在主框架窗口的OnCreate中调用LoadBarState,在OnClose中调用SaveBarState 在工具栏中添加其他按钮控件1.在TOOLBAR资源中添加一个按钮分隔符或者白按钮,任一ID和图像

 

2.调用CToolBar::SetButtonInfo来增加预留位置的宽度,使之能容纳控件,在该空白处创建控件SetButtonInfo(8,IDC_COMBOBOX,TBBS_SPEARATOR,nWidth);

CRect rect;

GetItemRect(8,&rect);

rect.botton=rect.top=nHeight;

m_wndComboBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST,rect,this,IDC_COMBOBOX);              

HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);

该函数不是API函数,需要用LoadLibrary 和 GetProcAddress来获取函数指针 //检测Common Ctrl的版本void GetCommonCtrlVersion(DWORD &dwMajor,DWORD &dwMinor)

dwMajor=dwMinor=0;  

HINSTANCE hLib=::LoadLibrary(_T("Contrl32.dll")); 

if( hLib!=NULL ) 

 DLLGETVERSIONPROC pDllGetVersion=   (DLLGETVERSIONPROC )::GetProcAddress(hLib,_T("DllGetVersion")); 

 if( pDllGetVersion )  

{  

 DLLVERSIONINFO dvi;   

ZeroMemory(&dvi,sizeof(dvi));  

 dvi.cbSize=sizeof(dvi);      

HRESULT hr=(*pDllGetVersion)(&dvi);   

if( SUCCEEDED(hr) )   

{    dwmajor=dvi.dwMajorVersion;    dwMinor=dvi.dwMinorVersion;   }  

}  

else  

{   dwMajor=4;   dwMor=0;  }    

::Freelibrary(hLib); }} DWORD dwMajor,dwMinor;GetComctlVersion(dwMajor,dwMinor);if( (dwMajor==4 && dwMinor>=70) ||  dwMajor>4 )

{  //the feature is supported}

else

{ //not supported}

 

在SDK的Windows程序中,通常使用WM_MENUSELECT消息来更新状态栏的描述性文本状态栏通过创建状态栏static UINT nIndicator[]={ ID_SEPARATOR, ID_INDICATOR_INS};

m_wndStatusBar.Create(this);

m_wndStatusBar.Setindicators(nIndicators,2);

通过SetPaneInfo来调整窗格信息

m_wndStatusBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NOBORDERS,64);

可以通过消息映射来更新状态栏的窗格

ON_UPDATE_COMMAND_UI(ID_INDICATORS,OnUpdateTime)

void CMainFrame::OnUpdateTime(CCmdUI *pCmdUI)

{ .... pCmdUI->SetText(...);}

在状态栏德文本前加一个“/t”,窗格文本居中对齐,两个"/t/t",窗格右对齐创建ReBar首先创建ToolBarm_wndToolBar.CreateEx(this);

m_wndToolBar.LoadToolBar(IDR_TOOLBAR);

m_wndReBar.Create(this);

m_wndReBar.AddBar(&m_wndToolBar);

可以使用AddBar的第2、3个参数指定标签和背景

m_bitmap.LoadBitmap(IDB_BKGND);m_wndReBar.AddBar(&m_wndToolBar,_T("Main"),&m_bitmap);

 

后记:这是第8章讲解工具栏,状态栏的篇章.后面还有一些知识点,我也会不定时地发布出来,希望是自己得到提高

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值