快速业务通道

如何删除托管对象及包装一个库

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
的其他程序员记得调用它。

一般来说,如果你要导出到托管世界,最好将数据尽可能多地转换成托管对象。否则你的客户端也必须用 C++ 编写代码。当然,这个规则并不总是适用。有时直接导出结构并让客户端释放它们更好——例如,如果拷贝动作会引发核心不可接受的性能问题或内存冲突。那么你必须做出判断以决定是走托管之路还是使用本地机制。

我正在使用 C++ 托管扩展(Managed Extension for C++)包装现存的 C++ 库,以便基于 .NET 的语言能访问它。在 托管 C++ 中,我可以写如下代码:

String* s = new String();
s = _T("Hello, world");

但我如何才能将一个托管 String 转换回本地的 TCHAR*?

一旦你知道了这个神奇的方法,它便很简单。你必须调用 PtrToStringChars 并对结果进行 pin (销连接)操作。代码可以这样你写:

String __gc* s = S"Hello";
const wchar_t __pin* p = PtrToStringChars(s);

不要忘了对 PtrToStringChars 返回的指针进行 __pin 操作。销连接是必不可少的,因为 PtrToStringChars 返回指向托管内存中 String 对象第一个字符的托管(__gc)指针,垃圾收集器可能在任何高兴的时候移走托管内存,除非你显示地对之进行 __pin 操作。一般来讲,你必须在将 __gc 指针传递给某个本地(非托管)函数的任何时候使用用 __pin。

Figure 4 展示了一个简短的程序,它将托管 String 转换为宽字符和 ANSI 字符串两者。为了转换到 ANSI,要用到你宠爱的转换函数,象 wcstombs 或 ATL W2A 宏。如果你使用 MFC CString,你不必任何事情,因为 CString 具备针对 char* 和 wchar_t 的赋值操作:

// both will work
CString s1 = "hello, world";
CString s2 = L"Hello, world";

我想在自己的应用程序中改变标签控件的背景颜色,将它从灰色改成白色。我尝试建立一个 CTabCtrl 的派生类并使用其全部功能,但没有成功,你能帮我一把吗?

改变标签控件中标签的颜色十分简单,但要想让属性页充满某种颜色,这个改造涉及相当大的工作量,对于一个胆小的人来说,是不敢轻举妄动的。对于标签来说,基本思路让该控件是自绘控件,然后处理 WM_DRAWITEM 消息。如果使用 MFC,你可以改写虚拟函数 DrawItem。

在 1998 年三月坎的 Microsoft Systems Journal 中,我示范了如何实现一个标签控件类 CTabCtrlWithDisable,这个类支持标签禁用。作为禁用标签的一部份,当标签被禁用时, CTabCtrlWithDisable 将标签文本颜色改成了浅灰色,本文我借用了 CTabCtrlWithDisable 中的一些代码实现了一个新类 CColorTablCtrl,使你能改变标签的颜色。(参见 Figure 5)

为了使用 CColorTablCtrl, 在你的属性页中创建一个实例:

class CMyPropSheet : public CPropertySheet {
protected:
CColorTabCtrl m_tabCtrl;
};

你必须在属性页的 OnInitDialog 处理例程(这样 MFC 将使用它)中子类化标签控件,然后按照自己的意愿设置前景色和背景色:

// in CMyPropSheet::OnInitDialog()
HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);
m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this);
m_tabCtrl.SetColor(WHITE, RED);

这里 WHITE 和 RED 是标准的 COLORREF 值,也就是 RGB(255, 255, 255) 和 RGB(255,0,0)。一旦你实例化并初始化 CColorTabCtrl,颜色标签控件便负责其余的事情。(参见 Figure 6)

Figure 6 带颜色的标签控件

CColorTabCtrl 有一个改写的 SubclassDlgItem,它调用 ModifyStyle 将式样改变为 TCS_OWNERDRAWFIXED。比较适合这项工作的地方是 PreSubclassWindow 函数中,因为不论控件被子类化,还是用 CreateWindow 创建(但在此杂志中,我得收缩代码,所以我采用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号