« オーディオプレイヤ開発記 その5 | メイン | オーディオプレイヤ開発記 その7 »

2006/02/06(月)

●オーディオプレイヤ開発記 その6


 では、CMainWnd クラスを作ってみます。

//----------------------------------------------------------------------------
// MainWnd.h : メインウィンドウの作成・管理を行う
//----------------------------------------------------------------------------
#ifndef MainWndH
#define MainWndH

class CApp;
#include "../Common/FrameWnd.h"
//----------------------------------------------------------------------------
// メインウィンドウの作成・管理を行うクラス
//----------------------------------------------------------------------------
class CMainWnd : public CFrameWnd
{
public: // 関数

    CMainWnd(CApp & app): m_rApp(app) { }
    virtual ~CMainWnd() { }
    virtual BOOL Create() {
        return CFrameWnd::Create(TEXT("MainWndClass"));
    }

    // メッセージ
    virtual LRESULT OnCreate(LPCREATESTRUCT lpCreateStruct);

protected: // メンバ変数

    CApp & m_rApp;
};
//----------------------------------------------------------------------------

#endif
//----------------------------------------------------------------------------
// MainWnd.cpp : メインウィンドウの作成・管理を行う
//----------------------------------------------------------------------------
#include
#include "../App.h"
#include "MainWnd.h"
//----------------------------------------------------------------------------
// 作成された
//----------------------------------------------------------------------------
LRESULT CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    SetMainWnd(true); // メインウィンドウに設定
    SetStyle(WS_OVERLAPPEDWINDOW);
    SetCaption(TEXT("サウンドプレイヤー"));
    SetSize(320, 240);
    Show(m_rApp.GetNCmdShow());
    Update();
    return CFrameWnd::OnCreate(lpCreateStruct);
}
//----------------------------------------------------------------------------

 アプリケーションクラスのオブジェクトへの参照を内部で持つようにし、今まで CApp::Run 関数内でやっていたウィンドウの初期化処理を CMainWindow::OnCreate 内でやるようにしました。ここまでのソースコードはこちら ( Hayaemon20060206_src.lzh ) 。


 さて、それでは CWnd クラスを継承してラベル用のクラスを作成します。ラベルというのはスタティックコントロールに含まれるので、MFC に習って CStatic という名前にしておきます。

 そういえば、ラベルと言えば普通は WS_CHILD をつけて、子ウィンドウとして作りますよね。ただ、「スプラッシュ」と言って、起動時にソフトのロゴなどを表示させるような画面がありますが、あれはスタティックコントロールをトップレベルウィンドウとして表示させているんでしょうか。まあそういう用途もありそうなので、最初の段階では、ウィンドウスタイルは WS_POPUP にしておくことにしましょう。

 そうなると、そこから子ウィンドウに変えるための関数を作る必要がありますね。CWnd::SetParent として、先に作っておきましょうか。ちなみに SetParent 関数については、MSDN に、

For compatibility reasons, SetParent does not modify the WS_CHILD or WS_POPUP window styles of the window whose parent is being changed. Therefore, if hWndNewParent is NULL, you should also clear the WS_CHILD bit and set the WS_POPUP style after calling SetParent. Conversely, if hWndNewParent is not NULL and the window was previously a child of the desktop, you should clear the WS_POPUP style and set the WS_CHILD style before calling SetParent.

とある通り、ウィンドウを子ウィンドウにする場合には、ウィンドウスタイルから WS_POPUP を引き、WS_CHILD をつけてから SetParent を呼び、トップレベルウィンドウにする場合には、SetParent を呼んだ後、WS_CHILD を引き、WS_POPUP を足してやる必要があります。このときに必要となる、GetStyle 関数も、簡単なのでついでに作りましょう。

virtual LONG_PTR GetStyle() const {
    return GetWindowLongPtr(m_hWnd, GWL_STYLE);
}
virtual void SetParent(HWND hParentWnd) {
    // 子ウィンドウにする場合のスタイルの設定
    LONG_PTR lStyle = GetStyle();
    if(hParentWnd) {
        lStyle &= ~WS_POPUP;
        lStyle |= WS_CHILD;
        SetStyle(lStyle);
    }

    ::SetParent(m_hWnd, hParentWnd);

    // トップレベルウィンドウにする場合のスタイルの設定
    if(!hParentWnd) {
        lStyle &= ~WS_CHILD;
        lStyle |= WS_POPUP;
        SetStyle(lStyle);
    }
}

 こんな感じでしょうか。実際にはヘッダとソースに分けて書いてますけどね。さてそれでは、CStatic クラスを作ります。

 ところで、普通のウィンドウで、タイトルバーに表示される文字の変更を SetText という名前の関数でやるというのが分かりにくいので、CWnd では SetCaption という名前にしてあります。Caption というのは、「見出し」とかいう意味です。ただこれ逆に、スタティックコントロールの場合はアイコンなども表示できるので、SetCaption という名前の関数で、表示されるテキストを変更するってのは、ちょっと分かりにくいですね。SetText という名前の関数からも呼べるようにしておきますか。

//----------------------------------------------------------------------------
// Static.h : スタティックコントロールの作成・管理を行う
//----------------------------------------------------------------------------
#ifndef StaticH
#define StaticH

#include "Wnd.h"
//----------------------------------------------------------------------------
// スタティックコントロールの作成・管理を行うクラス
//----------------------------------------------------------------------------
class CStatic : public CWnd
{
public: // 関数

    CStatic() { }
    virtual ~CStatic() { }
    virtual BOOL Create() {
        BOOL ret = CWnd::Create(TEXT("static"));
        if(!ret) return ret;
        SetStyle(WS_CHILD);
        SetProc();
        return TRUE;
    }
    virtual void SetText(LPCTSTR lpText) { SetCaption(lpText); }
};
//----------------------------------------------------------------------------

#endif

 さて、これで一応、CMainWnd などから使えるようにはなりました。ただ、もうちょっとラベルに必要な機能があると思うので、それを追加していきたいです。真っ先に欲しいのは、ラベルの文字ぴったりにウィンドウのサイズを合わせてくれるような機能かな。ここまでのソースコードはこちら ( Hayaemon20060206_2_src.lzh ) 。

トラックバックURL

このエントリーのトラックバックURL:
http://www.edolfzoku.com/diary/mt-tb.cgi/123

コメントする