
No.3ベストアンサー
- 回答日時:
#2です。
煩雑なので、API宣言はPublicにして標準モジュールに置く事にします。
C言語ならヘッダーファイルに持っている情報をVBAでは自前で宣言してやる必要がありますので、面倒くさいです。
Public Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Public Type PICTDESC
cbSizeofstruct As Long
picType As Long
hbitmap As Long
hpal As Long
unused_wmf_yExt As Long
End Type
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type POINTAPI
x As Long
y As Long
End Type
Public Type LOGPEN
lopnStyle As Long
lopnWidth As POINTAPI
lopnColor As Long
End Type
Public Const PICTYPE_BITMAP = 1
Public Const SRCCOPY = &HCC0020
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib "gdi32" _
(ByVal hdc As Long, ByVal nWidth As Long, _
ByVal nHeight As Long) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function CreatePenIndirect Lib "gdi32" (lpLogPen As LOGPEN) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long
Public Declare Function OleCreatePictureIndirect Lib "olepro32" _
(lpPictDesc As PICTDESC, riid As GUID, _
ByVal fOwn As Long, lplpvObj As Object) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hgdiobj As Long) As Long
Public Declare Function WindowFromAccessibleObject Lib "oleacc.dll" _
(ByVal IAcessible As Object, ByRef hWnd As Long) As Long
No.2
- 回答日時:
昔作成したのをアレンジしてみました。
GDI+でなくて、GDIを使います。というか、WindowsAPIですが。
APIでUserFormに描画する場合、ウィンドウが隠れると描画したものが消えてしまうという問題があります。Windowsの再描画のメッセージをキャッチして、自前で再描画させる方法もありますが、VBAでは処理速度が追いつかない等課題があります。ここではPictureに変換して書き戻すことで、Pictureの再描画の機能を利用しています。コマンドボタン等もひっくるめて絵になってしまう訳ですが、少し試した限りでは問題なく動作する様です。
UserFormモジュールに記述します。APIの宣言は別途投稿します。
Private Sub UserForm_activate()
Dim pic As StdPicture
Dim rc As RECT
Dim hwndForm As Long
Dim hdcForm As Long
Dim hdc As Long
Dim hbmp As Long
Dim hbmpOld As Long
Dim hNewPen As Long
Dim hOldPen As Long
Dim NewPen As LOGPEN
WindowFromAccessibleObject Me, hwndForm
Me.Repaint
GetClientRect hwndForm, rc
hdcForm = GetDC(hwndForm)
hdc = CreateCompatibleDC(hdcForm)
hbmp = CreateCompatibleBitmap(hdcForm, rc.Right, rc.Bottom)
hbmpOld = SelectObject(hdc, hbmp)
'UserFormのクライアント領域をメモリ上のビットマップに複写
BitBlt hdc, 0, 0, rc.Right, rc.Bottom, hdcForm, 0, 0, SRCCOPY
ReleaseDC hwndForm, hdcForm
'メモリ上のビットマップに描画
NewPen.lopnColor = vbRed
NewPen.lopnWidth.x = 10
hNewPen = CreatePenIndirect(NewPen)
hOldPen = SelectObject(hdc, hNewPen)
Call MoveToEx(hdc, 10, 10, Null)
Call LineTo(hdc, 10, rc.Bottom - 10)
Call LineTo(hdc, rc.Right - 10, rc.Bottom - 10)
Call LineTo(hdc, rc.Right - 10, 10)
Call LineTo(hdc, 10, 10)
hNewPen = SelectObject(hdc, hOldPen)
DeleteObject hNewPen '
SelectObject hdc, hbmpOld
DeleteDC hdc
Set pic = GetPictureObject(hbmp)
If pic Is Nothing Then DeleteObject hbmp
'メモリ上のビットマップをPictureに変換してUserFormに設定
Set Me.Picture = pic
' Me.Repaint
End Sub
'====================================================
' HBITMAPからPictureオブジェクトを作成する関数
Private Function GetPictureObject(ByVal hbmp As Long) As Object
Dim iid As GUID
Dim pd As PICTDESC
If hbmp = 0 Then Exit Function
With iid
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With pd
.cbSizeofstruct = Len(pd)
.picType = PICTYPE_BITMAP
.hbitmap = hbmp
End With
OleCreatePictureIndirect pd, iid, 1, GetPictureObject
End Function
参考URL:http://homepage1.nifty.com/rucio/main/tyukyu/tyu …


No.1
- 回答日時:
System.Drawing.dll って .NET Framework 用のライブラリでしょ。
VBA 用じゃありません。
使ったことはないですが、こんなのがあるようです。
http://www.f3.dion.ne.jp/~element/msaccess/AcTip …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【エクセルのマクロ】クリップボードのbitmapをフォームに表示させたい
Visual Basic(VBA)
-
VBAでpng画像に文字列を描画する方法
Visual Basic(VBA)
-
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
-
4
特定のシートのみ再計算させない方法は?
Excel(エクセル)
-
5
VBA内でのGetPixelを使用した時のRGB値取得の方法
その他(プログラミング・Web制作)
-
6
画像のピクセルデータの取得
Visual Basic(VBA)
-
7
オートシェイプをJPG保存
Visual Basic(VBA)
-
8
VBAでJPGサイズ変更
Visual Basic(VBA)
-
9
VBAでCSVファイルが使用中かどうかの確認
Visual Basic(VBA)
-
10
エクセル ユーザーフォームにオートシェープ(図形)を貼り付けるこは可能なのでしょうか?
Excel(エクセル)
-
11
VBAで配列からbmp画像を出力する方法
Visual Basic(VBA)
-
12
EXCEL VBA 複数のImageコントロールにクリップボードに保存されている画像を表示したい
Visual Basic(VBA)
-
13
Microsoft VBAで2GBを超えるファイルサイズのバイナリデータを読み込みたい。
Visual Basic(VBA)
-
14
bmp画像をjpegやpng画像に圧縮する方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
VB.netでのライン描画方法がわ...
-
google Colabでmatplotlibの描...
-
GDI+について
-
エクセルで描画出来なくなります。
-
DirectXでの変数の表示について
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
ワードの図形で重なり部分の色...
-
エクセルで作った新しいウイン...
-
UWSCで特定のChromeのタブをア...
-
グラフの交点の求め方(Excel)
-
リソースファイルとは・・・
-
コントロールの書式設定で、“コ...
-
スピンボタンを右クリックして...
-
「アイテムは収集されました」...
-
VB.Net Tabコントロール中のす...
-
コンボボックス内の文字サイズ変更
-
ゲームでは結局どっちが良いの?
-
リストビューのハンドルについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
panelのスクロール表示について
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
CScrollViewの使用方法について
-
GDI+について
-
VC++プログラムをつかったBMP画...
-
ウインドウサイズを変更しても...
-
VB6,リストボックスの特定行の...
-
タブをオーナードローすると、...
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
C++にて、塗りつぶされた円を描...
おすすめ情報