画像オブジェクトが持つ画像データを画面に表示します。 画面への描画はデバイスコンテキストを介して行われます。 設定された画像がパタン(FVCL::Data::CFvPattern)の場合は、 画像の前面にパタンマスクをオーバレイ処理して表示します。
このオブジェクトを生成後、 Create を1度実行して表示準備を行ってください。
描画の際は、下記の手順で実行してください。
- Create
最初に1度だけ実行し、表示準備を行います。
- SetDisplayRect
画像の表示範囲を指定します。 クライアント領域の任意の位置を指定できます。
- SetImage
描画対象画像を設定します。 オブジェクトへのポインタをメンバ変数に保管しているだけですので処理時間は殆ど掛かりません。
- Draw
引数に指定されたデバイスコンテキストへ画像データを書き出します。 この時、オーバレイ領域が有る場合は、ベクタデータやラスタデータを画像データに重畳して表示します。
描画対象画像が DIB 互換か非互換かによって処理時間が異なります。 描画対象画像が表示デバイスと互換がない場合は、DIB形式に変換して中間バッファに格納します。 描画対象画像が表示デバイスと互換がある場合は、変換は行わずアタッチするだけですので処理時間は殆ど掛かりません。
サンプルコード
下記は、ダイアログ上の任意の位置に画像を描画する例です。
ダイアログに配置したピクチャボックス(下図左の赤枠で示す部分)のデバイスコンテキストに画像を描画しています。
スクリーンショット:
ヘッダー:
#pragma once
#include "afxwin.h"
class CSampleCodeDlg : public CDialogEx
{
public:
CSampleCodeDlg(CWnd* pParent = NULL);
enum { IDD = IDD_SAMPLECODE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg
void OnSysCommand(
UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
protected:
FVCL::Data::CFvImage m_Image;
FVCL::GDI::CFvDisplay m_Display;
public:
CStatic m_View;
};
実装: (初期化処理)
BOOL CSampleCodeDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_Image.Load(_T("TestFiles/floppy_RGB.jpg"));
m_Display.Create();
return TRUE;
}
関連:
実装: (描画処理)
void CSampleCodeDlg::OnPaint()
{
if (IsIconic())
{
}
else
{
CPaintDC dcPaint(this);
{
CPaintDC dc(&m_View);
CRect client;
m_View.GetClientRect( &client );
m_Display.SetDisplayRect(
RECT(client) );
m_Display.SetImage(&m_Image);
m_Display.Draw(dc.GetSafeHdc());
}
CDialogEx::OnPaint();
}
}
関連:
実装: (その他、MFC ダイアログの初期化部分)
#include "SampleCode.h"
#include "SampleCodeDlg.h"
#include "CAboutDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CSampleCodeDlg::CSampleCodeDlg(CWnd* pParent)
: CDialogEx(CSampleCodeDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSampleCodeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_VIEW, m_View);
}
BEGIN_MESSAGE_MAP(CSampleCodeDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
void CSampleCodeDlg::OnSysCommand(
UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
HCURSOR CSampleCodeDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}