ウインドウへのイメージ画像表示について

このQ&Aのポイント
  • ウインドウのクライアントエリア全体にではなく、任意の場所に任意の大きさでイメージを表示する方法を教えてください。
  • 「イメージボックス」やピクチャボックスではうまく扱えず、画像の拡大縮小やスクロールバーの制御ができません。
  • クライアントエッジを持つ子ウインドウのようなものをメインウインドウに貼り付ける方法が知りたいです。
回答を見る
  • ベストアンサー

ウインドウへのイメージ画像の表示について

メインウインドウにイメージを貼り付けたいと思うのですが ウインドウのクライアントエリア全体にでは無く 添付画像の様に任意の場所に任意の大きさで表示したいと思っています。 当初は「イメージボックス」(ピクチャボックス)を使うことを 考えたのですが、画像が自動的にコントロールの大きさに合わせて 拡大縮小されたり、スクロールバーが付けられなかったりして うまく扱えませんでした。 イメージの周りに「クライアントエッジ」が付けられればと思います。 「クライアントエリアのみの子ウインドウ」のようなものが あって、それをメインウインドウに貼り付ける、みたいな ことが出来ればいいなと思っているのですが、良い方法が ありましたら教えて下さい。 ActiveBasicを使っていますが、教えて頂く際には CやVBでも構いません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  フォームビューをしたいのでしょうか。 (1)ActiveBasicの「プロジェクト」→「Materialタブ」→「Window」を右クリックして「ウィンドウを挿入」。 (2)ウィンドウ名に「ViewWnd」と入力、タイプに「ダイアログテンプレート(モードレス)」を選択。 (3)「ViewWnd」のウィンドウデザイン画面にて以下を設定。  ・スタイルにチャイルドを選択  ・タイトルバーからチェックを外す  ・水平スクロールバーと垂直スクロールバーにチェックを入れる  ・拡張スタイルを設定ボタンを押して、クライアント境界線にチェックを入れる (4)「MainWnd」のイベントコード「WM_CREATE」を処理して「ViewWnd」を開く Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) CreateDialog(hMainWnd, "ViewWnd") if hMainWnd = NULL Then '失敗 MessageBox(hMainWnd, "失敗", "失敗", IDOK) Exit Sub End If MoveWindow(hViewWnd, 20, 20, 320, 240, TRUE) ShowWindow(hViewWnd, SW_SHOW) End Sub (5)「ViewWnd」側のイベントコード「WM_CREATE/WM_HSCROLL/WM_VSCROLL」を以下の様に処理する '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [ViewWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hViewWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 Type POINT x As Long y As Long End Type 'ピクチャコントロールのハンドル Dim hPicture As HWND 'ピクチャコントロールの座標 Dim picturePt As POINT '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function ViewWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 ViewWndProc=EventCall_ViewWnd(hWnd,dwMsg,wParam,lParam) End Function 'スクロールバーに最小値、最大値を設定する Sub SetScrollMinMax(hWnd As HWND, nDelta As Long, nMin As Long, nMax As Long) Dim sinfo As SCROLLINFO With sinfo .cbSize = Len(sinfo) .fMask = SIF_RANGE .nMin = nMin .nMax = nMax End With SetScrollInfo(hViewWnd, nDelta, sinfo, TRUE) End Sub 'スクロールバーの操作された部位に合わせて、スクロール位置を設定する Function MoveScroll(hWnd As HWND, nDelta As Long, nScrollCode As Long, nPos As Long) As Long Dim sinfo As SCROLLINFO With sinfo .cbSize = Len(sinfo) .fMask = SIF_ALL GetScrollInfo(hWnd, nDelta, sinfo) Select Case(nScrollCode) case SB_LINEUP .nPos -= 16 case SB_LINEDOWN .nPos += 16 case SB_PAGEUP .nPos -= 8 case SB_PAGEDOWN .nPos += 8 case SB_THUMBPOSITION, SB_THUMBTRACK .nPos = nPos End Select if .nPos < .nMin Then .nPos = .nMin if .nPos > .nMax Then .nPos = .nMax SetScrollInfo(hViewWnd, nDelta, sinfo, TRUE) MoveScroll = -.nPos End With End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub ViewWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hInst As HINSTANCE Dim hBitmap As HBITMAP Dim bmi As BITMAP 'インスタンスハンドルを取る hInst = GetModuleHandle(NULL) 'ビットマップを読み込む hBitmap = LoadImage(hInst, "test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION or LR_DEFAULTSIZE or LR_LOADFROMFILE) 'ビットマップ情報を取り出す GetObject(hBitmap, Len(bmi), bmi) 'ピクチャコントロールを作成する hPicture = CreateWindowEx(NULL, "Static", "MyPictureBox", WS_VISIBLE or WS_CHILD or SS_BITMAP, 0, 0, bmi.bmWidth, bmi.bmHeight, hViewWnd, NULL, hInst, NULL) 'ピクチャコントロールにビットマップを設定する SendMessage(hPicture, STM_SETIMAGE, IMAGE_BITMAP, hBitmap) '水平スクロールの最大値を設定する SetScrollMinMax(hViewWnd, SB_HORZ, 0, bmi.bmWidth) '垂直スクロールの最大値を設定する SetScrollMinMax(hViewWnd, SB_VERT, 0, bmi.bmHeight) End Sub Sub ViewWnd_HScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As HWND) 'ピクチャコントロールの水平スクロール picturePt.x = MoveScroll(hViewWnd, SB_HORZ, nScrollCode, nPos) SetWindowPos(hPicture, NULL, picturePt.x, picturePt.y, 0, 0, SWP_NOZORDER or SWP_NOSIZE) End Sub Sub ViewWnd_VScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As HWND) 'ピクチャコントロールの垂直スクロール picturePt.y = MoveScroll(hViewWnd, SB_VERT, nScrollCode, nPos) SetWindowPos(hPicture, NULL, picturePt.x, picturePt.y, 0, 0, SWP_NOZORDER or SWP_NOSIZE) End Sub  尚、ActiveBasic5.0にて行っています。

