いろいろ試してみましたが、うまく行きませんでした。
該当部分を切り出して整理してみました。
画像の表示部分は、画像を切り替えたいためDispImage()に、
終了処理はMainWnd_Destroy()にわけました。
'ImageBox1のみ再描画要求を出したいので
InvalidateRect(hImage,ByVal 0,1)としましたが、表示できません。
InvalidateRect(hMainWnd,ByVal 0,1)では表示されます。
なぜ表示できないかということとあわせて、コマンドボタンを押す
イベントでDispImage()を実行するだけではなぜ表示されないのか
ということも疑問です。
長くなりますがコードは以下のようです。
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
Dim hDC As DWord
Dim hResBmp As DWord
Dim hOldBmp As DWord
Dim hBuf As DWord
Dim udtBitmap As BITMAP
Dim hImage As Long
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここか'ら下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
ImageLabo_DestroyObjects()
PostQuitMessage(0)
'終了処理
SelectObject(hBuf,hOldBmp)
'⑧
'メモリデバイスコンテキストを解放する
DeleteDC(hBuf)
'ビットマップハンドルを破棄する
DeleteObject(hResBmp)
End Sub
Sub DispImage(filename2 as String)
hResBmp=LoadImage(GetModuleHandle(0),filename2,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
'←第2引数は適宜変更する
'③ビットマップのサイズを取得
GetObject(hResBmp,Len(udtBitmap),udtBitmap)
'④メモリデバイスコンテキストを作成する
hBuf=CreateCompatibleDC(hDC)
ReleaseDC(hMainWnd,hDC) '←Paintイベント内の場合は削除
'⑤メモリデバイスコンテキストにビットマップハンドルを割り当てる
hOldBmp=SelectObject(hBuf,hResBmp)
End Sub
'イベント#####################################################################
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'①コントロールのハンドル
' hImage=GetDC(GetDlgItem(hMainWnd,ImageBox1))
hImage=GetDlgItem(hMainWnd,ImageBox1)
'debug
End Sub
Sub MainWnd_Paint(hDC As DWord)
'描画先のImageBox1のデバイスコンテキストを求める この行をここにおかないとだめ
hDC=GetDC(GetDlgItem(hMainWnd,ImageBox1))
'⑥ 画像を描画 イメージを大きさを指定して 直接数値で
SetStretchBltMode( hDC, HALFTONE)
StretchBlt( hDC, 0, 0, 320, 240, hBuf, 0, 0, udtBitmap.bmWidth, udtBitmap.bmHeight, SRCCOPY)
End Sub
Sub MainWnd_CommandButton1_Click()
Dim buffer1[255] As Byte
lstrcpy(buffer1,"C:\image\402-291.bmp")
'ファイルのフルパスを表示
SetWindowText(GetDlgItem(hMainWnd,Static5),buffer1)
'イメージを表示
DispImage(buffer1)
'再描画要求を出す
InvalidateRect(hMainWnd,ByVal 0,1)
'InvalidateRect(hImage,ByVal 0,1)
End Sub
|