<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Free2000fly&#039;s Official Blog &#187; WTL</title>
	<atom:link href="http://blog.tinybrowser.net/archives/category/wtl/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.tinybrowser.net</link>
	<description>Free2000fly 个人博客</description>
	<lastBuildDate>Fri, 06 Jan 2012 21:12:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>About DLGINIT in WTL</title>
		<link>http://blog.tinybrowser.net/archives/1998</link>
		<comments>http://blog.tinybrowser.net/archives/1998#comments</comments>
		<pubDate>Mon, 05 Jul 2010 15:34:55 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[DLGINIT]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=1998</guid>
		<description><![CDATA[I&#8217;m using the wizard to load some static strings into a CComboBox. When I run the app the strings aren&#8217;t visible. Here&#8217;s what the link below says: Initializing a Combo-Box The ResourceView in VC++&#8217;s DevStudio allows entries in a combobox to be added to the resource template at design time. When you add a combobox, [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/1998/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MSN 式样通知窗口的 WTL 实现</title>
		<link>http://blog.tinybrowser.net/archives/1702</link>
		<comments>http://blog.tinybrowser.net/archives/1702#comments</comments>
		<pubDate>Mon, 05 Apr 2010 20:03:44 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[msn]]></category>
		<category><![CDATA[Notifier]]></category>
		<category><![CDATA[Taskbar]]></category>
		<category><![CDATA[TaskbarNotifier]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=1702</guid>
		<description><![CDATA[源码: &#19979;&#36733;: taskbarnotifier.h// CTaskbarNotifier Header file &#160; #pragma&#160;once &#160; #define&#160;WM_TASKBARNOTIFIERCLICKED&#160; &#160; WM_USER+123 #define TN_TEXT_NORMAL&#160; &#160; &#160; &#160; &#160; &#160; 0x0000 #define TN_TEXT_BOLD&#160; &#160; &#160; &#160; &#160; &#160; 0x0001 #define TN_TEXT_ITALIC&#160; &#160; &#160; &#160; &#160; &#160; 0x0002 #define TN_TEXT_UNDERLINE&#160; &#160; &#160; &#160; 0x0004 &#160; &#160; #define&#160;IDT_HIDDEN&#160; &#160; &#160; &#160; &#160; &#160; 0 #define IDT_APPEARING&#160; &#160; &#160; [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/1702/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个自定义 ComboBox 的移植过程 (转载)</title>
		<link>http://blog.tinybrowser.net/archives/403</link>
		<comments>http://blog.tinybrowser.net/archives/403#comments</comments>
		<pubDate>Wed, 20 Jan 2010 17:07:54 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[ComboBox]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=403</guid>
		<description><![CDATA[现在有一个MFC写的自定义ComboBox打算移植到WTL上，于是根据WTL的书写方法修改了程序，就得到下面的代码： 如何生成以上代码及代码的含义，原书都有介绍，由于不是本文的重点，不再一一解释。 要说的是，在WTL 7.1中添加了DDX_CONTROL_HANDLE宏，可以用来设置控件，与DDX_CONTROL不同的是，它不要求控件类由CWindowImpl派生，即不需要包含SubclassWindow()函数，这样我们才可以使用DDX来设置我们从CComboBox派生的类（听上去很有道理，其实却是在MFC编程习惯带动下错误思维）。 当然，要实现还有一个小小的问题，DDX_CONTROL_HANDLE宏需要我们的类包含一个操作符“=”，怎么写这个函数呢？参看了一下基类的实现方法： 参看WTL文件 原来只是将m_hWnd赋值，于是我们在我们的类中添加如下的代码： 于是编译通过了。（殊不知潜在的错误就这样被深深的埋起来了） 可是为什么DDX_CONTROL_HANDLE宏需要我们的类包含操作符“=”呢？我们来看看DDX_CONTROL_HANDLE宏是怎么实现的： 整个DDX_MAP其实是定义了一个DoDataExchange函数，BEGIN_DDX_MAP宏定义了函数头，而END_DDX_MAP定义了函数尾，中间一项项的DDX定义函数的具体内容，而当你在代码中定义DDX_MAP的时候就等于重载了CWinDataExchange::DoDataExchange()函数，具体代码如下： 参看WTL文件 对于DDX_CONTROL_HANDLE宏，它其实是调用了CWinDataExchange:: DDX_Control_Handle函数，具体代码如下： 参看WTL文件 正如上面的代码，DDX_CONTROL_HANDLE宏是直接将ID所对应的窗体句柄直接赋值给DDX所链接的控件类，于是我们在DDX_MAP中定义的语句与下面的语句是等价的： 所以要想使上面的语句能够使用，重载操作符就变成了一个解决问题的好办法，这就是DDX_CONTROL_HANDLE宏需要我们的类包含操作符“=”的原因。 到这里，我们已经知道了为什么，也作了应该做的事，移植的工作就剩下测试了。当然如果你熟悉WTL或者仔细看了上面的代码，也许会发现有一个很大的问题潜伏着。可是我们是MFC的程序员，习惯用MFC的方法去思考，于是奇怪的事情在测试的时候发生了。 运行一切正常，只是我们在重画函数中的代码没有运行，换句话说，就是重画事件没有被触发。 为什么？我们的所有代码都是按照正确的方法写成的，在CComboBoxEx的MSG_MAP中添加MSG_OCM_DRAWITEM宏来映射重画事件，在CMainDlg的MSG_MAP中添加REFLECT_NOTIFICATIONS()宏。 该做得都做了。为什么不行呢？ 在原书中提到，使用 DEFAULT_REFLECTION_HANDLER来处理缺省的反射事件，难道因为缺少这个宏吗？虽然这不是一个符合逻辑的想法，可是现在也把它拿来当活马医一医了。 于是我们在原来的类中添加这个宏，结果错误出现了，提示没有DefaultReflectionHandler函数的定义，哦？这是什么意思啊？我们来查查原码： 参看ATL文件 原来DEFAULT_REFLECTION_HANDLER宏只是调用DefaultReflectionHandler函数，那么这个函数又是何许人也呢？DefaultReflectionHandler是CWindowImplRoot的成员函数，也可以说是CWindowImpl的成员函数，因为CWindowImpl由CWindowImplBase派生，而CWindowImplBase由CWindowImplRoot派生，DefaultReflectionHandler函数其实是对API函数DefWindowProc的封装，不过它只限于处理OCM_的事件。如下面的代码： 看到这里，如果想添加DEFAULT_REFLECTION_HANDLER宏，控件类就要由CWindowImpl派生。为了测试把死马当活马医的想法，我们把类的定义改为如下这样： 于是，添加DEFAULT_REFLECTION_HANDLER宏得操作通过了编译，但是事实证明，不合逻辑的想法很难带来正确的结果，不仅重画事件没有被触发，修改后，在控件类析构时碰到了ATL的断言。 错误提示是，类在窗体句柄销毁之前被析构。 这个错误到让我们想到原书中提到的一个WTL特性，WTL不会自动销毁窗体句柄，需要自己手工Detach()窗体句柄。既然这样，我们又添加了下面的代码： 虽然，没有Attach()的Detach()感觉有点怪，可是毕竟ATL的断言不会出现了。但是，问题并没有解决，重画事件还是没有被触发。难道是CMainDlg没有反射事件回来？看看用来反射事件的REFLECT_NOTIFICATIONS宏的代码： 参看ATL文件 REFLECT_NOTIFICATIONS宏调用的是函数CWindowImplRoot::ReflectNotifications。这个函数通过参数取得发送事件控件的窗体句柄，并通过该句柄将事件发还给控件，代码如下： 参看ATL文件 我们感兴趣的是最后一句，控件接收到的是ID = OCM__BASE + WM_DRAWITEM的消息，那么我们可以让控件直接接收消息（OCM__BASE + WM_DRAWITEM），用于取代使用不起作用的MSG_OCM_DRAWITEM。于是有了下面的代码： 但是结果还是一样 &#8211; 重画事件没有被触发。 幸亏我们有了新的发现，否则有可能就没由信心解决这个问题了。我们在CMainDlg中添加了WM_DRAWITEM事件，结果捕抓到了CComboBoxEx的重画事件，这说明CComBoxEx的重画事件发出了，但不知什么原因没有反射回控件。于是我们在CMainDlg::OnDrawItem()中添加了 以取代REFLECT_NOTIFICATIONS宏所做的自动反射，结果发现，事件还是没有收到。难道WTL事件处理出了问题？我们又为CComboBoxEx添加了非反射的事件WM_PAINT，结果发现WM_PAINT事件也没有被触发！！！ CComboBoxEx根本无法收到任何事件！！！！！ 《程序员修炼之道》说当你想说这不可能的时候，往往是你在调用的方法上出现了错误。 我们重新回到起点，来看看那里出了错。仔细地研读代码以后发现，事件是怎么传递到MSG_MAP的呢？难道我们通过赋值将一个窗体句柄传进来，我们在这个类中定义的MSG_MAP就能自动的连接到这个句柄上吗？这显然是真的不可能。 那么没有将MSG_MAP连接到窗体句柄很可能是控件类无法收到任何事件的原因。那么如何将MSG_MAP连接到窗体句柄上呢？原书中提到一个重要的函数，CWindowImpl::SubclassWindow()。我们再次更改我们的控件类： 一测之下，大吃一惊。不仅重画事件被正确触发，连析构函数中的没有Attach的Detach这个怪用法也可以删除了。为什么会这样呢？探究这个问题之前，让我们先看看原书使用的DDX_CONTROL宏 &#8211; 它只针对CWindowImpl的派生类起作用 &#8211; 是怎么回事。原码如下： 从原码可以看到，DDX_CONTROL宏和DDX_CONTROL_HANDLER宏实现的区别只是，前者使用SubclassWindow，而后者使用操作符“=”。如果把我们上面的代码联系起来，在操作符“=”的处理函数中调用SubclassWindow，其实就等于是明着使用DDX_CONTROL_HANDLER宏，暗地里却把DDX_CONTROL宏实现了。原来想出门，结果先绕着后院跑了3圈，这真是一个大笑话。 [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/403/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ComboBox 的一个 BUG?</title>
		<link>http://blog.tinybrowser.net/archives/390</link>
		<comments>http://blog.tinybrowser.net/archives/390#comments</comments>
		<pubDate>Tue, 19 Jan 2010 04:49:19 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[ComboBox]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=390</guid>
		<description><![CDATA[使用 windows 的标准控件 combobox 的时候, 遭遇到可能是这个控件的 bug 的一个问题. 就是当我们往标准 ComboBox 控件里面添加完几行字符串后, 我们点下拉列表时, 出来的 listbox 的背景没有被正确绘制, 是黑的. 如下图: 经过 Google 没找到答案, 后来试着添加了 WM_CTLCOLORLISTBOX 消息处理例程, 问题解决了. 奇怪. &#19979;&#36733;: atlcombofix.h#define COMBOBOX_STYLE (WS_VISIBLE &#124; WS_CHILD &#124; WS_TABSTOP &#124; CBS_DROPDOWN &#124; CBS_AUTOHSCROLL &#124; CBS_SORT) &#160; typedef&#160;CWinTraits&#60;COMBOBOX_STYLE, 0&#62; CComboBoxWinTraits; &#160; class&#160;CWndComboBox &#160; &#160; : public&#160;CWindowImpl&#60;CWndComboBox, CComboBox, CComboBoxWinTraits&#62; { public: &#160; &#160; [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/390/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WTL 一个绘制 MDI 客户区的类</title>
		<link>http://blog.tinybrowser.net/archives/322</link>
		<comments>http://blog.tinybrowser.net/archives/322#comments</comments>
		<pubDate>Tue, 12 Jan 2010 16:18:48 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Client]]></category>
		<category><![CDATA[drawing]]></category>
		<category><![CDATA[MDI]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=322</guid>
		<description><![CDATA[使用相当简单: 在工程内创建一个资源 ID 为 IDB_BK_LOG 的位图 在 mdi 的主框架窗口类内部创建变量. CMdiClientDraw m_wndMdiClinetX; 然后在 OnCreate 函数内子类化 MDI Client. m_wndMdiClinetX.SubclassWindow(m_hWndMDIClient); 完成. 以下是类的源码 &#19979;&#36733;: atlmdiclient.h#ifndef __TB_MDI_CLIENT_H__ #define __TB_MDI_CLIENT_H__ 1 &#160; // // based on &#34;Automatic Tab Bar for MDI Frameworks&#34; // http://www.codeproject.com/KB/docview/mditab.aspx // &#160; #pragma&#160;once &#160; #ifndef&#160;__ATLMISC_H__ #error tbmdiclient.h requires atlmisc.h to be included first #endif &#160; #ifndef&#160;IDB_BK_LOG #define [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/322/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WTL 创建 MDI 子窗口, 但不激活它</title>
		<link>http://blog.tinybrowser.net/archives/288</link>
		<comments>http://blog.tinybrowser.net/archives/288#comments</comments>
		<pubDate>Sun, 10 Jan 2010 16:23:30 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[日常琐碎]]></category>
		<category><![CDATA[CMDIChildWindowImpl]]></category>
		<category><![CDATA[MDI]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=288</guid>
		<description><![CDATA[终于解决 MDI 程序的子窗口, 在新创建时窗口时, 不激活这个新的子窗口. 技术细节是, 在 WTL 的 “atlframe.h” 文件的 CMDIChildWindowImpl 类的成员函数 Create 内: 上列代码片段的 24 行 MDIMaximize(hWnd); 以及 31 行 ::SetFocus(hWnd); 将激活当前创建的窗口. 为了与当前的 CMDIChildWindowImpl 类和平相处, 又能达到我自己的目的, 我在创建我自己的窗口时, 将我自己的窗口创建成不可见风格, 同时将我的最大化的子窗口恢复成 restore 状态, 当调用完 create 函数完成创建后, 又恢复成原样, 并将新创建的窗口设置成可见的, 像以下代码片段:]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/288/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>实现一个 WTL 带菜单的按钮 CMenuButton</title>
		<link>http://blog.tinybrowser.net/archives/213</link>
		<comments>http://blog.tinybrowser.net/archives/213#comments</comments>
		<pubDate>Fri, 08 Jan 2010 09:59:21 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[WTL]]></category>
		<category><![CDATA[CMenuButton]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=213</guid>
		<description><![CDATA[今天将 codeproject 上的一个 MFC 实现的菜单按钮移植到 WTL 下. 测试后发现工作很好. 现在将其用法简述如下. 用 VC 的 WTL wizard 创建一个对话框程序, 然后将头文件 atlmenubtn.h 包含到 stdafx.h 文件内. 在主界面的对话框资源内添加一个按钮, 在 CMainDlg 类是消息循环添加 REFLECT_NOTIFICATIONS() 宏, 这个相当重要, 不然按钮将不会被显示出来. 在 CMainDlg 类添加 CMenuButton m_btn; 成员变量, 然后就可以用 m_btn 变量子类化刚才添加的按钮, 使用 SubclassWindow 函数; 或者创建一个, 使用 Create 函数. 然后就可以添加菜单项了, 响应菜单命令的消息. 等等等等. 具体细节请看代码. 源代码下载链接 最后的运行效果如下: 头文件 “atlmenubtn.h” 的源码如下, 全文张贴: &#19979;&#36733;: [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/213/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MFC 程序员的 WTL 教程 ( 10 ) — 实现一个拖放源</title>
		<link>http://blog.tinybrowser.net/archives/98</link>
		<comments>http://blog.tinybrowser.net/archives/98#comments</comments>
		<pubDate>Mon, 04 Jan 2010 10:16:42 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[MFC 程序员的 WTL 教程]]></category>
		<category><![CDATA[WTL]]></category>
		<category><![CDATA[IDataObject]]></category>
		<category><![CDATA[IDropSource]]></category>
		<category><![CDATA[MRU]]></category>
		<category><![CDATA[拖放源]]></category>

		<guid isPermaLink="false">http://tinybrowser.net/blog/?p=98</guid>
		<description><![CDATA[链接：上一部分 第十部分 &#8211; 实现一个拖放源 下载示例工程 &#8211; 97KB 内容 简介 开始工程 文件打开处理 拖动源 拖动源的接口 用于调用者的辅助方法 IDropSource 的方法 从查看器中拖放 加入 MRU 列表 设置 MRU 对象 处理 MRU 命令并更新列表 保存 MRU 列表 其他 UI Goodies 透明的拖动图像 透明的选择矩形 标示排序的列 使用平铺视图模式 设置平铺视图的图像列表 使用平铺视图的图像列表 设置附加的文本行 版权和许可 修订历史 简介 拖放是许多流行应用的特性之一。尽管实现一个放下目标相当简单，但拖动源却要复杂的多。MFC 中有两个类 COleDataObject 和 COleDropSource 可以帮助管理拖动源所必须提供的数据，但 WTL 中没有这种辅助类。对于我们这些 WTL 用户来说，幸运的是，Raymond Chen 在 2000 [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MFC 程序员的 WTL 教程 ( 9 ) — GDI 类, 公用对话框以及工具类</title>
		<link>http://blog.tinybrowser.net/archives/97</link>
		<comments>http://blog.tinybrowser.net/archives/97#comments</comments>
		<pubDate>Mon, 04 Jan 2010 10:13:25 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[MFC 程序员的 WTL 教程]]></category>
		<category><![CDATA[WTL]]></category>
		<category><![CDATA[CFileDialog]]></category>
		<category><![CDATA[CFolderDialog]]></category>
		<category><![CDATA[GDI 类]]></category>
		<category><![CDATA[公用对话框]]></category>
		<category><![CDATA[工具类]]></category>

		<guid isPermaLink="false">http://tinybrowser.net/blog/?p=97</guid>
		<description><![CDATA[链接：上一部分；下一部分 第九部分 &#8211; GDI 类，公用对话框以及工具类 下载示例工程 &#8211; 157KB 内容 简介 GDI 封装类 封装类里的公用函数 使用 CDCT 与 MFC 封装类的差异 资源加载函数 使用公用对话框 CFileDialog CFolderDialog 其他有用的类和全局函数 Struct 的封装 处理双类型参数的类 其他工具类 全局函数 宏 示例工程 版权和许可 修订历史 简介 WTL 里包含了好多封装类和工具类，而直到现在也还没有在本系列里进行过全面的介绍，比如说 CString 和 CDC。WTL 具有一个封装 GDI 对象的良好体系，一些用以加载资源的便利函数，以及更便于使用某些 Win32 公用对话框的类。在此第九部分里，我将介绍一些使用最广泛的类。 本文讨论了四类特性： GDI 封装类 资源加载函数 使用打开文件公用对话框以及文件夹选择公用对话框 其他有用的类以及全局函数 GDI 封装类 相较于 MFC，WTL 为其 GDI [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/97/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MFC 程序员的 WTL 教程 ( 8 ) — 属性表和向导</title>
		<link>http://blog.tinybrowser.net/archives/96</link>
		<comments>http://blog.tinybrowser.net/archives/96#comments</comments>
		<pubDate>Mon, 04 Jan 2010 10:10:26 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[MFC 程序员的 WTL 教程]]></category>
		<category><![CDATA[WTL]]></category>
		<category><![CDATA[向导]]></category>
		<category><![CDATA[属性表]]></category>

		<guid isPermaLink="false">http://tinybrowser.net/blog/?p=96</guid>
		<description><![CDATA[链接：上一部分；下一部分 第八部分 &#8211; 属性表和向导 下载示例工程 &#8211; 272 KB 原文地址链接 WTL for MFC Programmers, Part VIII &#8211; Property Sheets and Wizards 内容 简介 WTL 属性表类 CPropertySheetImpl 的方法 WTL 属性页类 CPropertyPageWindow 的方法 CPropertyPageImpl 的方法 处理通知消息 创建一个属性表 永远最简单的属性表 创建一个有用的属性页 创建一个更好的属性表类 创建一个向导 添加更多的页，处理 DDV 其他的 UI 考虑 居中属性表 为属性页添加图标 下一步 修订历史 简介 甚至于在 Windows 95 把属性表引入为公用控件之前，它就已经成为了呈现选项的一种颇为流行的方法了。向导通常用于指导用户通历软件的安装过程或者其他的复杂工作。WTL 对创建这两种类型的属性表都提供了良好的支持，并允许你使用前 面介绍过的所有的那些对话框相关的特性，比如说 DDX [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/96/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

