ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2018年10月22日(月) 23:38

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年10月05日(月) 00:02 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 106
イメージボックスへのビットマップの表示について(2)

メイン・ウインドウ上にスタティック・コントロールのイメージボックスを設置して、そこにビットマップ画像を表示させたいのですが、ウインドウのリサイズに伴ってイメージボックスのサイズが変わった時などにどうしてもビットマップ画像が拡大縮小されて表示されます。

これを解消するために(コントロールのサイズが変わっても画像が実寸のままでいてくれるように)、「SS_REALSIZEIMAZE」というスタイルをセットしてみたのですが依然拡大縮小されてしまいます。
引用:
SS_REALSIZEIMAGE 静的なアイコンまたはビットマップ コントロール (SS_ICON または SS_BITMAP のスタイルを持つ静的コントロール) が読み込まれたり描画されたりするときに、そのサイズが変更されないようにします。アイコンまたはビットマップが描画先の領域よりも大きい場合、そのイメージはクリップされます。
(※msdnより)
http://msdn.microsoft.com/ja-jp/library ... S.80).aspx

前出の質問「イメージボックスへのビットマップの表示について」でも同様のことをお聞きしたのですが、中々まだ当人の理解が甘く。。。
メイン・ウインドウのリサイズに合わせてコントロールのサイズを変更しないようにすれば拡大縮小もされないのですが、それではイメージボックスのフチに付けてある「クライアント・エッジ」も動かず、ウインドウのサイズによってはエッジが隠れたりして見た目上とても不自然になります。

先日、代わりに「SS_CENTERIMAGE」というスタイルをセットしてやってみたらこれは
画像を実寸のまま表示して、コントロールの大きさに合わせてエッジも表示してくれていることに気が付きました。(ただし画像は中央位置表示になってしまいます。もし画像がコントロールのサイズをはみ出る場合はクリップされます。)
引用:
SS_CENTERIMAGE: コントロールのサイズが変更されても、SS_BITMAPスタイルやSS_ICONスタイルを持つスタティックコントロールの中心点は変えないようにします。
(※ABヘルプより)

それならと同様に「SS_RIGHTIMAGE」でやってみたら、
引用:
SS_RIGHTIMAGE: コントロールのサイズが変更されても、SS_BITMAPスタイルやSS_ICONスタイルを持つスタティックコントロールの右下隅は変えないようにします。
(※ABヘルプより)
これは「無効な識別子です」とエラーになります。

msdnで調べてみると同じようなスタイルで「SS_RIGHTJUST」というのがあり
これでやってみると、
引用:
SS_RIGHTJUST SS_BITMAP または SS_ICON スタイルを持つ静的コントロールのサイズを変更した場合も、そのコントロールの右下隅の位置は固定されたままになるように指定します。新しいビットマップまたはアイコンを表示する場合、コントロールの上辺と左辺だけが調整されます。
(※msdnより)
何故かこれはまたもや「拡大縮小」されてしまいます。


以上のテストの結果では「SS_CENTERIMAGE」が自分が思ったようなリサイズ時の動作をしてくれるのですが、ただしこれを「中央表示」ではなく基本的な「左上隅表示」でやりたいのです。

画像をイメージボックスに、リサイズ時も実寸のまま表示させるには
どうしたら良いでしょうか?


下にプログラムを。簡単なイメージ・ビューワのテストです。
AB4.24プロジェクトファイルで実行後「ファイル」メニューから何かの
ビットマップファイル(.bmp)を選択して下さい。
下記プログラム中、質問の該当部分は
「●ビットマップファイルの読み込み」サブ内にあります。

[hide=ここにプログラムが表示されます。]
コード:
'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
#prompt

'ビットマップ・スタティックコントロール用
 Const ImageBox1=2000
 Dim hImageBox1 As HWND

'ビットマップ・ハンドル
 Dim hBmp As HBITMAP

'ディレクトリ・パス保存用
 Dim fileName_fullPath[MAX_PATH] As Byte

'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

'
'●デストロイ・イベント
'
Sub MainWnd_Destroy()

    DeleteObject(hBmp)

	ImageBoxTest_DestroyObjects()
	PostQuitMessage(0)

