ホーム

OFF-SOFT.net

OFF-SOFT.net

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

MFCからWTLへ(1) ATLの基本

公開日| 2009年04月29日 | コメントはまだありません。
ATLのウィンドウを作ってみましょう
では、早速、簡単なダイアログ画面を表示するプログラムをMFCとATLで作成してみましょう。

実行すると左記のような画面表示されて、
"OK"、"キャンセル"をクリックすると終了し、
画面右上の"閉じる"をクリックしても終了するように
プログラミングしてみましょう。

1.MFCでダイアログを表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
 
#define _AFX_ALL_WARNINGS
 
#include <afxwin.h>
#include <afxext.h>
 
#include <afxdtctl.h>
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>
#endif
 
 
#include "resource.h"
 
/////////////////////////////////////////
// The About dialog
 
class CAboutDlg : public CDialog
{
public:
	CAboutDlg() : CDialog(CAboutDlg::IDD) {};
 
	enum { IDD = IDD_ABOUT };
 
	protected:
	virtual void DoDataExchange(CDataExchange* pDX)
	{
		CDialog::DoDataExchange(pDX);
	}
 
protected:
	DECLARE_MESSAGE_MAP()
};
 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
 
 
 
 
 
 
 
 
 
/////////////////////////////////////////
//	WinMain
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
                   LPSTR szCmdLine, int nCmdShow)
 
{
	if (AfxWinInit(hInst, hInstPrev, szCmdLine, nCmdShow)){
		CAboutDlg dlg;
		dlg.DoModal();
	}
 
	AfxWinTerm();
	return 0;
}
2.ATLでダイアログを表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <atlbase.h>
#if _ATL_VER < 0x7000
extern CComModule _Module;
#endif
#include <atlwin.h>
 
#if _ATL_VER < 0x7000
CComModule _Module;
#define _APP _Module
#else
#define _APP _AtlBaseModule
#endif
 
#include "resource.h"
 
/////////////////////////////////////////
// The About dialog
 
class CAboutDlg : public CDialogImpl<CAboutDlg>
{
public:
    enum { IDD = IDD_ABOUT };
 
    BEGIN_MSG_MAP(CAboutDlg)
        MESSAGE_HANDLER(WM_CLOSE, OnClose)
        COMMAND_ID_HANDLER(IDOK, OnOKCancel)
        COMMAND_ID_HANDLER(IDCANCEL, OnOKCancel)
    END_MSG_MAP()
 
 
    LRESULT OnClose
        (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        EndDialog(IDCANCEL);
        return 0;
    }
 
    LRESULT OnOKCancel
        (WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
    {
        EndDialog(wID);
        return 0;
    }
};
 
/////////////////////////////////////////
//	WinMain
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
                   LPSTR szCmdLine, int nCmdShow)
{
#if _ATL_VER < 0x7000
    _Module.Init(NULL, hInst);
#endif
 
	CAboutDlg dlg;
	dlg.DoModal();
 
    _APP.Term();
    return 0;
}

簡単に解説しておきます。
ATLのダイアログクラスには、2つあります。
CDialogImpl:単純なダイアログに使用されますが、 CAxDialogImpl:ActiveX コントロールを持っているようなダイアログに使用されます。
ここでは、単純なダイアログですので、CDialogImplを使います。

さて、見た感じ似ていますね。CAboutDlgでの処理に少し違いがあります。
MFCでは、Close,OnOK,OnCacelは、楽ができます。
ATLでは、そのあたりのデフォルト動作はありませんから、全て書く必要があります。
少し、SDKを彷彿させるコーディングです。
また、_ATL_VER がところどころありますが、これは、ATLの基本構造が7.0以降とそれ以前で 異なるために、記述をフラグを使って切り替えています。
全てフリー版で用意したATLであれば、おそらくは、ATLのバージョンは、3.0となります。
様々な面から、3.0では、MFCプログラマーにとって、いらいらする場面が多いと思います。 一番大きな点は、7.0以上でないとATL::CStringが使えないからです。 できれば、7.0以上のバージョンを用意された方が、後々、楽になるかとは思います。

似て非なるところを、次回以降で、もう少し掘り下げたいと思います。

最後に、サイズの比較をしておきましょう。
最適化 /O1 でのリリース版でのサイズ結果
  • ATL 56kb
  • MFC 29kb(DLL)
  • MFC 136kb(STATIC)
おおよそ、予想どおりの結果ではないでしょうか。

上記より、より深く比較しているサイトもあります。WTLへの考察の中で、参考にされると良いと思います。
http://www.endurasoft.com/vcd/mfcwtl.htm

結局のところ、WTLは、WindowsAPI+ATLとテンプレートの組み合わせです。
もっと、そのあたりについて詳しく知りたい方は、以下の本なども良いと思います。
はじめて間もない方は、2,3冊読まれると、ネットの記事を読んでも、おおよその理解ができるようになると思います。
本は、経験者でも、ネットだけでは判らない様々な事に気づかされることがあります。


プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)

プログラミングWindows第5版〈下〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)

C++テンプレートテクニック

プログラムを作ろう! Microsoft Visual C++ 2008 Express Edition 入門 (マイクロソフト公式解説書)

コメント

コメントをどうぞ







  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