jacoby2200
質問者

お礼

回答ありがとうございます。 イメージ読み込みから、やっかいなスクロールバーの ルーチンまで書いて頂いて本当に感謝しています。 モードレスのチャイルドで「タイトルバー」無しで 作成するんですね。長いこと自分で出来なかったんで やってみて実際表示されたときは「す、凄い」とため息ものでした。 もう一つ、驚いたのはスクロールについてです。 今まで自分はBitBltの画像転送でスクロール表示を 行っていて、それに比べて凄く動きが滑らかだったので 何故なんだろうと思いつつプログラムを追っていたら 'ピクチャコントロールの水平スクロール picturePt.x = MoveScroll(hViewWnd, SB_HORZ, nScrollCode, nPos) SetWindowPos(hPicture, NULL, picturePt.x, picturePt.y, 0, 0, SWP_NOZORDER or SWP_NOSIZE) "ウインドウそのものの位置を動かす"ことによって 実装されているんですね。これも「子ウインドウ」として 作らなければ出来ないことで。本当に驚きました。 プログラムも水平と垂直の共通部分をnDelta引数で受けて さりげなく一本化してあったりと、参考になることだらけで これからまた時間を掛けて読んでいきたいと 思っています。 回答ありがとうございました。また何かのときには是非 よろしくお願いします。

