ab.com コミュニティ https://www.activebasic.com/forum/ |
|
イメージボックスへのビットマップの表示について(2) https://www.activebasic.com/forum/viewtopic.php?t=2596 |
ページ 1 / 1 |
作成者: | jacoby [ 2009年10月05日(月) 00:02 ] |
記事の件名: | イメージボックスへのビットマップの表示について(2) |
イメージボックスへのビットマップの表示について(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)を選択して下さい。 下記プログラム中、質問の該当部分は 「●ビットマップファイルの読み込み」サブ内にあります。 ここにプログラムが表示されます。 [ここをクリックすると内容が表示されます]
コード: '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [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 |
作成者: | HSABP [ 2010年10月24日(日) 14:41 ] |
記事の件名: | |
イメージボックスのDCにBitBltしたらいいんじゃね? |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |