地図の上にL字スケールを描画
MDIフレーム上に、複数のチャイルドスタイルのダイアログが存在するプログラムを改造しました。(元は別の人間が作成)
その中にMapDKIVの地図を描画しているダイアログがあり、その地図上に別のダイアログをおき、そこに縮尺L字スケールのビットマップを描画しました。(MapDKIVには、その機能がまだ無い為)
色々と試行錯誤した結果、この方法を取ったのですが、納品した矢先、お客様から、地図をマウスでドラッグして動かそうとすると、スムーズに動いたり、カクカクとしか動かなかったり、時には全く動かない事があるとのクレームがありました。(その操作以外は正常に動作している模様)
以前はこの症状はなかったとの事から、今回のL字スケール描画に原因があるのではと調べていますが、原因が見付かりません。
以下に、ソースの一部分を記載しますので、どなたか助言をお願いします。
******** ビットマップデータ管理クラス ********
ビットマップは、スケール毎に準備
<BitmapData.h>
private:
CBitmap m_bmpLScale0;
CBitmap m_bmpLScale2;
<BitmapData.cpp>
//-------- 機能 ビットマップ情報の読込 --------
void CBitmapData::Load(void)
{
m_bmpLScale0.LoadBitmap(IDB_BITMAP_SCALE0); // 全国図
m_bmpLScale2.LoadBitmap(IDB_BITMAP_SCALE2); // 1/160万
//-------- 機能 ビットマップ情報の取得 --------
CBitmap& CBitmapData::GetScaleBitmap(void)
{
UINT unIndex = GetScaleNumber();// 現在選択されているスケールレベル
switch(unIndex)
{
case 0: return m_bmpLScale0; break; // 全国図
case 2: return m_bmpLScale2; break; // 1/160万
******** 地図描画ダイアログ ********
L字スケール描画用ダイアログの生成
<MainMap.cpp>
// 地図描画フレームサイズを取得
m_ctrlMapFrame.GetWindowRect(LPRECT(rect));
// スケールレベルをセット
g_BitmapData.SetScaleNumber(m_ctrlMapZoom.GetPos());
// スケール描画用ダイアログの生成(地図フレームの左下位置を渡す)
m_pMapScaleDlg = new CMapScaleDlg();
m_pMapScaleDlg->Create(m_hWnd, IDD_MAP_SCALE_DIALOG, ・・・
******** L字スケール描画ダイアログ ********
//-------- 機能 OnInitDialog() --------
// ウインドウ拡張スタイルをレイヤード設定
lStyle = GetWindowLong( this->m_hWnd, GWL_EXSTYLE );
lStyle |= 0x00080000;
SetWindowLong( this->m_hWnd, GWL_EXSTYLE, lStyle );
// レイヤードウィンドウの不透明度と透明のカラーキーを設定(青色部分を透明化する)
SetLayeredWindowAttributes( this->m_hWnd, RGB(0,0,255), 100, 0x00001/*LWA_COLORKEY*/ );
//-------- 機能 OnPaint() --------
BITMAP bitmap;
CBitmap& mBitmap = g_BitmapData.GetScaleBitmap();
mBitmap.GetBitmap(&bitmap);
CSize sz(bitmap.bmWidth, bitmap.bmHeight);
CDC dc;
dc.CreateCompatibleDC(&PaintDC);
CBitmap *pOld = dc.SelectObject(&mBitmap);
// もともとのディバイスコンテキストにビットマップを透過で転送(青色部分を透明化する)
if( ::TransparentBlt(PaintDC, 0, 0, sz.cx, sz.cy, dc, 0, 0, sz.cx, sz.cy, (UINT)RGB(0,0,255)) == FALSE ){
}
// ビットマップ選択解除
dc.SelectObject( pOld);
}
//-------- 機能 スケール(ビットマップ)変更メッセージを受信 --------
// 現在選択されているスケール用のビットマップを取得(ポインタ)
CBitmap& mBitmap = g_BitmapData.GetScaleBitmap();
mBitmap.GetBitmap(&bitmap);
CSize sz(bitmap.bmWidth, bitmap.bmHeight);
// メインマップダイアログの地図フレームの左下になるよう変更
this->MoveWindow(m_nMapFrameLeft, (m_nMapFrameBottom - sz.cy), sz.cx, sz.cy);
// ウインドウの再描画
this->Invalidate();
1.L字スケール描画用のダイアログを、背景青色で準備
2.L字スケール描画用のダイアログの青色部分を透明化に設定
3.L字スケール描画用のダイアログのウインドウサイズを、選択されているスケール用のビットマップと同じサイズに、且つ、地図フレームの左下に位置を設定
4.地図ダイアログからスケール変更メッセージを受信
(1) その時に選択されているスケール用のビットマップと同じサイズに、且つ、地図フレームの左下に位置を設定
(2) ウインドウの再描画 this->Invalidate()
5.OnPaint()
(1) 現在選択されているスケールのビットマップ情報を取得
(2) ビットマップを透過で転送(青色部分を透明化)
ビットマップのL字以外の部分は青色
以上、文字数制限の為、かなり省略していますが、大変困っています。
とにかく助言を頂きたく、よろしくお願いします。
補足
グーグルアースの使えないPC(スペック不足)でしたが、別のマシンを使ってアースの方をみてみました。 そちらのスケール感でだいたいの高度感を楽しみます。 ありがとうございました。