スタティック・コントロール)を一つ配置して、そこにファイルからビットマップをロードして
表示させたいと思い、下のようにプログラムを書いきました。
結果的に、ビットマップの表示自体は出来たのですが、ただしロード後、
そのイメージボックスの大きさに合わせてビットマップ画像が拡大縮小されてしまう
という現象に気付きました。これを何とかヤメにして実大のまま表示させたいと、
「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] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'ビットマップ表示・スタティックコントロール用
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)
SendDlgItemMessage(hMainWnd,ImageBox1,STM_SETIMAGE,IMAGE_BITMAP,hBmp)
'親ウインドウのクライアントエリアに合わせて
'スタティック・コントロール(=イメージ・ボックス)の
'大きさを変える。
Dim clientRect As RECT
GetClientRect(hMainWnd,clientRect)
SetWindowPos(hImageBox1,NULL,0,0,clientRect.right,clientRect.bottom, SWP_NOZORDER)
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
まず「●クリエイト・イベント / MainWnd_Create()」で
イメージ・ボックスの作成、
それからメインメニューの「ファイルを開く」から
「●ビットマップファイルの読み込み
/ MainWnd_IDM_OPEN_FILE_MenuClick()」へ飛び、
そこでビットマップをイメージボックスに貼り付けるとなっています。