End Sub

'
'●クリエイト・イベント
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)

 'とりあえず初めの何もない状態の時は、灰色ボックス(「SS_GRAYRECT」)のスタティックコントロールを作成。

 hImageBox1=CreateWindowEx(WS_EX_CLIENTEDGE,"STATIC","", _
          WS_CHILD Or WS_VISIBLE Or SS_GRAYRECT,_
          0,0,0,0,hMainWnd,ImageBox1,GetModuleHandle(0),0)

End Sub

'
'●リサイズ・イベント
'
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)

'ビットマップ・スタティックコントロールを親ウインドウの大きさに合わせてリサイズ。
  SetWindowPos(hImageBox1,NULL,0,0,cx,cy,SWP_NOMOVE Or SWP_NOZORDER)

End Sub

'
'●ビットマップファイルの読み込み
'
Sub MainWnd_IDM_OPEN_FILE_MenuClick()

 'OpenFileDialogを開き、ファイルのパスを得る(→ fileName_fullPath)。
 If LoadBitMap_OpenFileDialog()<>FALSE Then

  'ビットマップをファイルから読み込む。
   hBmp=LoadImage(GetWindowLong(hMainWnd, GWL_HINSTANCE), fileName_fullPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)

  'ウインドウスタイルの灰色ボックスを外し(「And Not(SS_GRAYRECT))」)、
  'ビットマップ表示(「Or SS_BITMAP」)に変更。
  '同時に「Or SS_REALSIZEIMAGE」として
  'ビットマップをウインドウサイズに合わせて拡大縮小しないように設定。
  '…ところがこれが上手く行われない。
  '相変わらずビットマップがウインドウに合わせて拡大縮小されて
  '表示される。↓(コメント・アウトしています。)
  'SetWindowLong(hImageBox1,GWL_STYLE,GetWindowLong(hImageBox1,GWL_STYLE) And Not(SS_GRAYRECT) Or SS_BITMAP Or SS_REALSIZEIMAGE)

  'しかし「Or SS_CENTERIMAGE」として
  'コントロールのリサイズに関わらずビットマップの中央で表示されるセットを
 'すると拡大縮小は行われず実寸大のまま表示される。↓
  SetWindowLong(hImageBox1,GWL_STYLE,GetWindowLong(hImageBox1,GWL_STYLE) And Not(SS_GRAYRECT) Or SS_BITMAP Or SS_REALSIZEIMAGE Or SS_CENTERIMAGE)

  SendDlgItemMessage(hMainWnd,ImageBox1,STM_SETIMAGE,IMAGE_BITMAP,hBmp)

 End If

End Sub

'
'●OpenFileDialogを開く(Bitmapファイル・ロード時)
'
Function LoadBitMap_OpenFileDialog() As Long

 Dim ofn As OPENFILENAME

'OPENFILENAME構造体の初期化
    FillMemory(VarPtr(ofn),SizeOf(OPENFILENAME),0)
    ofn.lStructSize=SizeOf(OPENFILENAME)
    ofn.hwndOwner=hMainWnd
    ofn.lpstrFilter=Ex"ビットマップ・ファイル(*.bmp)\0*.bmp\0すべてのファイル(*.*)\0*.*\0\0"
    ofn.nFilterIndex=1
    ofn.lpstrFile=fileName_fullPath
    ofn.nMaxFile=MAX_PATH
    ofn.lpstrFileTitle=NULL
    ofn.nMaxFileTitle=MAX_PATH
    ofn.lpstrTitle="ビットマップ・ファイルを開く"
    ofn.Flags=OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY Or OFN_PATHMUSTEXIST Or OFN_OVERWRITEPROMPT Or OFN_NOREADONLYRETURN
    ofn.lpstrDefExt="bmp"
    ofn.lpstrInitialDir=NULL
'「ファイルの保存」ダイアログ ボックスを表示
  LoadBitMap_OpenFileDialog=GetOpenFileName(ofn)

End Function

[/hide]


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2010年10月24日(日) 14:41 
イメージボックスのDCにBitBltしたらいいんじゃね?


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

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[3人]


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

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