C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

モーダレスなメッセージボックス

こちらを取り組んでいるのですが、昨日 "上手く動くようになった"
と思い、今日実戦投入したのですが、上手く行かない所もあり・・・。
ファンネル - C#ATIA

何かしら手掛かりが得られないか? 探していたらこちらがHit。
Dimension text location while rerouting command - DASSAULT: CATIA products - Eng-Tips
結果的に何の解決にもならなかったのですが、記載されているコードが
どうやらモーダレスなメッセージボックスのようです。

64bitも利用できるようにし、関数化しました。

Option Explicit

#If VBA7 And Win64 Then
    Declare PtrSafe Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
        ByVal hWnd As Long, _
        ByVal lpText As String, _
        ByVal lpCaption As String, _
        ByVal uType As Long _
    ) As Integer
#Else
    Declare Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
        ByVal hWnd As Long, _
        ByVal lpText As String, _
        ByVal lpCaption As String, _
        ByVal uType As Long _
    ) As Integer
#End If

'WinAPI MessageBox
Private Function MsgBoxApi(ByVal prompt As String, _
                           Optional ByVal buttons As Long = vbOKOnly, _
                           Optional ByVal title As String = " ") As VbMsgBoxResult
    MsgBoxApi = MessageBox(&H0, prompt, title, buttons)
End Function

使う場合は標準モジュールじゃないとダメだと思います。

VBAのMsgBoxと引数の順番が異なっていたので、一緒にしてみました。
・・・VBAの方はもう2個オプション引数が有るのですが、まぁこの3個で
十分だろうと思ってます。
戻り値もVBAのMsgBoxと同じで恐らく大丈夫でしょう。

実際の使い方は

    MsgBoxApi "hoge"
    
    MsgBoxApi "hoge", vbYesNo + vbQuestion

    Dim fuga
    fuga = MsgBoxApi("hoge", vbYesNoCancel + vbExclamation, "piyo")

みたいに通常のMsgBoxと変わらず使えるのですが、これでは用意してまで
使う意味が有りません。

なので、こんなコードにすると通常のMsgBoxとの違いを感じます。

    MsgBoxApi "多分、僕は使わないけどね", vbOKOnly + vbSystemModal, "無責任"

実行するとこんな感じです。
f:id:kandennti:20181030182532p:plain
このダイアログを表示したまま、CATIAの操作が出来ます。
恐らく使うことは無いのですが。

本当は、こんな事を知りたかった訳じゃないのに。