メイン・ウインドウ上にスタティック・コントロールのイメージボックスを設置して、そこにビットマップ画像を表示させたいのですが、ウインドウのリサイズに伴ってイメージボックスのサイズが変わった時などにどうしてもビットマップ画像が拡大縮小されて表示されます。
これを解消するために(コントロールのサイズが変わっても画像が実寸のままでいてくれるように)、「SS_REALSIZEIMAZE」というスタイルをセットしてみたのですが依然拡大縮小されてしまいます。
(※msdnより)SS_REALSIZEIMAGE 静的なアイコンまたはビットマップ コントロール (SS_ICON または SS_BITMAP のスタイルを持つ静的コントロール) が読み込まれたり描画されたりするときに、そのサイズが変更されないようにします。アイコンまたはビットマップが描画先の領域よりも大きい場合、そのイメージはクリップされます。
http://msdn.microsoft.com/ja-jp/library ... S.80).aspx
前出の質問「イメージボックスへのビットマップの表示について」でも同様のことをお聞きしたのですが、中々まだ当人の理解が甘く。。。
メイン・ウインドウのリサイズに合わせてコントロールのサイズを変更しないようにすれば拡大縮小もされないのですが、それではイメージボックスのフチに付けてある「クライアント・エッジ」も動かず、ウインドウのサイズによってはエッジが隠れたりして見た目上とても不自然になります。
先日、代わりに「SS_CENTERIMAGE」というスタイルをセットしてやってみたらこれは
画像を実寸のまま表示して、コントロールの大きさに合わせてエッジも表示してくれていることに気が付きました。(ただし画像は中央位置表示になってしまいます。もし画像がコントロールのサイズをはみ出る場合はクリップされます。)
(※ABヘルプより)SS_CENTERIMAGE: コントロールのサイズが変更されても、SS_BITMAPスタイルやSS_ICONスタイルを持つスタティックコントロールの中心点は変えないようにします。
それならと同様に「SS_RIGHTIMAGE」でやってみたら、
(※ABヘルプより)SS_RIGHTIMAGE: コントロールのサイズが変更されても、SS_BITMAPスタイルやSS_ICONスタイルを持つスタティックコントロールの右下隅は変えないようにします。
これは「無効な識別子です」とエラーになります。
msdnで調べてみると同じようなスタイルで「SS_RIGHTJUST」というのがあり
これでやってみると、
(※msdnより)SS_RIGHTJUST SS_BITMAP または SS_ICON スタイルを持つ静的コントロールのサイズを変更した場合も、そのコントロールの右下隅の位置は固定されたままになるように指定します。新しいビットマップまたはアイコンを表示する場合、コントロールの上辺と左辺だけが調整されます。
何故かこれはまたもや「拡大縮小」されてしまいます。
以上のテストの結果では「SS_CENTERIMAGE」が自分が思ったようなリサイズ時の動作をしてくれるのですが、ただしこれを「中央表示」ではなく基本的な「左上隅表示」でやりたいのです。
画像をイメージボックスに、リサイズ時も実寸のまま表示させるには
どうしたら良いでしょうか?
下にプログラムを。簡単なイメージ・ビューワのテストです。
AB4.24プロジェクトファイルで実行後「ファイル」メニューから何かの
ビットマップファイル(.bmp)を選択して下さい。
下記プログラム中、質問の該当部分は
「●ビットマップファイルの読み込み」サブ内にあります。
ここにプログラムが表示されます。 [ここをクリックすると内容が表示されます]
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [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