ハローワールド

前回ウィザードにより作成した「Hello01」を改造して、画像ファイルを画面に表示するプログラムを作成します。

プログラムを作成するとき、「WindowsMobile 5.0 Pocket PC SDK」のサンプルも参考になるので、必要なときに眺めてはいかがでしょうか?
標準格納フォルダは「C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP」です

1.stdafx.hの修正

最初のビルドでは、警告エラーが表示していたと思います。

1>コンパイルしています...
1>stdafx.cpp
1>_CE_ACTIVEX was not defined because this Windows CE SDK does not have DCOM.
1> _CE_ACTIVEX could be caused to be defined by defining _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA, but it is recommended that this be done only for single-threaded apps.
1>_ATL_NO_HOSTING was defined because _CE_ACTIVEX was not defined.

このエラーを消すためには、stdafx.hに次のような定義を追加します

#define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA

ついでに、WINVER 変数も設定しましょう

#define WINVER _WIN32_WCE

stdafx.hはこんな感じになりました

// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//
#pragma once
// Change this value to use different versions
#define WINVER _WIN32_WCE                                               //変更
#define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA                        //追加
#define _WIN32_WCE_AYGSHELL 1
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>
#include <aygshell.h>
#pragma comment(lib, "aygshell.lib")
  

この変更を行うと、警告は消えるはずです

ただし、リンク時にエラーが表示されます

1>リンクしています...
1>libcmtd.lib(gshandlereh.obj) : warning LNK4099: PDB 'libbmtd.pdb' が 'C:\Program Files\Microsoft Visual Studio 8\VC\ce\lib\ARMV4I\libcmtd.lib' で、または 'd:\DevWinCE\Hello01\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\libbmtd.pdb' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。
1>libcmtd.lib(gshandler.obj) : warning LNK4099: PDB 'libbmtd.pdb' が 'C:\Program Files\Microsoft Visual Studio 8\VC\ce\lib\ARMV4I\libcmtd.lib' で、または 'd:\DevWinCE\Hello01\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\libbmtd.pdb' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。
   

このメッセージはVS2005のSP1を当てたときから発生するようになりました。消す方法はわかりません。だれか教えてください。

2.画像の準備

表示する画像は、Hello01_02.jpgとして次の画像を準備しました。
Hello01_02.jpg
このファイルを Hello01プロジェクトに保存します

このファイルは、ビルド時にターゲットデバイスにうまく配置できるようにしなければなりません。
Hello01のプロパティを開いて、「構成プロパティ」「配置」を選択します。全般の追加ファイルを次のように設定します。

クリックすると拡大します

クリックすると拡大します

うまく配置できているか確認しましょう。[ビルド]-[配置]で配置が始まります。

完了したら、エミレータ上でエクスプローラを開き「マイデバイス\Program File\Hello01」を選択し、「Hello01_02.jpg」が存在するか確認します。

 

2.画像を表示するプログラムの実装

画像を表示するために一番簡単な方法は、jpgやpngなどの画像ファイルから直接デバイスコンテキストに書き込むAPIがあれば、
速攻でできあがりです。
WM5には「Imaging Interface」があり、それを利用して描画ができそうです

Hello01View.hを開いて、次のように編集します。(赤の網掛けを追加または変更)

#pragma once
#include <imaging.h>
class CHello01View : public CWindowImpl<CHello01View>
{
protected:
    CComPtr<IImage>					m_spImage;                                             //イメージ
public:
    DECLARE_WND_CLASS(NULL)
    BOOL PreTranslateMessage(MSG* pMsg)
    {
        pMsg;
        return FALSE;
    }
    BEGIN_MSG_MAP(CHello01View)
        MESSAGE_HANDLER(WM_CREATE,OnCreate)
        MESSAGE_HANDLER(WM_PAINT, OnPaint)
        MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
    END_MSG_MAP()
// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
    LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        CPaintDC dc(m_hWnd);
        CRect	_rectClient;
        GetClientRect ( &_rectClient );
        if ( NULL != m_spImage )                                                        //?イメージあり
        {
            m_spImage->Draw ( (HDC)dc , &_rectClient , NULL );
        }
        return 0;
    }
    LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        CComPtr<IImagingFactory>	_spImgFactory;										//IImageインタフェース作成
        HRESULT _hRC;
        _hRC = _spImgFactory.CoCreateInstance (CLSID_ImagingFactory);
        if ( S_OK != _hRC)
        {
            return 0;
        }
        m_spImage.Release();
        _hRC = _spImgFactory->CreateImageFromFile ( _T("\\Program Files\\Hello01\\Hello01_02.jpg") , &m_spImage );
        if ( S_OK != _hRC )
        {
            _spImgFactory.Release();
            return 0;
        }
        bHandled = FALSE;
        return 0;
    }
    LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        m_spImage.Release();
        bHandled = FALSE;
        return 0;
    } 
};
     

このままでは、ビルドエラーがとれないため、stdafx.h にインクルードを指定します。

#include <initguid.h>
#include <atlmisc.h>

上記2定義をstdafx.hの最終行に追加

ビルドを行うと正常終了し、F5で実行すると次のような画面になります。

 

3.Hello01View.hの説明

各メッセージの処理する簡単な説明です

OnCreate ウィンドウ作成時にメッセージが飛んできます。
IImageingFactoryを利用して「Hello01_02.jpg」からIImageオブジェクトを作成します
OnDestroy IImageオブジェクトを破棄します
OnPaint IImageオブジェクトのDrawメソッドでデバイスコンテキストに描画します

OnPaint()のDrawメソッドの第3引数は0.01mm単位となっています。たぶん画像ファイルの一部分だけ表示するプログラムとなると
計算がめんどくさくなると思います。そのときに計算式は考えましょう

 

Topへ戻る

前へ

次へ