バーコードのイメージ化

解決


ビラチン  2004-07-09 11:56:11  No: 84492  IP: [192.*.*.*]

開発環境はwindowsXP  VB6.0

BarCodeCtrlを使用してバーコードを作成しております。
BarCodeCtrlで作成した物をクリップボードにコピーする場合は
どうやったらよろしいでしょうか!?
イメージ化の方法など探して見たのですが全然わかりませんでした。

よろしくお願いします。

編集 削除
Max  2004-07-09 21:44:12  No: 84493  IP: [192.*.*.*]

Delphiのサンプルコードならありました。
http://forum.nifty.com/fdelphi/samples/01210.html

VBでも大体同じ手順で出来ると思います。

BarCodeCtrlのウィンドウハンドルからデバイスコンテキストを取得し
他のピクチャボックス等にBitBltでコピーしてやればできるんじゃ
ないでしょうか?

現在Access2000が入っていないので試してませんが。

編集 削除
ビラチン  2004-07-12 19:51:34  No: 84494  IP: [192.*.*.*]

Maxさんありがとうございます。

サンプルコードを見ながらやってみましたが
いまいち、うまくいきませんでした。
もう少し細かくアドバイスをいただけませんでしょうか?
よろしくお願いします。

編集 削除
Max  2004-07-12 22:01:28  No: 84495  IP: [192.*.*.*]

手元にBarcodeCtrlがないのでなんともいえませんが。。。
作ってみたコードとかを掲載してもらえると何か指摘できるかもしれません。

編集 削除
ビラチン  2004-07-13 10:54:02  No: 84496  IP: [192.*.*.*]

BitBlt Picture1.hDC, 0, 0, 100, 100, BarCodeCtrl1.hDC, 0, 0, vbSrcCopy

bitbltの使い方はわかったのですがBarCodeCtrlの
デバイスコンテキストの取得の仕方がわからず苦戦しております。
    DC = GetDC(BarCodeCtrl1.Handle.ToInt32)
    DC = GetDC(BarCodeCtrl1.Handle)
などGETDC関数での取得ができずに困っています。

編集 削除
Max  2004-07-14 12:20:02  No: 84497  IP: [192.*.*.*]

>BarCodeCtrlのデバイスコンテキスト
BarCodeCtrl1.hDCじゃないですか?

編集 削除
ビラチン  2004-07-14 13:24:07  No: 84498  IP: [192.*.*.*]

BarCodeCtrl1.hDCでは、実行時エラー438オブジェクトは、このプロパティまたは、メソッドをサポートしてませんとでてしまって、それでGETDCを使用してデバイスコンテキストを取得するのかなと思い調べていました。

編集 削除
魔界の仮面弁士  2004-07-14 15:56:18  No: 84499  IP: [192.*.*.*]

> BarCodeCtrlを使用してバーコードを作成しております。
どちらのコントロールをお使いですか?
VB6には、BarCodeCtrl というコントロールは付属していませんよね。

もしかして、Accessに付属のバーコードコントロールだったりはしませんか?

# Accessのバーコードコントロールは、Access製アプリのためのものであり、
# VB6の「再頒布可能ファイル」には含まれていないので、注意してください。
http://support.microsoft.com/default.aspx?scid=kb;JA;813744

>     DC = GetDC(BarCodeCtrl1.Handle.ToInt32)
.Handle.ToInt32 …それは、.NETの場合のコードなのでは。

> BarCodeCtrlで作成した物をクリップボードにコピーする場合は
> どうやったらよろしいでしょうか!?
とりあえず、OleDraw API で、デバイスコンテキストに描画してみるとか。
それでも駄目なら、KBの161299あたりを参考にして、画面イメージを取り込むとか。。。

編集 削除
ビラチン  2004-07-16 11:08:54  No: 84500  IP: [192.*.*.*]

>どちらのコントロールをお使いですか?
はい。Accessのバーコードコントロールの使用しております。

OleDraw API を調べてみましたが、
BarCodeCtrlのウィンドウハンドルが必要な事にぶちあたりました。
BarCodeCtrl以外にバーコードを表示する以外ないのでしょうか?

ここまで難しいものなのかと困惑しております。

編集 削除
魔界の仮面弁士  2004-07-16 12:58:59  No: 84501  IP: [192.*.*.*]

> BarCodeCtrlのウィンドウハンドルが必要な事にぶちあたりました。
? ウィンドウハンドルは必要ないと思いますけど…。

OleDraw APIに渡すのは、 

第1引数: 描画対象のコントロール(のObjectプロパティ)
第2引数: DVASPECT列挙定数
第3引数: 描画先のデバイスコンテキストハンドル
第4引数: 描画領域を示すRECT構造体

ですよね。ウィンドウハンドルの指定は無いような。

Option Explicit

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Enum DVASPECT
    DVASPECT_CONTENT = 1
    DVASPECT_THUMBNAIL = 2
    DVASPECT_ICON = 4
    DVASPECT_DOCPRINT = 8
