tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル読み込んだ画像の縮小表示について
記事No16030
投稿日: 2014/11/28(Fri) 15:26
投稿者マサタロウ
VBは数年前から勉強しています。
ExcelのVBAの資格(APIなし最初の)を取得しています。

自作のビューアーで、以下のページの方法を利用して
読み込んだ画像を縮小表示させています。
  http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_29433_0.html


画像の縮小表示はうまくできましたが、縮小表示後に
画像の右と下に黒い線の様な部分が表示される場合があります。
表示されない場合もあります。

上記ページにある「SetBrushOrgEx」関数を使用しても変化ありません。
MIcrosoftのページで検索すると、「SetBrushOrgEx」関数は
「SetStretchBltMode」関数を呼び出したら「SetBrushOrgEx」関数を
呼び出すべきとあります。
  http://msdn.microsoft.com/ja-jp/library/cc410586.aspx


「SetBrushOrgEx」関数の使用方法が間違っているか確認したいです。


縮小表示は、ビューアーの画面より大きいサイズの画像ファイルを
読み込んだ場合のみ、ビューアーの画面内に収まるようにPictureBoxの
サイズを変更してから縮小表示しています。
ビューアー画面用のPictureBoxの中に縮小表示用のPictureBoxを
貼り付けて縮小表示させています。

↓API関数の宣言
Public Declare Function SetBrushOrgEx Lib "gdi32.dll" _
       (ByVal hdc As Long, ByVal nXOrg As Long, ByVal nYOrg As Long, _
       ByVal lppt As Long) As Long

↓関数のコード
ret = SetBrushOrgEx(Picture99.hdc, 0, 0, 0)
  … 変数"ret"は宣言セクションで宣言(Variant)

[ツリー表示へ]
タイトルRe: 読み込んだ画像の縮小表示について
記事No16034
投稿日: 2014/11/28(Fri) 22:15
投稿者花ちゃん
>上記ページにある「SetBrushOrgEx」関数を使用しても変化ありません。
ご使用の環境はどうなっていますか?
Win98 以前でしょうか?
Win 2000 以降は必要ないようですが。
因みに私は、SetBrushOrgEx を使用していませんが問題ありません。
(Win XP 以降で VB6.0(SP6) の環境で Win8.1 でも問題なくきれいに縮小表示されます)

> 「SetBrushOrgEx」関数の使用方法が間違っているか確認したいです。
関数の戻り値はどうなっていますか? 0 or 0 以外

事象を再現できるコードすべてを投稿して頂かないと...。

[ツリー表示へ]
タイトルRe^2: 読み込んだ画像の縮小表示について
記事No16036
投稿日: 2014/11/29(Sat) 18:42
投稿者マサタロウ
マサタロウです。
コードと戻り値は後で返信します。


> ご使用の環境はどうなっていますか?
OS Win Vista
開発環境 Microsoft Virtual PC Win XP Visual Basic Learning Edition Version 5.0


> Win 2000 以降は必要ないようですが。
SetBrushOrgEx が原因ではなさそう・・・

[ツリー表示へ]
タイトルRe^3: 読み込んだ画像の縮小表示について
記事No16037
投稿日: 2014/11/30(Sun) 11:16
投稿者マサタロウ
どうも。

縮小表示の時に画像サイズの複数の条件により同様のコードがある為、
画像サイズが縦横ビューアーの画面より大きい場合のコードを記述します。

しかし、投稿用のコードを作成するために新しくプロジェクトを作成して
以下のコードを実行してみると、自作のビューアーと以下のコードで
同じサイズの画像ファイルを開いた時に以下の場合は線が表示されません
でした。また、開発環境のXPで自作のビューアーで確認したら線が表示
されませんでした。以下のコードはVista、Xpともに線が表示されません
でした。

・APIは追加したモジュールファイルに宣言。

・PictureBoxのMouseUpイベントでコモンダイアログを呼び出して
 ファイルパスを取得、別プロシージャにあるコードをCallで呼び出す。

