{A}
{S0}简介
一个困难时期,把皮肤上的WTL对话框,要建立透明的对话框?从这里开始,你必须写三个奇数行的代码!您可以创建对话框与形状相同的位图提供一个透明功能。背景
所说,如果你想皮肤一个对话框,你不得不处理WM_ERASEBKGND消息,然后通过自己编写的油漆例行。BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkGnd)
CDialogRegionT模板负担程序员和自己的一切。这里有更多的夫妇采取照顾这个模板类的消息。这些都是WM_CTLCOLORSTATIC和WM_NCHITTEST。处理在我们的例子中的WM_NCHITTEST消息,使我们能够拖动对话框点击对话框上的任何地方,这是通过返回HTCAPTION在这个例程。{C}使用代码
我试图尽可能简单的代码使用。后包括在您的WTL的对话框类DialogRegion.h,你只需要遵循这三个步骤:继承从CDialogRegionT模板类WTL的对话框。
在消息映射链的消息,这个类添加CHAIN_MSG_MAP进入class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
public CMessageFilter, public CIdleHandler, CDialogRegionT<CMainDlg>
{
在WM_INITDIALOG使用SetBkBitmap方法例行指定皮肤文件。 SetBkBitmap是一个重载函数,并采取这是要设置为透明(RGB(255,0,255)颜色默认透明色) BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
CHAIN_MSG_MAP(CDialogRegionT<CMainDlg>)
END_MSG_MAP()
如果您提供了一个资源位图:
这里IDB_BITMAP1位图资源标识符。SetBKBitmap(IDB_BITMAP1);
如果您提供了一个位图文件:
这里MyBitmap.bmp是位图文件中的名称目标可执行文件的目录中生成。注意事项SetBKBitmap("MyBitmap.bmp");
,在背景部分我没有讨论WM_CTLCOLORSTATIC消息。该CDialogRegionT模板类使用此消息返回静态控件的颜色。在我们的情况下,我们将使用任何颜色位图,所以静态控制需要绘制成透明。因此,当静态控制是彩色的,我们设置背景颜色为透明和返回的空心刷。LRESULT OnCtlColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
{
// We handle this message only if we have set the region
bHandled = m_bIsRgnSet;
if(m_bIsRgnSet)
{
::SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT) GetStockObject (HOLLOW_BRUSH);
}
return 0;
}
我碰到一个问题:如果我添加为共同控制清单6,静态控件绘制黑色。所以,你必须确保你不使用共同控制在您的项目6。你可以选择不添加通用控制清单,当你使用WTL的项目创建项目向导。如果你已经有了一个WTL项目,后加入CDialogRegionT类要绘制黑色静态控制,您可以从共同控制清单。rc文件。