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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VBAでTIFF画像を読み込むには?
Visual Basic(VBA)
-
VBAでJPGサイズ変更
Visual Basic(VBA)
-
ファイルをメモリに出力する方法
Visual Basic(VBA)
-
-
4
stdpicture型の変数に、、
Visual Basic(VBA)
-
5
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
6
8bitインデックス画像の入出力方法
Visual Basic(VBA)
-
7
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
UpdateData( FALSE); による文...
-
NVIDIAのシェーダーキャッシュ
-
vc++のpictureboxにopenGLの画...
-
ブレゼンハムのアルゴリズムに...
-
CStaticコントロールの静的イメ...
-
GDI+について
-
MFC ビットマップ描画で残像が残る
-
画像の印刷について
-
[VB.net] DataGridViewの列ヘッ...
-
VB6,リストボックスの特定行の...
-
領域の塗りつぶし
-
TextBoxに文字を書いても表示さ...
-
SHGetFileInfoでアイコンが取得...
-
WM_PAINTとWM_MOVEで同じ事をし...
-
デスクトップに字を書く?
-
C++にて、塗りつぶされた円を描...
-
Windowのちらつき防止
-
OneNote 2010 文字と描画がずれる
-
C言語(dxlib)のDrawboxについ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
OneNote 2010 文字と描画がずれる
-
StretchBlt関数について
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
GDI+で高速な描画
-
MFC DrawText 背景色とフォント
-
FlexGridの一部のみ表示を更新...
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
おすすめ情報