最終更新日 :
VB Tips

MFCの関数をVBに(その1-2)
今回は前回の続き、MFCのソースから取ってきたCDC::DrawDragRectという関数の移植です。

前回は変数の宣言のところで締めくくりました。(以下参照)
Dim rgnNew As Long, rgnOutside As Long, rgnInside As Long
Dim rgnOld As Long, rgnUpdate As Long
Dim brsOld As Long, brsNew As Long
Dim rc As RECT

rcは、変換前の変数rectの代わりです。同名で宣言するのはまずいですから。

次に、この関数の中で使用しているAPIを洗い出します。
CreateRectRgnIndirect, InflateRect, IntersectRect, CreateRectRgn, CombineRgn, SetRectRgn, SelectClipRgn, GetClipBox, PatBlt, SelectObject
これらの関数が使用されていることが分かります。ただし、ここで注意しておきたいことは、CDCクラスではクラス破棄時に自動的にDeleteObjectが実行され、GDIオブジェクトの処理が簡単になっていることです。 ですから、DeleteObjectもAPIとして宣言しなければなりません。これらのAPIの宣言は、この場では省略させて頂きますが、APIビュアー等から貼り付けたもので十分です。

CRectクラスの関数の移植
クラスは元々記述を簡略化させるために存在しているものですが、そのクラスがないVBに移植させる段階ではこれをほどかなくてはなりません。例えば、
rgnOutside.CreateRectRgnIndirect(lpRect); や
rect.InflateRect(-size.cx, -size.cy);

などはその代表例です。
このような関数は、APIの宣言と比べて引数が一つ(もしくはそれ以上)少なくなっています。大概、そのクラスが含んでいるハンドルがAPIの引数の第一番目になっているので、APIに渡す引数の一番目に先ほど宣言した変数を充てればいいのです。 さらに、CRgnやCRectのようなクラスは文字列を扱う関数とは違い、APIをそのままラップした形の関数がほとんどですのでクラスメンバの解体は楽です。

GetHalftoneBrush()関数
pBrush = CDC::GetHalftoneBrush();
という関数があります。この関数は、面倒なことにちゃんと解体しなければなりません。この関数は、黒と白のドットが交互にあるモノクロビットマップからブラシを作成します。 また、そのモノクロビットマップもこの関数の中で作成されています。

旧領域の消去
当然ながら、1つの関数の中で旧領域の消去と新領域への描画を行うわけですから、消去する操作が必要です。最初の描画時は、この操作は必要ありませんのでそれをチェックしなければなりません。VBに移植後ではRectの値よりも、SIZE構造体の中身で調べる方が効率的なので、そっちにしています。

// draw into the update/new region
SelectClipRgn(rgnUpdate.m_hObject != NULL ? &rgnUpdate : &rgnNew);
GetClipBox(&rect);
pBrushOld = SelectObject(pBrush);
PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);


PatBltの引数にある定数"PATINVERT"は"vbPatInvert"で代用できます。

クリップリージョンの解除
// cleanup DC
if (pBrushOld != NULL)
SelectObject(pBrushOld);
SelectClipRgn(NULL);
}


以上で関数は終わりです。クリップリージョンについては、VBTipsをご覧ください。


Copyright (C) 1999 Satoshi Tadaフィードバックはこちら
Home