• 締切済み

地図の上に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字以外の部分は青色 以上、文字数制限の為、かなり省略していますが、大変困っています。 とにかく助言を頂きたく、よろしくお願いします。

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

>色々と試行錯誤した結果、この方法を取った 試行錯誤が足りなかったのかもね。 >調べていますが、原因が見付かりません そもそも手元で再現しなければ、修正後確認すら困難だけれども、 その辺りは大丈夫?客先と同程度の環境を揃えられないとデバッグは大変ですよ。 ・どのぐらいの頻度でスケール変更メッセージが飛んでくるのか。 ・L字の処理はどのぐらいの時間で完了するのか。 ・L字用のダイアログ位置を地図上に載せなければ症状は変化するか。 私なら、このあたりから、問題を探っていくけれども、素直に他部署の人間に頼りなさい。 外部サイトに顧客に納品するソースの質問をしていることがばれたら、 客先や社内の両方から信用無くすよ。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

「納品」「お客様」のキーワードから、 IT系企業における開発業務の話であると推測します。 この推測が当たっているとして、社内に話のわかる 技術者はいないのでしょうか? 外に質問するより先に、まず中で解決しようとする方が よいのではないかと思います。 最初の推測が外れていましたら、申し訳ありません。

taka077
質問者

お礼

回答、ありがとうございます。 おっしゃる通り、開発業務の話です。 が、本ソフトの開発当初に関係した人間は、他部署や外注さんなのです。他部署とは、上層部の折り合いが悪く、なかなか相談出来ない状況なのです。(1人、こっそり教えて貰っている後輩がいるのですが、出張中でして...) 早急な対応が必要なので、昨日からソースと睨めっこしてるのですが、まだVC++を始めて1年ちょっとの私では、まだ力不足なのか...。 ちなみに開発環境は、VC++6.0です。 どなたか助言をお願いします。

関連するQ&A