• 締切済み

地図の上に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% (2126/6288)
回答No.1

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

taka077
質問者

お礼

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

関連するQ&A

  • ビューにビットマップファイルを描画する方法

    MFCのプログラムで(マルチウィンドウ)ビュー上に指定したビットマップファイルをオープンして描画したいと思ってます。 Bitmapリソースを指定して描画する方法はわかりましたが、ビットマップファイル名を指定して、そのファイルをオープンしてビュー上に描画する方法はどのようすればよいのでしょうか? 今は以下のようにOnDraw()内で以下のように実装しています。 -------------------------------------------------------- CBitmap kaitaGazou; kaitaGazou.LoadBitmap(IDB_BITMAP1); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap *pTmpBitmap; pTmpBitmap = MemDC.GetCurrentBitmap(); MemDC.SelectObject(&kaitaGazou); pDC->BitBlt(0, 0, 100, 100, &MemDC, 10, 10, SRCCOPY); MemDC.SelectObject(pTmpBitmap); kaitaGazou.DeleteObject(); --------------------------------------------------------

  • ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?

    ビットマップに描画をしてピクチャーコントロールに貼り付けるためには どうすればよいでしょうか? ネットで検索しましたそして、 下のようなコードを書きましたがうまくゆきません。 void CXXXView::OnButton() { CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数 CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ CDC m_dcImage; // Bitmap描画用のDC CDC* pDC = m_ctlImage.GetDC(); m_dcImage.CreateCompatibleDC(pDC); CRect Cltsz; picture1.GetClientRect(&Cltsz); m_bmpImage.CreateCompatibleBitmap(pDC,Cltsz.Width(),Cltsz.Height()); CBitmap* pOld=m_dcImage.SelectObject(&m_bmpImage); CPen myPEN(PS_SOLID,5,RGB(0,0,255)); CPen* oldPEN=m_dcImage.SelectObject(&myPEN); m_dcImage.MoveTo(10,10); m_dcImage.LineTo(100,100); m_dcImage.SelectObject(oldPEN); m_dcImage.SelectObject(pOld); m_ctlImage.SetBitmap(m_bmpImage); } この様にしましたが、ピクチャーコントロールには 何も描画されません、 何故でしょうか? VS2005で、ボタンをクリックした イベントで描画する場合です、 直線とかは、問題なく描画できました。 ビットマップに描画して貼り付けたいのです、 よろしくお願いします

  • チャイルドダイアログの最前面表示

    現在、MDIフレーム上に、複数のチャイルドスタイルのダイアログが存在するプログラムを改造中です。 その中にMapDKIVの地図を描画しているダイアログがあり、その地図上に縮尺スケールのビットマップを描画しようとしています。(MapDKIVには、その機能がまだ無い為) 縮尺スケールのビットマップを描画する為のダイアログを同様にチャイルドスタイルにし、SetWindowPos()を使って最前面に表示しようとしましたが、地図を描画しているダイアログをクリックすると、後ろへ行ってしまいます。 MSDNのSetWindowPos()の説明には、 「子ウィンドウ、ポップアップウィンドウ、またはトップレベルウィンドウのサイズ、位置、および Z オーダーを変更します。」 と記述されています。 が、あるサイトでは、 「MDI子Formは、子Windowであって、TopLevelWindowではないのですから、SetWindowPosは最前面や最背面設定を受け入れません。」 と記述されています。 縮尺スケールのビットマップを描画する為のダイアログを通常のスタイルにし、「フォアグランド表示する」とすると、メインフレームのサイズを小さくしたり、移動した時に、その場所へ取り残されてしまいます。 何か、方法はないものでしょうか? 開発環境 VisualC++ 6.0 SP6 どなたかお助け下さい!よろしくお願いします。

  • アクションスクリプト ビットマップデータ 描画

    Flashゲーム作成のため、アクションスクリプトを学び始めた初心者です。 ゲーム作成中にプレイヤーがミスをした場合、"MISS!!"という文字を画面に描画し、下から上へスクロールさせる処理を考えています。 ビットマップデータにテキストフィールドで指定したテキストを描画しているのですが、その描画位置を指定できなくて困っています。 canvas = new BitmapData(WIDTH, HEIGHT, true, 0x0);// 透明、初期色0x00000000 var bitmap:Bitmap = new Bitmap(canvas); bitmap.scaleX = bitmap.scaleY = 1;// 1倍表示 addChild(bitmap); var tf:TextField = new TextField(); tf.defaultTextFormat = new TextFormat("MS ゴシック", 50, 0xFF0E0E ,true); tf.width = stage.stageWidth; // 幅 tf.height = 50; tf.autoSize = TextFieldAutoSize.CENTER; tf.y = 240; tf.text = "MISS!!"; canvas.draw(tf); これで実行すると、画面上にMISS!!と表示されて、tf=240が適応されません、どうしたらテキストの表示位置の縦方向の位置を変えることができるのでしょうか?教えていただきたいです。

    • ベストアンサー
    • Flash
  • AutoLoad()関数の使い方がわかりません。

    VC++6.0 WindowsXPです。 ダイアログベースで作っていますが、ダイアログのボタンをビットマップで表示しようとしてます。 現在のやり方としては 1.ダイアログのスタイルは「オーナー描画」「ビットマップ」にチェックする。 2.リソースに貼り付けたいビットマップ画像を4枚挿入し、ビットマップのIDは対象のボタンのキャプションを「IMAGE」だとすると末尾に「U」「D」「F]「X」をつけたID、つまり「IMAGEU」「IMAGED」、、とする。 3.ダイアログのクラス(xxxDlg)の中で CBitmapButton bitmap1; のようにCBitmapButton型のオブジェクトを作る。 3.xxx::OnInitDialog()の中で bitmap1.AutoLoad(IDIMAGE,this); を追加する。 以上です。コンパイル自体はエラー、警告なしでできました。しかし実行するとエラーがおきます。 エラーの内容は 「例外 unknown software exception (0x8000003)がアプリケーションの0x77f767cdで発生しました。」 となります。 どこが間違いなのかわかりません。 よろしくお願いします。

  • 丸いボタンの表示でCPU100%

    VC6.0でMFCアプリケーションを作成しています。 ・ダイアログベース ・背景はビットマップ(スタイルにWS_CLIPCHILDRENを追加) ・ボタンはビットマップ&非矩形(丸) これを作成し、実行するとCPU使用率が100%になってしまいます。 OnPaint()での描画をしなければ、ボタンが丸く表示されません。 ご存知の方は教えてください。 以下、ソース抜粋です。 メンバ CButton m_cbImage; CBitmap m_cBmpBack; CBitmap m_cBmpButton; HBITMAP m_hBmpBack; BITMAP m_bmp; HDC m_hDc; OnInitDialog(){ //背景ビットマップ m_cBmpBack.LoadBitmap(IDB_BITMAP_BACK); //ボタンビットマップ m_cBmpButton.LoadBitmap(IDB_BITMAP_BUTTON); HBITMAP hBmpButton = HBITMAP(m_cBmpButton); m_cbImage.SetBitmap(hBmpButton); // ウィンドウに関する情報を取得 // BMPサイズ取得 m_hBmpBack = HBITMAP(m_cBmpBack); GetObject(m_hBmpBack, sizeof(BITMAP), &m_bmp); // BMPデバイスコンテキスト作成 m_hDc = CreateCompatibleDC(NULL); // オブジェクトを選択する SelectObject(m_hDc, m_hBmpBack); // ボタン変形 CRect cRectButton; m_cbImage.GetClientRect(cRectButton); CRgn rgnButton; rgnButton.CreateEllipticRgn(cRectButton.Width() * 1 / 8, cRectButton.Height() * 1 / 8, cRectButton.Width() * 7 / 8, cRectButton.Height() * 7 / 8); m_cbImage.SetWindowRgn((HRGN)rgnButton, TRUE); } OnPaint(){ HDC hdc = ::GetDC(m_hWnd); BitBlt(hdc, 0, 0, (int)m_bmp.bmWidth, (int)m_bmp.bmHeight, m_hDc, 0, 0, SRCCOPY); ::ReleaseDC(m_hWnd, hdc); } 以上、よろしくお願いします。

  • ダイアログにビットマップを貼り付けた時にフリーズしてしまう

    お世話になります、fujicafeです。 現在、MFCにてダイアログベースのアプリケーションを作成中なのですが、ダイアログにビットマップを貼り付けてOnPaint()で表示するようにプログラムを作成したのですが、何度かダイアログの表示を繰り返すとOnPaintでのビットマップの読み込みが途中まででフリーズしてしまう現象が起きてしまいました。 プログラムは以下のように作成しています void C****Dlg::OnPaint() {  CDC* pDC = this->GetDC(); CDC myDC; CBitmap newbitmap; CBitmap* oldbitmap; CRect rc; GetClientRect(rc); newbitmap.LoadBitmap(IDB_BITMAP); myDC.CreateCompatibleDC( pDC ); oldbitmap=myDC.SelectObject( &newbitmap ); pDC->BitBlt( 0, 0, rc.Width(), rc.Height(), &myDC, 0, 0, SRCCOPY ); myDC.SelectObject(oldbitmap); } としています。 初めにこのダイアログを表示時は、ちゃんとビットマップが表示されるのですが、他のダイアログでこのダイアログを表示させた時にビットマップが上半分まで表示されて、動作がフリーズしてしまう現状です。 なにかよい打開策がありましたら、教えていただけたらと思っています。宜しくお願いいたします。

  • tabにdrawImageで画像を描画したい

    tabにdrawImageで画像を描画したい 以下のソースでtabbedpaneに対して、ImageIconを指定して画像をのせるではなく、 drawImageメソッドで描画したいです。 ご存知の方がおられましたら教えてください。 import javax.swing.*; import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Graphics2D; public class JTabbedPaneTest4 extends JFrame { Zoom zoom = null; public static void main(String[] args) { JTabbedPaneTest4 frame = new JTabbedPaneTest4(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setVisible(true); } JTabbedPaneTest4() { JTabbedPane tabbedpane = new JTabbedPane(); JPanel tabPanel1 = new JPanel(); tabPanel1.add(new JButton("button1")); ImageIcon icon1 = new ImageIcon("img1.jpg"); zoom = new Zoom(icon1, 0, 0, 50, 50); //tabbedpane.addTab("tab1", icon1, tabPanel1);//ok //tabbedpane.add(zoom, tabPanel1);//ng(パネルに書き込まれてしまう) getContentPane().add(tabbedpane, BorderLayout.CENTER); } class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); g2.drawImage(icon.getImage(), x, y, w, h, this); } } }

    • ベストアンサー
    • Java
  • ダイアログの表示と同時に、ピクチャーボックスを塗る方法

    あるサイトの過去ログで以下を見つけました。 エラーは出ませんが、何も起こりません。 このコードは何をしようとしているのでしょうか? ************************* ダイアログ上にピクチャーボックスを配置して、ダイアログの表示と同時に、ピクチャーボックスを塗る方法。 まず、ピクチャコントロールをClassWizardのメンバ変数タブによりm_pictureとして実態を作成します。 その後、 class CPictureDlg { private: CBitmap m_bitmap; // ... }; BOOL CPictureDlg::OnInitDialog() { CDialog::OnInitDialog(); // ... CDC desktopDC; desktopDC.Attach ( ::GetDC ( NULL ) ); CDC memDC; memDC.CreateCompatibleDC ( &desktopDC ); m_bitmap.CreateCompatibleBitmap ( &desktopDC, 100, 100 ); CBitmap *pOldBitmap = memDC.SelectObject ( &m_bitmap ); CRect rcPicture ( 0, 0, 100, 100 ); CBrush brush; brush.CreateStockObject ( WHITE_BRUSH ); memDC.FillRect ( &rcPicture, &brush ); memDC.SelectObject ( pOldBitmap ); m_picture.SetBitmap ( ( HBITMAP ) m_bitmap.GetSafeHandle () ); ReleaseDC ( &desktopDC ); memDC.DeleteDC (); }

  • ちらつきについて

    ゲームをつくっているのですが、画面がちらつくのが気になり、直そうと、ネットで調べたのですが、裏画面に一度、ビットマップを表示させて、それをデバイスコンテキストに転送する?ってやりかたがよくわかりません。 CMyFrameWnd::OnPaint(){ CPaintDC dc(this); CDC MemDC; CBitmap bitmap1; bitmap1.LoadBitmap("IDB_BITMAP1"); ...略 for(j=0;j<30;j++){ for(k=0;k<30;k++){ MemDC.SelectObject(&bitmap1); dc.Blt(j*32,k*32,32,32,&MemDC,0,0,SRCCOPY); } } } 見たいな感じです。なにぶんc,c++始めたばっかりでデバイスコンテキストとかもよくわかってないんでわかりやすい説明お願いします。

専門家に質問してみよう