对MFC指手划脚(2)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

class CDialog : public CWnd

{

DECLARE_DYNAMIC(CDialog)

// Modeless construct

public:

CDialog();

BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);

BOOL CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL,

void* lpDialogInit = NULL);

BOOL CreateIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL);

// Modal construct

public:

CDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);

BOOL InitModalIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL,

void* lpDialogInit = NULL);

BOOL InitModalIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL);

// Attributes

public:

void MapDialogRect(LPRECT lpRect) const;

void SetHelpID(UINT nIDR);

// Operations

public:

// modal processing

virtual int DoModal();

// support for passing on tab control - use 'PostMessage' if needed

void NextDlgCtrl() const;

void PrevDlgCtrl() const;

void GotoDlgCtrl(CWnd* pWndCtrl);

// default button access

void SetDefID(UINT nID);

DWORD GetDefID() const;

// termination

void EndDialog(int nResult);

// Overridables (special message map entries)

virtual BOOL OnInitDialog();

virtual void OnSetFont(CFont* pFont);

protected:

virtual void OnOK();

virtual void OnCancel();

// Implementation

public:

virtual ~CDialog();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

virtual BOOL PreTranslateMessage(MSG* pMsg);

virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,

AFX_CMDHANDLERINFO* pHandlerInfo);

virtual BOOL CheckAutoCenter();

protected:

UINT m_nIDHelp; // Help ID (0 for none, see HID_BASE_RESOURCE)

// parameters for 'DoModal'

LPCTSTR m_lpszTemplateName; // name or MAKEINTRESOURCE

HGLOBAL m_hDialogTemplate; // indirect (m_lpDialogTemplate == NULL)

LPCDLGTEMPLATE m_lpDialogTemplate; // indirect if (m_lpszTemplateName == NULL)

void* m_lpDialogInit; // DLGINIT resource data

CWnd* m_pParentWnd; // parent/owner window

HWND m_hWndTop; // top level parent window (may be disabled)

#ifndef _AFX_NO_OCC_SUPPORT

_AFX_OCC_DIALOG_INFO* m_pOccDialogInfo;

virtual BOOL SetOccDialogInfo(_AFX_OCC_DIALOG_INFO* pOccDialogInfo);

#endif

virtual void PreInitDialog();

// implementation helpers

HWND PreModal();

void PostModal();

BOOL CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd,

void* lpDialogInit, HINSTANCE hInst);

BOOL CreateIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd,

HINSTANCE hInst);

protected:

//{{AFX_MSG(CDialog)

afx_msg LRESULT OnCommandHelp(WPARAM wParam, LPARAM lParam);

afx_msg LRESULT OnHelpHitTest(WPARAM wParam, LPARAM lParam);

afx_msg LRESULT HandleInitDialog(WPARAM, LPARAM);

afx_msg LRESULT HandleSetFont(WPARAM, LPARAM);

//}}AFX_MSG

#ifndef _AFX_NO_GRAYDLG_SUPPORT

afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

#endif

DECLARE_MESSAGE_MAP()

};

1: // Modeless construct

public:

CDialog();

噢,呵呵,从这个看出CDialog是一个现成的可以用的类,很好,我喜欢,,

2:

BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);

2个构造函数,是一个使用资源标号,一个使用资源指针。属于overload函数,此外,还使用了默认参数。C++语言一览无遗。

BOOL CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL, void* lpDialogInit = NULL);

BOOL CreateIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL);

间接创建。使用了全局句柄等参数,难道该成员函数是一个“工厂方法”??

// Modal construct

public:

CDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);

BOOL InitModalIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL,

void* lpDialogInit = NULL);

BOOL InitModalIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL);

模态对话框与非模态对话框使用不同的构造函数创建,CDialog类是一个直接与用户打交道的类,再一次暴露了CDialog的实现细节。用户还得与这样的细节打交道。哎,MFC就是....,,如果是我自己编MFC程序的时候,一定要对CDialog类再次封装。

3:

void NextDlgCtrl() const;

void PrevDlgCtrl() const;

void GotoDlgCtrl(CWnd* pWndCtrl);

// default button access

void SetDefID(UINT nID);

DWORD GetDefID() const;

从这些函数看来,CDialog作为子控件的容器,势必与子控件形成紧耦合关系。如果我自己对MFC再度封装的话,如何解除他们的紧耦合呢?

4:这样的程序码我都不想看下去了,真是没有什么可以激起点脑力的,:(,,只是对WIN API简单包装而已,简单!,同时也让人去关注不必要的现实细节!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航