開発環境はwindowsXP VB6.0
BarCodeCtrlを使用してバーコードを作成しております。
BarCodeCtrlで作成した物をクリップボードにコピーする場合は
どうやったらよろしいでしょうか!?
イメージ化の方法など探して見たのですが全然わかりませんでした。
よろしくお願いします。
Delphiのサンプルコードならありました。
http://forum.nifty.com/fdelphi/samples/01210.html
VBでも大体同じ手順で出来ると思います。
BarCodeCtrlのウィンドウハンドルからデバイスコンテキストを取得し
他のピクチャボックス等にBitBltでコピーしてやればできるんじゃ
ないでしょうか?
現在Access2000が入っていないので試してませんが。
Maxさんありがとうございます。
サンプルコードを見ながらやってみましたが
いまいち、うまくいきませんでした。
もう少し細かくアドバイスをいただけませんでしょうか?
よろしくお願いします。
手元にBarcodeCtrlがないのでなんともいえませんが。。。
作ってみたコードとかを掲載してもらえると何か指摘できるかもしれません。
BitBlt Picture1.hDC, 0, 0, 100, 100, BarCodeCtrl1.hDC, 0, 0, vbSrcCopy
bitbltの使い方はわかったのですがBarCodeCtrlの
デバイスコンテキストの取得の仕方がわからず苦戦しております。
DC = GetDC(BarCodeCtrl1.Handle.ToInt32)
DC = GetDC(BarCodeCtrl1.Handle)
などGETDC関数での取得ができずに困っています。
>BarCodeCtrlのデバイスコンテキスト
BarCodeCtrl1.hDCじゃないですか?
BarCodeCtrl1.hDCでは、実行時エラー438オブジェクトは、このプロパティまたは、メソッドをサポートしてませんとでてしまって、それでGETDCを使用してデバイスコンテキストを取得するのかなと思い調べていました。
編集 削除> 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あたりを参考にして、画面イメージを取り込むとか。。。
>どちらのコントロールをお使いですか?
はい。Accessのバーコードコントロールの使用しております。
OleDraw API を調べてみましたが、
BarCodeCtrlのウィンドウハンドルが必要な事にぶちあたりました。
BarCodeCtrl以外にバーコードを表示する以外ないのでしょうか?
ここまで難しいものなのかと困惑しております。
> 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以外にバーコードを表示する以外ないのでしょうか?
当方では、市販のバーコードフォントを使っています。
魔界の仮面弁士さん。ありがとうございます。
ピクチャーに表示することができました。
これで、後はうまくいくはずでしたが
このピクチャーをクリップボードに貼り付けることができませんでした。
Clipboard.SetData Picture1.Picture
ではコピーすることができませんでした。
これはBMPではないからでしょうか?
試してませんが
Clipboard.SetData Picture1.Image
とかではどうでしょう?
nanashiさんありがとうございます。
先ほど記述した後試してみましたが、
外枠だけがコピーされた状態になってしまいました。
AutoRedrawプロパティがFalseになっていませんか?
編集 削除AutoRedrawをTrueではバーコードを貼り付ける事ができなく
Falseで行っています。
バーコードを貼り付けた後にTureにしても結果は同じで
外枠だけがコピーされる状態になってしまいます。
> バーコードを貼り付けた後に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あたりを参考にして、画面イメージを取り込むとか。。。
魔界の仮面弁士さん、ありがとうございます。
画面に反映されない事を認識しておりませんでした。
魔界の仮面弁士の言われた通りにやったら
クリップボードにコピーする事ができました。
本当にありがとうございました。