関連するQ&A

  • 画像の表示について

    1.imageボックスを用いた場合、pictureプロパティで画像を参照した後Stretch=Trueにするとそのimageの大きさに合わせて画像を縮小して表示してくれます。   pictureボックスのときはその大きさに合わせて画像を縮小して表示できません。AutoSize=tureにしても画像の大きさにpictureボックスが大きくなってしまうだけです。 pictureボックスにはそのような縮小機能はないのでしょうか? 指定する画像を縮小して保存し直すしかないのでしょうか? そうすると表示したい大きさに合わせるのが大変で・・・。 2.ひとつのフォーム上に与えられた変数によって 画像を表示したいと考えています。 私たちが習ったのは 1. まずpictureボックスを1つ用意する。 2. 表示したい枚数だけimageボックスを準備しその中に画像をpictureプロパティで指定する。(画像5枚につきimageボックス5つ) 3. textボックスに数字をいれcommandボタンをおす。 4. その値によって picture1.piture=image1.picture という具合で表示させる。 こうなると表示したい画像が10枚あればimageボックスが 10個必要になりますよね。 そうなるとフォーム上がごちゃごちゃなってしまいます。 そうしないように画像をアドレスを指定して直接いれることはできませんか? image1.picture="gazou1.bmp"(エラーでした・・・。)みたいな感じで・・・。 そうするとimageボックスを1つしか作らなくてよいのですっきりするのですが。 以上2つよろしくお願いします。

  • ピクチャーボックス内でのイメージの移動

    VBで小さなピクチャーボックスの中に大きなビットマップを表示させ、ピクチャーボックスの内部でそのビットマップを移動させたいのですが、ヒントを下さい。 丁度、望遠鏡の丸の中で、景色がスクロールするイメージです。

  • イメージ画像の拡大/縮小

    不得意なhtml関連の作成をすることになったのですが imageを貼り付けボタンを押したらimageが拡大/縮小表示させる良い方法がありましたら教えてください。 また拡大していき画面に入りきらない場合はスクロールバーなど表示される様にしたいです。

    • ベストアンサー
    • HTML
  • ウィンドウに画像を表示するソフトを作っているのですが

    ピクチャーボックスに画像ファイルをドラッグ&ドロップすることで同ピクチャーボックスに画像を表示するソフトを作っているのですが ・実行ファイルに画像をドラッグ&ドロップすると画像を表示する ・既に画像を表示しているウィンドウ(ピクチャーボックス)に画像をドラッグ&ドロップすると、新しいウィンドウを開きそこにドロップされた画像を表示する このような動作をさせるにはどうプログラミングすればよいのでしょうか? Windows VistaでVisual Basic2008を使用しています。 よろしくお願いします。

  • PictureBoxの画像の表示方法を教えて VB.NET

    VB.NET2003環境なのですが、 ピクチャーボックスに画像を表示したいのですが、 下記のようなことはできるでしょうか? ピクチャーボックスの大きさ640*240で固定 画像ファイル640*480 だった場合に、画像を縮小して、横長のピクチャーボックスの 中央に(左右に余白をつける)画像ファイルを表示したいです。 ピクチャーボックス自体の大きさを変える方法などは分かったのですが、 表示前にファイルの画像のサイズを小さくして、位置を指定して 表示する方法がわからないので、このようなことができましたら、 方法をご教示頂きたいです。 よろしくお願い致します。

  • VB2005でピクチャーボックス内の図形を移動

    VB2005のフォームにピクチャーボックスを配置して、Imageで写真を張り付けたとき、写真がピクチャーボックスの大きさよりも大きい場合にピクチャーボックス内の写真を移動させる方法ってあるのですか?現在左上の一部分しか表示されません。同時に写真の拡大縮小ってできるのでしょうか?どなたか詳しい方よろしくお願いいたします。

  • picture boxの画像をimageに上下反転して表示したい

    お世話になります。mmc820です。 表題の通りですが、ピクチャーボックス(作業用で実際は表示されません)に描画した画像をイメージに上下反転した状態で表示させたいと思います。 ピクチャーボックスに上下反転して表示する方法は見つけたのですが、イメージに表示させる方法が見つからず困っております。 イメージへの反転表示は可能なのでしょうか? 皆様、良い方法がありましたらどうか御教示下さい。 もし不可能であれば「不可能です。」という旨のお答えでも結構ですので、ご意見お聞かせください。 当方の開発環境はWindows2000、VB6.0です。 また、説明に不足がありましたら補足いたします。 どうか宜しくお願いします。

  • 画像表示についてです

    picturebox1とpicturebox2を使ってbmpとjpgの画像を表示させています。 そこで、画像にも色々サイズがあるのですがpictureboxのwidthのサイズに合わせて画像の縮小拡大したいのですがどうやっていいのかわかりません。 教えてくださいお願いしますm(__)m ちなみにHeightはスクロールバーを使ってます。 Widthはスクロールバーを使わないプログラムです。

  • background-imageの画像を拡大する方法はありますか?

    background-imageの画像を拡大する方法はありますか? cssでbackground-imageを指定しています。 baackground-image: url('画像のアドレス'); この画像を拡大する方法はあるのでしょうか。 ありましたら、教えてください。 普通の画像はimageタグでwidthやheightで拡大縮小できるのですが、 baackground-imageではどうやっていいか、調べてもわかりませんでした。

  • フォトショップ画像を縮小したい

    フォトショップで作った画像を上下左右の比率を変えずに20パーセント縮小したい場合どうしたらいいのでしょうか。 バウンディングボックスを使って任意に縮小拡大は出来ますが、指定したパーセントで縮小拡大する方法はあるのでしょうか。 ご存知の方アドバイスよろしくお願いします。