・呼び出されたプロシージャで、Image1に画像を表示し、縮小表示させる
 別プロシージャを呼び出す。


Dim ret As Variant '宣言セクションで宣言


Private Sub Picture4_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

   CommonDialog1.DialogTitle = "ファイルを開く"
   CommonDialog1.filename = ""
   CommonDialog1.Filter = "画像ファイル(*.gif;*.jpg;*.png;*.ico;*.bmp)|*.gif;*.jpg;*.png;*.ico;*.bmp"
   CommonDialog1.Flags = cdlOFNHideReadOnly

   CommonDialog1.ShowOpen
   Call mF_FOPEN

End Sub


Sub mF_FOPEN()

   Image1.Picture = LoadPicture(CommonDialog1.filename)

   Call mG_Window

End Sub

Sub mG_Window()

Dim P(1) As Long

   P(0) = Image1.Width
   P(1) = Image1.Height

   Image1.Stretch = False

   If Image1.Height > Picture1.Height And Image1.Width > Picture1.Width Then

      Picture2.Height = Image1.Height
      Picture2.Width = Image1.Width

      If Picture2.Height >= Picture2.Width Then

         For mShuku1 = 1 To Image1.Height
             P(1) = P(1) / 1.1
             If P(1) < Picture1.Height Then
                Image1.Height = P(1)
                Exit For
             End If
         Next
         For mShuku2 = 1 To Image1.Width
             P(0) = P(0) / 1.1
             Image1.Width = P(0)
             If mShuku2 = mShuku1 Then
                If Image1.Width > Picture1.Width Then
                   For mShuku1 = 1 To Image1.Width
                       P(0) = P(0) / 1.1
                       P(1) = P(1) / 1.1
                       Image1.Width = P(0)
                       Image1.Height = P(1)
                       If Image1.Width < Picture1.Width Then Exit For
                   Next
                End If
                Exit For
             End If
         Next

         Picture2.Picture = Image1
         Picture3.Height = Image1.Height
         Picture3.Width = Image1.Width
         ret = SetStretchBltMode(Picture3.hdc, HALFTONE)
         ret = StretchBlt(Picture3.hdc, 0, 0, Picture3.Width, Picture3.Height, _
               Picture2.hdc, 0, 0, Picture2.Width, Picture2.Height, SRCCOPY)
         ret = SetBrushOrgEx(Picture3.hdc, 0, 0, 0)

         MsgBox ret 'ret = 1

         Image1.Top = (Picture1.Height - Image1.Height) / 2 '画像を中央にする。
         Image1.Left = (Picture1.Width - Image1.Width) / 2  '画像を中央にする。
         Picture3.Top = Image1.Top
         Picture3.Left = Image1.Left
         Picture3.Refresh

      End If

   End If

End Sub

[ツリー表示へ]
タイトルRe^4: 読み込んだ画像の縮小表示について
記事No16045
投稿日: 2014/12/09(Tue) 14:51
投稿者マサタロウ
どうも。

Vistaで自作のビューアーを実行すると、線が表示されるのが直りません。

以下のページで公開しているビューアーです。
http://www29.atwiki.jp/maskla/pages/1.html

[ツリー表示へ]
タイトルRe^5: 読み込んだ画像の縮小表示について
記事No16046
投稿日: 2014/12/09(Tue) 18:07
投稿者魔界の仮面弁士
> 以下のページで公開しているビューアーです。
> http://www29.atwiki.jp/maskla/pages/1.html

見つけるのに苦労しましたが、「The viewer.zip」のことでしょうか(違っていたら済みません)。

ランタイムの配布方法に問題がありますが、それは本題では無いので目を瞑るとして:
(COMDLG32.OCX や VB5STKIT.DLL は、EXE に同梱するだけでは NG)

VB5 のソースコードが含まれているわけでは無いのだとしたら、
たとえ現象が発生したとしても、EXE からの追跡は難しそうです。

[ツリー表示へ]