End Enum

'第1引数は、As IUnknownでもOKかな。
Private Declare Function OleDraw Lib "ole32" _
   (ByVal pUnk As Object, _
    ByVal dwAspect As DVASPECT, _
    ByVal hdcDraw As OLE_HANDLE, _
    ByRef lprcBounds As RECT) As Long

Private Sub Form_Load()
    BarCodeCtrl1.Value = "4904447003500"   '適当なJANコード
End Sub

Private Sub Command1_Click()
    Dim R As RECT
    R.Right = 200
    R.Bottom = 80
    Dim H As Long
    H = OleDraw( _
            BarCodeCtrl1.Object, _
            DVASPECT_CONTENT, _
            Picture1.hDC, _
            R _
        )
    If H <> 0 Then
        Err.Raise H
    End If
End Sub


> BarCodeCtrl以外にバーコードを表示する以外ないのでしょうか?
当方では、市販のバーコードフォントを使っています。

編集 削除
ビラチン  2004-07-16 14:48:25  No: 84502  IP: [192.*.*.*]

魔界の仮面弁士さん。ありがとうございます。

ピクチャーに表示することができました。
これで、後はうまくいくはずでしたが
このピクチャーをクリップボードに貼り付けることができませんでした。
    Clipboard.SetData Picture1.Picture
ではコピーすることができませんでした。
これはBMPではないからでしょうか?

編集 削除
nanashi  2004-07-16 15:23:03  No: 84503  IP: [192.*.*.*]

試してませんが

Clipboard.SetData Picture1.Image

とかではどうでしょう?

編集 削除
ビラチン  2004-07-16 15:43:46  No: 84504  IP: [192.*.*.*]

nanashiさんありがとうございます。

先ほど記述した後試してみましたが、
外枠だけがコピーされた状態になってしまいました。

編集 削除
魔界の仮面弁士  2004-07-16 16:59:31  No: 84505  IP: [192.*.*.*]

AutoRedrawプロパティがFalseになっていませんか?

編集 削除
ビラチン  2004-07-20 13:15:11  No: 84506  IP: [192.*.*.*]

AutoRedrawをTrueではバーコードを貼り付ける事ができなく
Falseで行っています。
バーコードを貼り付けた後にTureにしても結果は同じで
外枠だけがコピーされる状態になってしまいます。

編集 削除
魔界の仮面弁士  2004-07-20 14:06:42  No: 84507  IP: [192.*.*.*]

> バーコードを貼り付けた後にTureにしても結果は同じで
> 外枠だけがコピーされる状態になってしまいます。
Imageプロパティにて取得できるのは、
AutoRedraw = True 状態の時に描画された内容だけです。

False状態の時に描画しても、BackColor/Pictureで設定された
背景色/画像しか出力されませんよ。

以下、VB6のヘルプより: 《Image プロパティ》
| 継続表示属性を持つグラフィックスに対応するハンドルを返します。
| ハンドルの値は、Microsoft Windows によって自動的に設定されます。
(中略)
| AutoRedraw プロパティが真 (True) に設定されていて、描画された
| グラフィックスが存在しない場合は、BackColor プロパティで
| 設定された色とピクチャだけが表示されます。


> AutoRedrawをTrueではバーコードを貼り付ける事ができなく

…できませんでしたか? 実際、当方で試してみて、画像をペイントに
クリップボードに貼り付けられる事を確認しているのですが。。。
(なお、PictureBoxは Visible = False でも OK のはずです)

    If H = 0 Then
        Clipboard.Clear
        Clipboard.SetData Picture1.Image, vbCFBitmap
    Else
        Err.Raise H
    End If



ところで、AutoRedraw = True の場合、APIで描いた内容は、
画面には反映されないのですが、その事は認識しておられますか?

APIによる描画の場合、VBのメソッドで描画した時と違って、
「描画した」という通知が、PictureBoxに渡されないため
Picture1.Refresh を呼び出すなどして、強制的/暗黙的に再描画を
指示しないと、画面には反映されません。

しかし、画面に反映されずとも、デバイスコンテキストには
反映されていますので、Refreshせずとも、
  Clipboard.SetData Picture1.Image, vbCFBitmap
を使うことはできるはずです…が、どうしても駄目だった、という事であれば、
その前に回答した、次案の「KBの161299」を試して見てください。


》 魔界の仮面弁士 2004/07/14(水) 15:56:18
> とりあえず、OleDraw API で、デバイスコンテキストに描画してみるとか。
> それでも駄目なら、KBの161299あたりを参考にして、画面イメージを取り込むとか。。。

編集 削除
ビラチン  2004-07-20 16:38:41  No: 84508  IP: [192.*.*.*]

魔界の仮面弁士さん、ありがとうございます。
画面に反映されない事を認識しておりませんでした。

魔界の仮面弁士の言われた通りにやったら
クリップボードにコピーする事ができました。
本当にありがとうございました。

編集 削除