ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 18:49

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年4月03日(金) 20:34 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 106
メイン・ウインドウ上の"イメージ・ボックス"(=ビットマップ表示スタイルを持つ
スタティック・コントロール)を一つ配置して、そこにファイルからビットマップをロードして
表示させたいと思い、下のようにプログラムを書いきました。

結果的に、ビットマップの表示自体は出来たのですが、ただしロード後、
そのイメージボックスの大きさに合わせてビットマップ画像が拡大縮小されてしまう
という現象に気付きました。これを何とかヤメにして実大のまま表示させたいと、
「SS_REALSIZEIMAGE」というものを見つけてスタイルとしてセットしたのですが
しかしこれが効果なく、依然として画像が拡大縮小されてしまいます。
(※該当箇所、下プログラム中「'●ビットマップファイルの読み込み」内。
"And Not(SS_GRAYRECT)"とあるのは、ビットマップ画像を貼り付ける前に
「灰色ボックス」としてスタイル設定をしていたのを外すためだけの意味です。)
コード:
   SetWindowLong(hImageBox1,GWL_STYLE, _
             (GetWindowLong(hImageBox1,GWL_STYLE) _
             And Not(SS_GRAYRECT)) _
             Or SS_BITMAP Or SS_REALSIZEIMAGE)

   SendDlgItemMessage(hMainWnd,ImageBox1, _
              STM_SETIMAGE,IMAGE_BITMAP,hBmp)
ビットマップ画像を実寸でそのままイメージボックスに表示させるには、どのように
するべきでしょうか?
プログラムの主な流れは、
まず「●クリエイト・イベント / MainWnd_Create()」で
イメージ・ボックスの作成、
それからメインメニューの「ファイルを開く」から
「●ビットマップファイルの読み込み
/ MainWnd_IDM_OPEN_FILE_MenuClick()」へ飛び、
そこでビットマップをイメージボックスに貼り付けるとなっています。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2009年4月05日(日) 21:23 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
私が調べた限り、SS_REALSIZEIMAGEは逆にイメージボックスに合わせて画像を拡大縮小するというもののようです。それと、このプログラムでは親ウィンドウの大きさに合わせるということを行っていますが、それもやめたほうがよいと思います。

というわけで、1つ目のSetWindowLongをSetWindowLong(hImageBox1, GWL_STYLE, (GetWindowLong(hImageBox1, GWL_STYLE) And Not(SS_GRAYRECT)) Or SS_BITMAP)にして、SetWindowPosは削除するということでどうでしょうか。

また、そうすると表示が乱れることがあったので、STM_SETIMAGEを送った後、End Ifの直前でInvalidateRect(hImageBox1, ByVal 0, FALSE)を入れました。

これで、原寸大で表示されるようになりました。


通報する
ページトップ
投稿記事Posted: 2009年4月07日(火) 07:42 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 106
イグトランスさん、レスありがとうございます。

改めて調べてみると確かに、SS_REALSIZEIMAGEは
引用:
「SS_BITMAP スタイルや SS_ICON スタイルを持つコントロールの
イメージがロードされたり描画されたりするときに、コントロールサイズが
変更されないようにします。」
とあります。
また、当初自分の調べたページではこう説明されていました。
引用:
「SS_REALSIZEIMAGE : [リアル サイズ イメージ]
  SS_BITMAP, SS_ICONでサイズ変更を禁止する.はみ出た分はクリップ. 」
そう言われて改めて読み直すと"イメージを変更しない"とは一言もないですね。
(でもだとすると"はみ出た分はクリップ"としいうのは何を差すのか謎です、、)
これは僕の思い違いかもしれません。。。にしても"リアルサイズイメージ"、
悩ましい。。(笑)


ただ、親ウインドウに合わせてイメージボックスのサイズを動かしたいという
のは是非実装したいところです。それはイメージボックスの画像表示エリアに
「クライアント・エッジ」(WS_EX_CLIENTEDGE)を付けたいということから
です。(落ち窪んだスタイルの)。

一番初めに上のプログラムを実行させた時、その時は
「SS_REALSIZEIMAGE」は付けていなかったんですが、画像はきちんと
実大で表示されました。
ところがよく見るとイメージボックスに拡張スタイルとして付けた
「クライアント・エッジ」が右辺と下辺で消えてしまっていたんです。
どこに行ったんだろうとメインウインドウのサイズを大きくしてみると
(テストしたその画像はかなり大きなものだったので)
ロードした画像に"合わせて"クライアント・エッジが描かれていました。
これは、このコントロールのサイズはセットする画像に合わせて変わるんだと
思い、(ただし、イメージ・ボックスのサイズは親であるメインウインドウの「中」に
無ければ表示上とても不自然になるので)、
そこで画像ロード直後に「SetWindowPos」でサイズを整える処理を
書いたのですが、そうすると今度は画像が拡大縮小されてしまい。。。
ということで今回の質問に至ります。

もっとも今回の質問のプログラムにあるようにメインウインドウのクライアント・
エリア一杯に一枚の画像を表示したいならわざわざイメージ・ボックスを使う
必要も実際無い訳なんですが、将来的にはメインウインドウの
クライアントエリアに複数の画像を表示したい。
各画像はいずれも拡大縮小せず、表示領域の大きさからはみ出ても
その分は無視して、それぞれに「Windowsによく見られる窪んだエッジ」を
付け、また各表示領域は"メインウインドウの大きさに比例して可変"としたい。
例えばこんな感じで。
■■■メイン・ウインドウ■■■    ■メイン・ウインドウ■
■■■■■■■■■■■■■    ■■■■■■■■■
■□□□□□■□□□□□■    ■□①□■□②□■
■□画像①□■□画像②□■    ■■■■■■■■■
■□□□□□■□□□□□■    ■□③□■□④□■
■■■■■■■■■■■■■    ■■■■■■■■■
■□□□□□■□□□□□■
■□画像③□■□画像④□■
■□□□□□■□□□□□■
■■■■■■■■■■■■■

以上のことが実装したいと思ったのです。

そう思ってRADツールをいじってると「イメージ・ボックス」というものを見つけて、
もしかしてこんな場合、これを使うのが"本筋"なのかな、と。

          *

とにもかくにも、レス頂いた通り、SS_REALSIZEIMAGEを外し、
SetWindowPosを取り、InvalidateRectを挿入したのですが、
やはり「リサイズイベント」に飛んだ瞬間に画像は拡大縮小が行われる
ようです。加えて、(もしロードしてきた画像がメインウインドウの
サイズよりも大きなもののような場合)「クライアントエッジ」が右辺、下辺で
見えなくなってしまいます。
(と言うか、これこそSS_REALSIZEIMAGEを指定すれば
クライアントエッジの位置が動かなくなってもいいように思えるんですが、
仮にSS_REALSIZEIMAGEを指定してもやはりクライアントエッジは
見えなくなるようです。あくまでコントロール・サイズとそのコントロールの中の
クライアント・エリア・サイズは別物ということでしょうか?だとしたら
SS_REALSIZEIMAGEの存在意義って、ともつい思ってしまいますが。。)

ちょっとどうしたもんかと、まだ考えています。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], Baidu [Spider], Google [Bot] & ゲスト[20人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean