Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2013)
UserFormに配置したコントローラーの形状について
投稿日時: 18/01/29 06:54:01
投稿者: さむさむ

WebBrowserの背景について では大変お世話になりました。ありがとうございました。
 
今回のご質問はUserFormに配置した、Frame、Labelなどのコントローラを丸く作る方法についてです。
 
UserFormを丸く作ることはわかっているのですが、UserFormに配置したコントローラの場合はどうすればいいでしょうか。
 
ご教示をお願いします。
 
使わさせていただいているコードを置きます。
Private Sub UserForm_Initialize()
    Dim OvalSet As Long, rc As Long, hWnd As Long
    hWnd = FindWindowA("ThunderDFrame", Me.Caption)
    OvalSet = CreateEllipticRgn(5, 5, 30, 20)
    rc = SetWindowRgn(hWnd, OvalSet, True)
    kFormNonCaption Me, True
End Sub
’標準モジュール
Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _
                                            ByVal hRgn As Long, _
                                            ByVal bRedraw As Boolean) As Long
 
Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, _
                                                ByVal Y1 As Long, _
                                                ByVal X2 As Long, _
                                                ByVal Y2 As Long) As Long
 
Declare Function FindWindowA Lib "user32" (ByVal clpClassName As String, _
                                           ByVal lpWindowName As String) As Long
                                            
                                            
'*******************************
Private Declare Function WindowFromObject Lib "oleacc" Alias "WindowFromAccessibleObject" _
 (ByVal pacc As Object, phwnd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
 (ByVal hWnd As Long, ByVal nIndex As Long) As Long
 Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
 (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Const GWL_STYLE = (-16&)
Const GWL_EXSTYLE = (-20&)
Const WS_CAPTION = &HC00000
Const WS_EX_DLGMODALFRAME = &H1&
 
 'kFormNonCaption関数
'ユーザーフォームのタイトルバー非表示
'引数:uf ユーザーフォーム
' flat True=フラットなウィンドウにする(枠無し)
'戻値:0=失敗 0<>成功 変更前のウィンドウスタイルの値
Function kFormNonCaption(ByVal uf As Object, Optional ByVal flat As Boolean) As Long
 Dim wnd As Long, ih#
 ih = uf.InsideHeight
 WindowFromObject uf, wnd
 If flat Then SetWindowLong wnd, GWL_EXSTYLE, GetWindowLong(wnd, GWL_EXSTYLE) And Not WS_EX_DLGMODALFRAME
 kFormNonCaption = SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) And Not WS_CAPTION)
 DrawMenuBar wnd
 uf.Height = uf.Height - uf.InsideHeight + ih
End Function

回答
投稿日時: 18/01/29 10:53:17
投稿者: WinArrow
投稿者のウェブサイトに移動

一つの考え方です。
 
シートでオートシェイプを作成し
ユーザーフォームのコントロールのpIctureに貼り付ける。
その時コントロールの背景色を「透明」に設定する。

投稿日時: 18/01/29 19:07:36
投稿者: さむさむ

WinArrowさん ありがとうございます。
イメージコントローラへの画像ファイルも検討したのですが、WebBowserコントローラのZorderが前面になり調整できず、WebBowserコントローラがイメージの上に被さってしまい、無理の様です。」
FrameだとZorderが使えるのですが、透明化ができないというジレンマです 。
 

回答
投稿日時: 18/02/05 01:24:46
投稿者: Abyss2

> コントローラを丸く作る方法についてです
  
(1)Windowハンドルを持つコントロールならば、Custom DrawかOwnerDrawで
   好みの外形にすることが可能です。しかし、すべてOSの力を借りての作業に
   なります。つまり、Windowsメッセージの適時適所への適用が必須です。
  
(2)さらに難しい事は、MSFormの部品ほとんどは(MSの戦略だと思いますが)、
   Windowsハンドルを持っていない。(すべてWindowless関連のInterface経由で
   Formクラスが管理・制御しているのです。)コレに割り込むにはさらなる
   知識が要求されます。
  
ここまで至ると、私ならユーザーフォーム上に実現することを諦めます。
代わりに、別ツールを使い "Compileされ、ユーザーに邪魔されない" Windowを制作し、
それをExcel上に表現する方法を選択しますね。今ならC#なりVB.Netで割と簡単に
そう言ったFormが作れますし、情報も溢れるほど存在しますので。

投稿日時: 18/02/07 20:31:53
投稿者: さむさむ

Abyss2 さん ありがとうございます。
C等の知識がないので、いつもご提示を何とか環境に適用させようと苦心してきました。
確かに上級の知識の獲得を求めるべきですね。
ありがとうございました。
皆さんのご指摘をありがたくいただき、この質問はいったん解決にさせていただきます。