返回首页

{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的对话框。
class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,

    public CMessageFilter, public CIdleHandler, CDialogRegionT<CMainDlg>

{
在消息映射链的消息,这个类添加CHAIN​​_MSG_MAP进入
    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()
在WM_INITDIALOG使用SetBkBitmap方法例行指定皮肤文件。 SetBkBitmap是一个重载函数,并采取这是要设置为透明(RGB(255,0,255)颜色默认透明色)

如果您提供了一个资源位图:
SetBKBitmap(IDB_BITMAP1);
这里IDB_BITMAP1位图资源标识符。

如果您提供了一个位图文件:
SetBKBitmap("MyBitmap.bmp");
这里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文件。

回答

评论会员:游客 时间:2011/12/07
在Ln.83在dialogregion.h,应该BEGIN_MSG_MAP(T)的BEGIN_MSG_MAP(CMainDlg)
Sachin_Developer
评论会员:游客 时间:2011/12/07
好文章。天空是有限的......
joyjjjz
评论会员:大 时间:2011/12/07
吉姆巴里
评论会员:游客 时间:2011/12/07
嗯,我添加了一个静态文本控件并没有看到正在绘制的黑色。无论如何,使用视觉样式时,您可避免周围的按钮处理WM_PRINTCLIENT差距。按钮仍然不会显得太大深色背景上,不幸的是 吉姆巴里(最有价值球员,WindowsSDK中)