WTL中怎么在Dialog里添加Tab Control

WTL中怎么在Dialog里添加Tab Control,第1张

property sheet生来就是为独立对话框而存在,不适合再作为子窗口,改造的代价过大,还不如写个新的。

自己添加TAB CTRL,每个项对应一个子对话框(无边框、WS_CHILD、初始隐藏),响应TAB事件,点哪个标签就在相同的位置显示对应的子对话框,其它隐藏。代码量应该不大的。

class CMyFileDialog : public CFileDialogImpl<CMyFileDialog>

{

public:

    // Construction

    CMyFileDialog ( BOOL bOpenFileDialog,

                    _U_STRINGorID szDefExt = 0U,

                    _U_STRINGorID szFileName = 0U, 

                    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

                    _U_STRINGorID szFilter = 0U,

                    HWND hwndParent = NULL )

    // Maps

    BEGIN_MSG_MAP(CMyFileDialog)

        CHAIN_MSG_MAP(CFileDialogImpl<CMyFileDialog>)

    END_MSG_MAP()

    // Overrides

    void OnInitDone ( LPOFNOTIFY lpon )

protected:

    CString m_sDefExt, m_sFileName, m_sFilter

    LPCTSTR PrepFilterString ( CString& sFilter )

} //////////////////////////////////////////////////////////////////////

// CMyFileDialog

CMyFileDialog::CMyFileDialog (

    BOOL bOpenFileDialog, _U_STRINGorID szDefExt, _U_STRINGorID szFileName, 

    DWORD dwFlags, _U_STRINGorID szFilter, HWND hwndParent ) :

        CFileDialogImpl<CMyFileDialog>(bOpenFileDialog, NULL, NULL, 0,

                                       NULL, hwndParent),

        m_sDefExt(szDefExt.m_lpstr), m_sFileName(szFileName.m_lpstr),

        m_sFilter(szFilter.m_lpstr)

{

    m_ofn.lpstrDefExt = m_sDefExt

    m_ofn.Flags |= dwFlags

    m_ofn.lpstrFilter = PrepFilterString ( m_sFilter )

    // setup initial file name

    if ( !m_sFileName.IsEmpty() )

        lstrcpyn ( m_szFileName, m_sFileName, _MAX_PATH )

}

 

void CMyFileDialog::OnInitDone ( LPOFNOTIFY lpon )

{

    GetFileDialogWindow().CenterWindow ( lpon->lpOFN->hwndOwner )

}

LPCTSTR CMyFileDialog::PrepFilterString ( CString& sFilter )

{

LPTSTR psz = sFilter.GetBuffer(0)

LPCTSTR pszRet = psz

    

    while ( '\0' != *psz )

        {

        if ( '|' == *psz )

            *psz++ = '\0'

        else

            psz = CharNext ( psz )

        }

    

    return pszRet

}

使用方法:

CMyFileDialog fd (true, _T("*.*"))

if ( IDOK == fd.DoModal(*this) )

{

USES_CONVERSION

char* pFilePath = T2A(fd.m_szFileName)

}

WTL 在开发者之间的悄悄传播已经超过一年了, 传闻它是基于ATL的,并在微软内部使用.这理所当然的引起了ATL开发者社区的主意.这些人从ATL1.1开始,就一直为ATL控件书写UI代码,但是他们发现,他们的所写的代码常常就是纯的Win32 GDI代码.我告诉您, WTL并没有多大不同.

是不是让人失望? 不,因为ATL只是对COM进行了简单的封装,这也是ATL的强大之处. 是的,写ATL您必须通晓COM. 您在ATL上额外花费的功夫跟您学习COM所作的努力比起来,简直微不足道.这跟那些需要把主要精力花费在学习类库本身,忽略COM的库是完全不同的.

WTL与此类似.您需要懂得Win32窗口技术和GDI.只要您懂得,学习WTL就似清风抚面,再简单不过了.如果您不懂 这些,那么您最好使用VB来写UI代码.

WTL有什么?

它给各种类型的应用程序提供了一个基本的框架.注意,虽然您没有MFC那样的文档/视结构,但是您有视(views). 在WTL有大量的代码让您来管理视,而且加入您自己的代码也很容易. WTL有AppWizard,可以让您生成SDI, MDI 和多线程SDI程序多线程SDI跟IE或Windows Explorer很像.它看起来是打开了多个程序实例,实际上这些窗口都是属于一个进程的).

另外,您的程序可以是基于对话框的,也可以是基于视的.视可以是基于CWindowImpl的,也可以是基于控件,甚至是IE里的一个HTML页.您可以选择您的程序是否需要一个rebar, command bar (CE-like), toolbar 和/或status bar.另外,您的程序可以主持ActiveX控件,以及成为一个COM服务器.

这里有几个关于视的选项. WTL提供splitter窗口类(这样在一个视里您可以有两个窗口)和scroll窗口类(这样您的窗口可以比它显示的"视"小). WTL也有个类似MFC的UpDateUI的东西,但是它们不是很一样 - 主要的区别是您需要把需要更新的项用宏映射标注出来,然后您在您的类里加入执行UpdateUI的代码. DDX/DDV在WTL也支持,同样类似MFC,但有不同. 您必须加一个宏映射来实现DoDataExchange,然后加入调用它的代码.

现在WTL也有GDI类了.然而,HDC的封装类就像CWindow一样,只进行了很简单的封装 - 它几乎没有加入任何新的功能.不过,在WTL,你可以得到播放meta文件和OpenGL支持. 最有价值的我猜应该是打印机DC的那些继承类 - WTL有打印机支持,甚至打印预览. 当然也有GDI对象的封装. 诸如画笔,画刷,区域等.

WTL对所有的Win32 (和W2K) 通用对话框进行了封装.同样尽管简单,但是它的确使请求字体或者文件变的非常的简单.

合成了旧的AtlControls.h,新加了一些封装类. 这些封装类封装了W2K控件,以及一些不属于Win32的"控件",像Command Bar, bitmap button, hyperlink 和 wait cursor.

WTL 最终把消息分离带入了ATL! 一些新的MSG映射宏将消息分离,调用您类里的消息处理函数.消息处理函数的参数的值是从消息分离得到的.唯一令人头痛的是,您需要查看头文件以确定函数参数的意义


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11646019.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存