none
SS_REALSIZEIMAGEの意味とスクロールバー付きピクチャーコントロール RRS feed

  • 質問

  • Win32プロジェクトで、STATICウィンドウクラスでピクチャーコントロールを作って、そこに画像を表示させたいのですが、

    ピクチャが320x240で、画像サイズが640x480

    HWND hStatic = ::CreateWindow(_T("Static"), _T(""), WS_VISIBLE | WS_CHILD |SS_BITMAP |WS_BORDER | SS_REALSIZECONTROL|WS_HSCROLL | WS_VSCROLL | SS_NOTIFY, 50, 50, 320, 240, hwnd, HMENU(-1),hInst, NULL);

    hBitmap = (HBITMAP)LoadImage(hInst, _T("bitmap1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE /*LR_DEFAULTSIZE*/);

    ::SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);

    こんな感じでSTM_SETIMAGEで画像をセットしたら、

    SS_BITMAPにだけの場合 => 画像サイズの640x480に拡大

    SS_BITMAP | SS_REALSIZEIMAGEの場合 => 画像サイズの640x480に拡大

    SS_BITMAP | SS_REALSIZECONTROLの場合 => コントロールサイズの320x240に縮小

    となりました。

    SS_REALSIZEIMAGEは画像縮尺そのままに左上4分の1になるわけではないのですか?

    また、本来やりたいことは、縮尺そのままにスクロールバーでスクロールすることで、画像を移動してすべて見れるピクチャーボックスです。

    このようなピクチャーボックスはどう作ればいいですか?BitBltですか?孫ウィンドウを作ってMoveWindowですか?

    ScrollWindowでクライアント領域をスクロールしたとき孫コントロールはどうなりますか?

    2017年1月23日 9:46

回答

  • 本来やりたいことは、縮尺そのままにスクロールバーでスクロールすることで、画像を移動してすべて見れるピクチャーボックスです

    回答ではないのですが、ピクチャーコントロール(STATICコントロール)には画像の一部をスクロールバーでスクロールして表示する機能はありませんので、ピクチャーコントロールを使うにしても画像をスクロールして画像の一部を表示する部分には実装が必要かと思います。※SS_REALSIZECONTROL,SS_REALSIZEIMAGEは、それぞれ画像サイズをコントロールサイズに合わせるか、コントロールサイズを画像サイズに合わせるかのスタイルです。SS_CENTERIMAGEというスタイルは画像の一部がそのまま縮尺で表示されますがスクロールする機能はありません。

    Win32ではないのですが、以下のサイトに画像をスクロールして表示するコントロールのサンプルがありました。以下のサイトなどを参考にスクロールする部分に関して実装する必要があるかと思います。

    https://www.codeproject.com/articles/3175/displaying-bitmap-with-scrolling

    http://www.ucancode.net/Visual_C_MFC_Samples/VC-Control-Load-View-Bitmap-File.htm

    あるいは、IEコンポーネントを使うとスクロール周りの実装を行わずに実現ができるかもしれません。

    http://www.nitoyon.com/vc/tips/ie_component.htm

    • 編集済み kenjinoteMVP 2017年1月23日 11:04
    • 回答としてマーク bg1_333 2017年1月23日 21:46
    2017年1月23日 10:48

すべての返信

  • 本来やりたいことは、縮尺そのままにスクロールバーでスクロールすることで、画像を移動してすべて見れるピクチャーボックスです

    回答ではないのですが、ピクチャーコントロール(STATICコントロール)には画像の一部をスクロールバーでスクロールして表示する機能はありませんので、ピクチャーコントロールを使うにしても画像をスクロールして画像の一部を表示する部分には実装が必要かと思います。※SS_REALSIZECONTROL,SS_REALSIZEIMAGEは、それぞれ画像サイズをコントロールサイズに合わせるか、コントロールサイズを画像サイズに合わせるかのスタイルです。SS_CENTERIMAGEというスタイルは画像の一部がそのまま縮尺で表示されますがスクロールする機能はありません。

    Win32ではないのですが、以下のサイトに画像をスクロールして表示するコントロールのサンプルがありました。以下のサイトなどを参考にスクロールする部分に関して実装する必要があるかと思います。

    https://www.codeproject.com/articles/3175/displaying-bitmap-with-scrolling

    http://www.ucancode.net/Visual_C_MFC_Samples/VC-Control-Load-View-Bitmap-File.htm

    あるいは、IEコンポーネントを使うとスクロール周りの実装を行わずに実現ができるかもしれません。

    http://www.nitoyon.com/vc/tips/ie_component.htm

    • 編集済み kenjinoteMVP 2017年1月23日 11:04
    • 回答としてマーク bg1_333 2017年1月23日 21:46
    2017年1月23日 10:48
  • kenjinoteさん、貴重なご意見ありがとうございます。

    リンクのサンプルを見る限り、やはりBitbltによる再描画は避けられないようですね。

    画像を全体に張り付けた孫STATICウィンドウをスクロールバーをつけた子STATICウィンドウの中に入れて動かせないかとも思いましたが、

    これでも再描画にBitblt必要そうですし・・・。

    http://www.kumei.ne.jp/c_lang/sdk/sdk_99.htm

    また、こちらのScrollWindowのクライアント領域のスクロールという意味がピンとこないのですが、

    クライアント領域をスクロールするというのは、そこに配置した絵やウィンドウが勝手にスクロールしてくれるわけではなくて、WM_PAINTを呼んでるので再描画させてるだけなんでしょうか?

    ひとまず、Bitbltの用意をしておきます。ありがとうございました。

    2017年1月23日 12:46