打造自己的专业图像工具-Visual C++ 2005图像编程系列【三】

在这个图像处理工具软件中,需要实现的工具栏比较多。我想让每个工具栏都在浮动的时候没有关闭按钮,同时在工具箱Toolbar中还可以设置工具栏显示的列数。根据类抽象的原则,我们给所有的工具栏建立一个基类CBaseToolBar,从CToolBar派生。CBaseToolBar需实现的主要功能有:浮动时去掉关闭按钮和设置工具栏的列数。

Visual Studio.Net开始,包括Visual C++ 2005,去掉了Visual C++ 6.0中类向导功能。一些概念上也发生了变化。可以包含多个工程的WorkspaceSolution替代,称为一个解决方案。

Visual C++ 2005添加一个新的类,只需要在解决方案资源管理器中选择相应的工程,右键点击的弹出菜单中选择添加类,就会弹出添加类的向导对话框。如下图:

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 333pt; HEIGHT: 288.75pt" type="#_x0000_t75"><imagedata o:title="untitled" src="file:///C:%5CDOCUME~1%5CJon%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg"></imagedata></shape>

在出现的类向导对话框中,选择添加MFC类,然后点击添加按钮,最后选择CToolBar做为基类,派生类名输入CBaseToolBarVisual C++ 2005中的向导功能比Visual C++ 6.0更完善,选择功能更丰富了。如果是想在6.0版本中添加CToolBar的派生类是无法直接选择CToolBar类的,一般采用的方法是先选择CToolBarCtrl,添加完成后再采用手动修改的方法改为CToolBar,而现在可以直接选择CToolBar,省去了很多麻烦。

建立好CToolBar的派生类,我们看看如何实现设置工具栏列数和去掉关闭按钮。设置列数时我们给类添加一个函数:void SetColumns(int nColumn);给某个特定的类添加函数需要先从解决方案资源管理器切换到类视图,这里会显示所有的类。在对应的类名上的右键弹出菜单中选择添加函数或者变量:如下图:

<shape id="_x0000_i1029" style="WIDTH: 168pt; HEIGHT: 222pt" type="#_x0000_t75"><imagedata o:title="untitled" src="file:///C:%5CDOCUME~1%5CJon%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image002.jpg"></imagedata></shape>

在随后出现添加函数对话框,提供了非常丰富的功能,直接鼠标点击就可以为函数加上virtualstaticinline等关键字。

<shape id="_x0000_i1028" style="WIDTH: 414.75pt; HEIGHT: 308.25pt" type="#_x0000_t75"><imagedata o:title="2222" src="file:///C:%5CDOCUME~1%5CJon%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.jpg"></imagedata></shape>

设定好函数的返回类型和名称后,就添加参数。参数名框输入第一个参数的名称,然后点击添加按钮这个参数就被添加到右边的参数列表里。同时在下面的函数签名中可以预览函数的形式。是不是感觉功能比以前更丰富,使用更简单。添加完后在CPP文件中加入函数的实现代码:

void CBaseToolBar::SetColumns(int nColumns)

{

int nCount = GetToolBarCtrl().GetButtonCount();

for (int i = 0; i < nCount; i++)

{

UINT nStyle = GetButtonStyle(i);

BOOL bWrap = (((i + 1) % nColumns) == 0);

if (bWrap)

nStyle |= TBBS_WRAPPED; //或上TBBS_WRAPPED风格就是换行

else

nStyle &= ~TBBS_WRAPPED;

SetButtonStyle(i, nStyle);

}

Invalidate();

GetParentFrame()->RecalcLayout();

}

设置列数的功能完成,接着看如何去掉浮动关闭按钮。如果里曾经用向导建立过基于对话框的程序,那么你注意了在对话框的OnInitDialog函数里,有默认生成的将“关于...”菜单项添加到系统菜单中的代码。看出了点什么——其实标题栏上的右键和关闭按钮可以通过系统菜单进行控制。所以我们实现去掉浮点时的参数和关闭按钮也可以从这里开始。首先我们要判断工具栏时浮点还是停靠的,这个可以通过WM_WINDOWPOSCHANGED消息得到通知。

