
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Excel(エクセル) エクセルで対象日に該当するデータがある場合に別表へ全対象者を表示させたい。 3 2023/07/12 09:48
- その他(プログラミング・Web制作) Pythonでexcelのvbaを作成、実行する方法について Pythonで表の自動集計プログラムを 3 2022/07/09 09:58
このQ&Aを見た人はこんなQ&Aも見ています
-
【エクセルのマクロ】クリップボードのbitmapをフォームに表示させたい
Visual Basic(VBA)
-
VBAでpng画像に文字列を描画する方法
Visual Basic(VBA)
-
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
-
4
ファイルが開かれているかどうかの判断
Visual Basic(VBA)
-
5
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
6
VBA内でのGetPixelを使用した時のRGB値取得の方法
その他(プログラミング・Web制作)
-
7
VBAでCSVファイルが使用中かどうかの確認
Visual Basic(VBA)
-
8
VBAでJPGサイズ変更
Visual Basic(VBA)
-
9
どこにもフォーカスを当てたくない
Access(アクセス)
-
10
GDI+を使ったビット数とDPIの扱い
Visual Basic(VBA)
-
11
Microsoft VBAで2GBを超えるファイルサイズのバイナリデータを読み込みたい。
Visual Basic(VBA)
-
12
画像のビット数を変更する方法
Visual Basic(VBA)
-
13
VBAで配列からbmp画像を出力する方法
Visual Basic(VBA)
-
14
EXCEL VBA 複数のImageコントロールにクリップボードに保存されている画像を表示したい
Visual Basic(VBA)
-
15
2値化した画像の黒い部分のピクセル数をカウントするプログラムを組みたいのですが、どのように組めば良い
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
C言語・Windows RECTが渡せない
-
ウインドウサイズを変更しても...
-
VC++プログラムをつかったBMP画...
-
google Colabでmatplotlibの描...
-
ClistBoxでオーナードローがよ...
-
panelのスクロール表示について
-
矢印を描画するには
-
DirectX9.0での四角形の描画に...
-
DirectXで曲面の描画
-
vb.netでテキストボックス内の...
-
CStaticコントロールの静的イメ...
-
DirectXの表示領域
-
Labelの文字をスクロールする際...
-
DirectXとGDIの違い
-
ローディング画面をマルチスレ...
-
楕円を描くプログラミング
-
画像を重ねて動かすと重くなり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報