Visual C++ 2005给某个类添加消息映射函数,同样在类视图里选择相应的类,然后在右边弹出属性设置界面,如果这个属性设置框没有出现,可以通过工具栏按钮打开界面:

<shape id="_x0000_i1026" style="WIDTH: 154.5pt; HEIGHT: 56.25pt" type="#_x0000_t75"><imagedata o:title="untitled" src="file:///C:%5CDOCUME~1%5CJon%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.jpg"></imagedata></shape>

在属性设置界面中,存在过滤的工具栏,选择第五个的消息事件按钮,下面就列出了此类所有可用的消息,选择对应的消息,在右边的下拉框你添加消息响应函数即可。选择消息的时候最下面还会有消息的一些说明帮助我们理解这个消息。

<shape id="_x0000_i1027" style="WIDTH: 164.25pt; HEIGHT: 184.5pt" type="#_x0000_t75"><imagedata o:title="untitled2" src="file:///C:%5CDOCUME~1%5CJon%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image006.jpg"></imagedata></shape>

WM_WINDOWPOSCHANGED消息函数里,我们先判断工具栏是否处于停靠状态,如果是浮动状态就去掉系统菜单。这里需要注意的时,虽然在界面上看工具栏时浮动非停靠的,实际上工具栏是停靠在一个CMiniFrameWnd框架里。我们这里所指的系统菜单就是这个CMiniFrameWnd的系统菜单。

void CBaseToolBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)

{

CToolBar::OnWindowPosChanged(lpwndpos);

if(IsFloating())

{

if(m_pDockBar) // m_pDockBar指向停靠的窗口对象

{

//如果停靠窗口是 CMiniFrameWnd就去掉系统菜单

//IsFloating函数为FALSE的时候这个m_pDockBa的父窗口就是主框架

CWnd* pParent = m_pDockBar->GetParent();

if( pParent->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))

pParent->ModifyStyle(WS_SYSMENU, 0, 0 );

}

}

}

现在我们实现这 2 个基本的功能。在介绍的过程中,我特别的加入了一些图片,希望给那些对 Visual C++ 2005 不熟悉的朋友提供一些帮助。在后续的介绍中就不会再做介绍了。
安装使用说明: 一、本下载文件是《C/C++图像处理编程》一书的演示程序,该书由清华大学 出版社出版。 二、将 "C与C++图像处理编程\"目录全部拷贝到任意盘的根目录上。 、运行 X:\C与C++图像处理编程\DosImage.exe程序,演示图像处理功能。 四、该程序的源代码在 "C与C++图像处理编程\DosImage"目录下,用VC编译, 工作组文件为 X:\C与C++图像处理编程\DosImage\DosImage\DosImage.dsw。 修改、编辑、编译前,先将各子目录内文件的只读属性去除。 五、运行环境:Windows 1024x768 真彩色模式,文字用大字体。 编译软件:VC++ 6.0 程序特色:用C语言编写,DOS编程习惯 (过程驱动),并配所需图象文件 及字库文件。 编程练习:只需将编程练习模块Ex1 至 Ex12中任一程序的内容删除,即 可在其中编制自己的程序,不用修改菜单结构。 六、其它演示程序: WinImage Windows C 图像处理演示程序 VCImage VC++ 图像处理演示程序 Demop C++ Builder 图像处理演示程序 七、源代码 WinImage子目录 WinImage.exe的源代码 VCImage子目录 VCImage.exe的源代码 CBImage子目录 Demop.exe的源代码 八、图像采集演示程序 OkDemo子目录下为支持北京嘉恒中自图像技术有限公司 OK 系列 PCI 图 像卡的图像采集演示程序,在Windows 98与Windows 2000/XP等操作系统 下都能使用。 九、演示程序的维护 演示程序上网为程序的更新创造了条件,以后可将改正的错误和新增加 的内容定期或不定期地进行更新了。因此,希望读者能将阅读过程中发 现的错误与存在的问题,以及改进的建议等及时反馈给笔者,本人将在 力所能及的范围内进行修改,使之更加完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值