Option Strict Off
Option Explicit On
'------------------------------------ 2024/04/01 ------------------------------------
Module 五basゲーム専用共有
    '********************************************************************************
    '2022/10/22  ゲーム関連の共有、変数、定数、関数、群
    '********************************************************************************
#Region "宣言"
    '********************************************************************************
    Public gm共有画像フォルダ As String = ""  '共有画像 の フォルダ
    Public gmリリースAppPath As String = ""  'アプリの　リリース EXE ( AppIni, CUR, WAV, BMP )  の場所　デバッグ時も有効　( 変換済み )
    Public gmヘルプファイル As String = ""     'ヘルプファイル名 =    "ヘルプファイル\@@@@@@@@@@@@@@@@@@@@@@@@.html"
    Public gmヘルプファイルCSS As String = ""  'ヘルプファイルCSS名 = "ヘルプファイル\■ユーザーお好み書体設定■.css"
    Public gmカーソルファイル As String = ""   'カーソルファイル名 
    Public gmサウンドあたり As String = ""
    Public gmサウンドハズレ As String = ""
    '********************************************************************************
    Public gmスイスイ共用クラス As 五clsスイスイ = Nothing '2022/0812  他のアプリで共有クラスを使用するためのエイリアス
    '********************************************************************************
    Public gggAppIniFile As 五clsAppINI = Nothing      'アプリの　Public.Bas　モジュールで宣言
    Public gmComFileBmp As 五clsPctFileOpenWithBuff = Nothing
    '********************************************************************************
    Public gmflag_FrmMain_LoadEnd As Boolean = False
    Public gmアプリ終了する As Boolean = False
    Public gmゲーム実行中_in_MouseEvent As Boolean = False
    Public gmゲーム実行中_in_MouseUp_処理中 As Boolean = False
    '********************************************************************************
    Public gmDlgゲームカード型を設定_は_ゲーム開始時には表示されている As Boolean = False
    '********************************************************************************
    Public gmFlag_On_OLEDropFile As Boolean = False
    '***************************************************************************
    Public Const gmDlgFileゲーム用 As Integer = 5540
    Public Const gmDlgFileスイスイ用 As Integer = 5541
    Public Const gmDlgスイスイユラユラ As Integer = 5542
    Public Const gmDlgオプション設定 As Integer = 5543
    Public Const gmDlgサウンド設定 As Integer = 5545
    Public Const gmDlgゲームカードサイズ設定 As Integer = 5560        'use only in ピタペタ
    Public Const gmDlgユーザーカードの編集 As Integer = 5555
    '***************************************************************************
    '四frmDlgUseCardSelect
    Public Const gmDlgゲームカード型を設定 As Integer = 5561          'use only in ピタペタ
    Public Const gmDlgスイスイカード型を設定 As Integer = 5562        'use only in ピタペタ
    Public Const gmDlgかなカナカード型を設定 As Integer = 5563        'use only in かなカナ
    Public Const gmDlgカードショーカード型を設定 As Integer = 5564    'use only in かなカナ
    Public Const gmDlgカード型を設定の色設定 As Integer = 5566
    Public Const gmDlgかなカナゲーム用カード型選択変更 As Integer = 5567
    '***************************************************************************
    Public Const appDlgFileカード用 As Integer = 5570                'use only in かなカナ
    Public Const gmDlgカードショーオプション As Integer = 5571        'use only in かなカナ
    '***************************************************************************
    Public Const gmDlgウロウロミックスモード設定 As Integer = 5580        'use only in ウロウロ
    Public Const gmDlgウロウロゲーム用カード型選択変更 As Integer = 5581  'use only in ウロウロ
    Public Const gmDlg色とフォントの設定Dlg As Integer = 5582            'use only in ウロウロ
    Public Const gmDlgウロウロオプション設定Dlg As Integer = 5583        'use only in ウロウロ
    Public Const gmDlg背景画像ユラユラ設定Dlg As Integer = 5584          'use only in ウロウロ
    Public Const gmDlgアイコン設定Dlg As Integer = 5585                  'use only in ウロウロ
    Public gmFlagアイコン設定Dlg_Load_Is_TMP As Boolean = False
    Public gmゲーム結果パネル表示が消去された As Boolean = False
    Public gm使用するmn8スイスイ用カード型を設定 As Boolean = False
    '***************************************************************************
    Public WithEvents gAppEventMaker As 五clsEventMaker
    '***************************************************************************
    Public gmスイスイカードイメージ変更された As Boolean
    Public gmスイスイ画像を再設定すべし As Boolean = False
    Public gmスイスイ再スタート原因 As Integer = 0
    '--------------------------------------------------------------------------------------
    Public gmスイスイ再スタート_for_かなカナ As Boolean = False    '2023/05/13 add new
    '--------------------------------------------------------------------------------------
    '***************************************************************************
    Public Const gcなし As Integer = 0
    Public Const gcFormResize As Integer = 10
    Public Const gc画像ファイル存在しない As Integer = 12
    Public Const gc画像ファイル変更された As Integer = 14
    Public Const gcスイスイユラユラ停止する As Integer = 16
    Public Const gc変更pスイスイカード枚数 As Integer = 20
    Public Const gc変更pスイスイ背景画像明るさ As Integer = 22
    Public Const gc変更pスイスイカード型変更 As Integer = 24
    '***************************************************************************
    Public Const gccomアプリ終了 As Integer = 100
    Public Const gccomスイスイとユラユラを実行 As Integer = 110
    Public Const gccomスイスイとユラユラすべて停止 As Integer = 120
    Public Const gccomスイスイ実行 As Integer = 130
    Public Const gccomスイスイ停止 As Integer = 140
    Public Const gccomユラユラ実行 As Integer = 150
    Public Const gccomユラユラ停止 As Integer = 160
    Public Const gccomスイスイとユラユラを表示 As Integer = 170
    Public Const gccomスイスイ画像を設定 As Integer = 180
    '-----------------------------------------------------------------------
    Public Const gccom現在のゲームを現在のカード枚数で再スタート As Integer = 200
    Public Const gccom現在のゲームの実行状況のまま_aaカードの配置と再描画 As Integer = 210
    Public Const gccomカード枚数指定Do_1_2_3_4_5 As Integer = 220
    '***************************************************************************
#End Region

#Region "Window 表示／非表示"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public m同時表示可能DLG(,) As Integer = _
               {{gmDlgFileゲーム用, gmDlg背景画像ユラユラ設定Dlg, gmDlgウロウロオプション設定Dlg, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgFileスイスイ用, gmDlgスイスイユラユラ, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {appDlgFileカード用, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgオプション設定, gmDlgサウンド設定, gmDlgゲームカードサイズ設定, gmDlgかなカナゲーム用カード型選択変更, 0, 0, 0, 0, 0, 0}, _
                {gmDlgサウンド設定, gmDlgオプション設定, gmDlgゲームカードサイズ設定, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgゲームカードサイズ設定, gmDlgオプション設定, gmDlgサウンド設定, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgカードショーオプション, gmDlgカードショーカード型を設定, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgユーザーカードの編集, gmDlgゲームカード型を設定, gmDlgスイスイカード型を設定, gmDlgかなカナカード型を設定, gmDlgカードショーカード型を設定, gmDlgかなカナゲーム用カード型選択変更, gmDlgウロウロゲーム用カード型選択変更, 0, 0, 0}, _
                {gmDlgかなカナカード型を設定, gmDlgユーザーカードの編集, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgカードショーカード型を設定, gmDlgカードショーオプション, gmDlgユーザーカードの編集, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgゲームカード型を設定, gmDlgユーザーカードの編集, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgスイスイカード型を設定, gmDlgユーザーカードの編集, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgスイスイユラユラ, gmDlgFileスイスイ用, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgウロウロミックスモード設定, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgウロウロゲーム用カード型選択変更, gmDlgウロウロオプション設定Dlg, gmDlg背景画像ユラユラ設定Dlg, gmDlgユーザーカードの編集, 0, 0, 0, 0, 0, 0}, _
                {gmDlg色とフォントの設定Dlg, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {gmDlgウロウロオプション設定Dlg, gmDlgFileゲーム用, gmDlg背景画像ユラユラ設定Dlg, gmDlgウロウロゲーム用カード型選択変更, 0, 0, 0, 0, 0, 0}, _
                {gmDlg背景画像ユラユラ設定Dlg, gmDlgFileゲーム用, gmDlgウロウロオプション設定Dlg, gmDlgウロウロゲーム用カード型選択変更, 0, 0, 0, 0, 0, 0}, _
                {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _
                {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
    Function GMCOM_Dlgs同時に表示できる(ByVal rMeDlgIDX As Integer, ByVal r新規に表示されたDlgIDX As Integer) As Boolean
        Dim a, b As Integer
        For a = 0 To UBound(m同時表示可能DLG, 1)
            If m同時表示可能DLG(a, 0) = rMeDlgIDX Then
                For b = 0 To UBound(m同時表示可能DLG, 2)
                    If m同時表示可能DLG(a, b) = r新規に表示されたDlgIDX Then
                        Return True
                    End If
                Next
                Return False
            End If
        Next
        Return False
    End Function
    Function GMCOM_Dlgs他のウインドウの表示_非表示イベントで_rMe_ウインドウを消去しなさい(ByVal rMeDlgIDX As Integer, ByVal r新規に表示されたDlgIDX As Integer, ByVal r表示True消去False As Boolean) As Boolean
        If (gmアプリ終了する) Or (Not r表示True消去False) Or (rMeDlgIDX = r新規に表示されたDlgIDX) Then Return False
        Return Not GMCOM_Dlgs同時に表示できる(rMeDlgIDX, r新規に表示されたDlgIDX)
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Public Function GMCOM_ダイアログモードレス表示チェック(ByRef rDlg As Form) As Integer
        If gmアプリ終了する Then Return 0
        If rDlg Is Nothing Then
            Return 1
        Else
            Try
                Dim hwnd As Integer = rDlg.Handle
                If hwnd <> 0 Then
                    rDlg.BringToFront() : Return 2
                Else
                    'FormClosed() ----> Disposed() が実行されても、コードオブジェクトは残っている
                    'qqqqq("**** ???? in aaダイアログモードレス表示チェック()   Dlg.Visible = False")
                End If
            Catch ex As Exception
                qqqqq("●●● GMCOM_ダイアログモードレス表示チェック() 内での " & vbCrLf & "●●● rDlg As Form が存在しているか **チェック** のエラー発生")
                rDlg = Nothing
                Call Sleep(200)
                Return 1
            End Try
        End If
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

#Region "初期化"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Friend Function GMCOMアプリMainForm初期化_Pack(ByRef イベントgAppEventMaker As 五clsEventMaker, _
                ByVal fom As frmMain, ByRef mmLoading As Boolean, ByVal rゲームカード群領域最小サイズ As Integer, ByRef mMenuHight As Integer, ByVal MainMenu1 As MenuStrip, _
                ByRef mn9枚数と時間の表示 As ToolStripMenuItem, ByRef mn9残り枚数 As ToolStripMenuItem, ByRef mn9経過時間 As ToolStripMenuItem, _
                ByRef pctメイン As PictureBox) As Boolean
        Try
            '---------------------------------------- 
            '2023/06/17 add new
            With fom
                Dim ヨコ枠追加サイズ As Integer = .Width - .ClientSize.Width
                Dim タテ枠とメニュー高追加サイズ As Integer = .Height - .ClientSize.Height + MainMenu1.Height
                fom.MinimumSize = New Size(rゲームカード群領域最小サイズ + ヨコ枠追加サイズ, rゲームカード群領域最小サイズ + タテ枠とメニュー高追加サイズ)
            End With
            '----------------------------------------
            MainMenu1.Visible = False
            gggbol = ⅩⅩⅩAppOwnHDC_make_del_in_AppMain_Form_Load_FormClose_もしエラーなら_End_する(1)
            gggbol = GMCOMゲームアプリ規定フォルダ初期化(appヘルプファイル)
            '----------------------------------------
            If Not GMCOMアプリMainForm初期化(fom, mmLoading, mMenuHight, MainMenu1, mn9枚数と時間の表示, mn9残り枚数, mn9経過時間, pctメイン) Then End
            '----------------------------------------
            gAppEventMaker = New 五clsEventMaker
            gmComFileBmp = New 五clsPctFileOpenWithBuff
            gggbol = gmComFileBmp.aaStartSet(500)
            イベントgAppEventMaker = gAppEventMaker
            Return True
        Catch ex As Exception
            MsgBox("GMCOMアプリMainForm初期化_Pack() " & gggCR2 & ex.ToString)
            Return False
        End Try
    End Function
    Function GMCOMアプリMainForm初期化(ByVal fom As frmMain, ByRef mmLoading As Boolean, ByRef mMenuHight As Integer, ByVal MainMenu1 As MenuStrip, _
                ByRef mn9枚数と時間の表示 As ToolStripMenuItem, ByRef mn9残り枚数 As ToolStripMenuItem, ByRef mn9経過時間 As ToolStripMenuItem, _
                ByRef pctメイン As PictureBox) As Boolean
        Try
            gmアプリ終了する = False
            mmLoading = True
            mMenuHight = MainMenu1.Height
            fom.Text = Ⅹアプリメインウインドタイトル作成(appアプリタイトル)
            fom.SetBounds(100, 100, 1200, 800)
            If (mn9枚数と時間の表示 IsNot Nothing) And (mn9残り枚数 IsNot Nothing) And (mn9経過時間 IsNot Nothing) Then
                gggbol = Ⅹゲーム枚数_経過時間_メニュー文字列設定(0, mn9枚数と時間の表示, mn9残り枚数, mn9経過時間, 0, "")
            End If
            If pctメイン IsNot Nothing Then
                pctメイン.SetBounds(0, mMenuHight, 2000, 1500)
            End If
            Return True
        Catch ex As Exception
            MsgBox("GMCOMアプリMainForm初期化() " & gggCR2 & ex.ToString)
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Friend Function GMCOMアプリMainForm初期化_Pack_2222(ByRef MainMenu1 As MenuStrip, ByRef mnbbb最大化 As ToolStripMenuItem, ByRef pnlゲーム結果 As Panel) As Boolean
        mnbbb最大化.Visible = (gm使用中のディスプレイ台数 > 1)
        MainMenu1.Visible = True
        MainMenu1.BringToFront()
        pnlゲーム結果.SetBounds(0, MainMenu1.Height, 0, 0, BoundsSpecified.Location)
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMアプリMainForm_AppIniFile操作(ByVal fom As frmMain, ByRef mIniReading As Boolean) As Boolean
        Try
            gggAppIniFile = New 五clsAppINI                                             'メインホームの  frmMain_Load  で、グローバルオブジェクトを作成する。 
            Call fom.aaプロパティ初期化_INI読出し書込み(gcoプロパ初期化, gggstrary)        '初期デザインの状態をプロパデーターに設定する。
            gggbol = GMCOMゲームアプリ_gggAppIniFile_初期化と読出し_ファイル内文字の置換()
            mIniReading = True
            Dim IniDataStr() As String = {""}
            If Not fom.aaAppIniFileOp(0, IniDataStr) Then gggint = ⅩFormMove(gcoフォームをスクリーン中心に移動, fom) 'INI ファイルが存在しない場合に、このフォームを画面のセンターに表示するコード。
            Call fom.aaプロパティ初期化_INI読出し書込み(gcoプロパiniRD, IniDataStr)       'INI ファイルを開いて文字列を取り出し、プロパティを再設定する。
            mIniReading = False
            Return True
        Catch ex As Exception
            MsgBox("GMCOMアプリMainForm_AppIniFile操作() " & gggCR2 & ex.ToString)
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMアプリフォルダ(ByVal AddSep As String) As String
        Dim p As String = gmリリースAppPath
        If AddSep <> "" Then p = Ⅹパスセパレータ付加(p, AddSep)
        Return p
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMアプリタイトル(ByVal rドット付拡張子 As String) As String
        Dim p As String = My.Application.Info.AssemblyName
        If rドット付拡張子 <> "" Then p = p & rドット付拡張子
        Return p
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMゲームアプリ規定フォルダ初期化(ByRef rヘルプファイル名 As String) As Boolean
        '2022/11/12 他のアプリグループとは、Debug モードでの、*.exe ファイルの位置が異なる。
        'D:\aaaa\bbbbbb\bin\Debug\XXXXX.exe 
        'D:\aaaa\bbbbbb\bin\XXXXX.exe
        '2022/11/12 デバッグモードでの実行ファイルの出力位置が一段ずれることもあるので、相対パスに関しては注意が必要。
        '-----------------------------------------
        '2022/10/22 ゲームアプリグループのみで有効。
        '2022/10/22 デバッグモード／リリースモードで、共通のヘルプファイル、画像フォルダを使用できるように、相対パスを絶対パスに変換。
        Dim sAppPath As String = My.Application.Info.DirectoryPath
        qqqqq(sAppPath)
        Dim sAppPathyy As String = Ⅹパスセパレータ付加(sAppPath, "\")
        '-----------------------------------------
#If DEBUG Then
        sAppPath = sAppPathyy & "..\..\.."      'デバッグモード の　フォルダから　リリースモード　の　フォルダに移動
#End If
        gmリリースAppPath = Ⅹファイルの絶対パス(sAppPath)
        '-----------------------------------------
        Dim sカーソルファイル As String = sAppPath & "\hand.CUR"
        Dim sサウンドあたり As String = sAppPath & "\あたり.WAV"
        Dim sサウンドハズレ As String = sAppPath & "\ハズレ.WAV"
        Dim sヘルプファイルパス As String = sAppPath & "\ヘルプファイル\" & rヘルプファイル名               'ヘルプファイル名 =    "ヘルプファイル\@@@@@@@@@@@@@@@@@@@@@@@@.html"
        Dim sヘルプファイルCSSパス As String = sAppPath & "\ヘルプファイル\■ユーザーお好み書体設定■.css"   'ヘルプファイルCSS名 = "ヘルプファイル\■ユーザーお好み書体設定■.css"
        Dim s共有画像フォルダ As String = sAppPath & "\..\$共有画像"
        Try
            gmサウンドあたり = Ⅹファイルの絶対パス(sサウンドあたり)
            gmサウンドハズレ = Ⅹファイルの絶対パス(sサウンドハズレ)
            gmカーソルファイル = Ⅹファイルの絶対パス(sカーソルファイル)
            gmヘルプファイル = Ⅹファイルの絶対パス(sヘルプファイルパス)
            gmヘルプファイルCSS = Ⅹファイルの絶対パス(sヘルプファイルCSSパス)
            gm共有画像フォルダ = Ⅹファイルの絶対パス(s共有画像フォルダ)
            'qqqqq(gmリリースAppPath)
            'qqqqq(gmヘルプファイル)
            'qqqqq(gmヘルプファイルCSS)
            'qqqqq(gm共有画像フォルダ)
            Return True
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return False
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMゲームアプリ_gggAppIniFile_初期化と読出し_ファイル内文字の置換() As Boolean
        Dim cut As String = "|"
        'Dim 置換文字列群 As String = gmリリースAppPath & cut & "■:AppPath:■" & cut & gm共有画像フォルダ & cut & "●:共有画像フォルダ:●" & cut
        Dim 置換文字列群 As String = gm共有画像フォルダ & cut & "●:共有画像フォルダ:●" & cut
        Return gggAppIniFile.SetIniFileName(GMCOMアプリフォルダ(""), GMCOMアプリタイトル(""), 置換文字列群, cut)  'INI ファイル名を設定する　/　置換文字列設定
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

#Region "画像の外枠"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠を作成(ByRef pctbox As PictureBox, ByRef 背景色 As Integer, ByRef 画像塗りつぶし色 As Integer, ByRef 外枠色 As Integer) As Boolean
        On Error GoTo errop
        Dim w, X, a, c, Y, h, nnn As Integer

        Dim bmp As Bitmap = pctbox.Image
        Dim GDIbmp As Integer = bmp.GetHbitmap
        If GDIbmp <> 0 Then
            Dim oldbmp As Integer = SelectObject(ghDC1, GDIbmp)
            If oldbmp <> 0 Then
                w = bmp.Width - 1
                h = bmp.Height - 1

                '背景色の縁取りを１ピクセル幅で描画する。
                For Y = 0 To h
                    If 背景色 <> GetPixel(ghDC1, 0, Y) Then gggint = SetPixel(ghDC1, 0, Y, 背景色)
                    If 背景色 <> GetPixel(ghDC1, w, Y) Then gggint = SetPixel(ghDC1, w, Y, 背景色)
                Next
                For X = 0 To w
                    If 背景色 <> GetPixel(ghDC1, X, 0) Then gggint = SetPixel(ghDC1, X, 0, 背景色)
                    If 背景色 <> GetPixel(ghDC1, X, h) Then gggint = SetPixel(ghDC1, X, h, 背景色)
                Next
                '画像で背景色でない部分は、画像塗りつぶし色にする。
                For Y = 1 To h - 1
                    For X = 1 To w - 1
                        If 背景色 <> GetPixel(ghDC1, X, Y) Then gggint = SetPixel(ghDC1, X, Y, 画像塗りつぶし色)
                    Next
                Next
                '画像を外枠色で縁取りする。
                For Y = 1 To h - 1
                    For X = 1 To w - 1
                        If 画像塗りつぶし色 = GetPixel(ghDC1, X, Y) Then
                            If 背景色 = GetPixel(ghDC1, X - 1, Y) Or 背景色 = GetPixel(ghDC1, X + 1, Y) Then gggint = SetPixel(ghDC1, X, Y, 外枠色)
                        End If
                    Next
                Next
                For X = 1 To w - 1
                    For Y = 1 To h - 1
                        If 画像塗りつぶし色 = GetPixel(ghDC1, X, Y) Then
                            If 背景色 = GetPixel(ghDC1, X, Y - 1) Or 背景色 = GetPixel(ghDC1, X, Y + 1) Then gggint = SetPixel(ghDC1, X, Y, 外枠色)
                        End If
                    Next
                Next
                '一つのピクセルだけが、突出している部分を取り除く
                For Y = 1 To h - 1
                    For X = 1 To w - 1
                        If 外枠色 = GetPixel(ghDC1, X, Y) Then
                            If 背景色 = GetPixel(ghDC1, X - 1, Y) And 背景色 = GetPixel(ghDC1, X + 1, Y) Then
                                If 外枠色 = GetPixel(ghDC1, X, Y + 1) Or 外枠色 = GetPixel(ghDC1, X, Y - 1) Then gggint = SetPixel(ghDC1, X, Y, 背景色)
                            End If
                        End If
                    Next
                Next
                For X = 1 To w - 1
                    For Y = 1 To h - 1
                        If 外枠色 = GetPixel(ghDC1, X, Y) Then
                            If 背景色 = GetPixel(ghDC1, X, Y - 1) And 背景色 = GetPixel(ghDC1, X, Y + 1) Then
                                If 外枠色 = GetPixel(ghDC1, X + 1, Y) Or 外枠色 = GetPixel(ghDC1, X - 1, Y) Then gggint = SetPixel(ghDC1, X, Y, 背景色)
                            End If
                        End If
                    Next
                Next
                gggint = SelectObject(ghDC1, oldbmp)
                oldbmp = 0
            End If
            pctbox.Image.Dispose()
            pctbox.Image = Image.FromHbitmap(GDIbmp)
            pctbox.Refresh()
            'qqqqq("Ⅹ画像の外枠を作成() -- Image.FromHbitmap(GDIbmp)")
            'gggbol = ⅩClipboard_SetImage_From_GDIBmp_Or_Image(0, pctbox.Image)
            gggint = DeleteObject(GDIbmp)
        End If
        Return True
errop:
        If Err.Number <> 0 Then MsgBox("""Ⅹ画像の外枠を作成()""　内でエラーが発生しました。" & vbCrLf & vbCrLf & ErrorToString()) : Return False
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠の_POINT_配列を作成(ByRef pctbox As PictureBox, ByRef 背景色 As Integer, ByRef pts() As POINTAPI, Optional ByRef 縦線横線データーダブり削除 As Boolean = True, _
                    Optional ByRef 塗りつぶし色 As Integer = &HFFFF00&, Optional ByRef 外枠検査色 As Integer = &HFF&, Optional ByRef 外枠完成色 As Integer = &HFF0000&) As Integer
        '2018-0503
        '画像の外枠の_POINT_配列()　は　0　から始まる。
        On Error GoTo errop
        Dim y2, x2, CY, h, Y, c, a, X, w, CX, x1, y1 As Integer
        ReDim pts(c)
        If GMCOMⅩ画像の外枠を作成(pctbox, 背景色, 塗りつぶし色, 外枠検査色) Then
            Dim bmp As Bitmap = pctbox.Image
            Dim GDIbmp As Integer = bmp.GetHbitmap
            If GDIbmp <> 0 Then
                Dim oldbmp As Integer = SelectObject(ghDC1, GDIbmp)
                If oldbmp <> 0 Then
                    w = bmp.Width - 1
                    h = bmp.Height - 1
                    '-----------------------------------------------
                    CX = 0 : CY = 0
                    For Y = 1 To h - 1
                        For X = 1 To w - 1
                            If 外枠検査色 = GetPixel(ghDC1, X, Y) Then
                                CX = X : CY = Y : Exit For
                            End If
                        Next
                        If CX <> 0 Then Exit For
                    Next
                    '-----------------------------------------------
                    'pts() は０から始まる
                    c = -1
                    If CX <> 0 Then
                        Do
                            c = c + 1
                            If UBound(pts) < c Then ReDim Preserve pts(c + 500)
                            '-----------------------------------------------
                            pts(c).X = CX
                            pts(c).Y = CY
                            gggint = SetPixel(ghDC1, CX, CY, 外枠完成色)
                            '-----------------------------------------------
                            x1 = CX - 1 : x2 = CX + 1
                            y1 = CY - 1 : y2 = CY + 1
                            '-----------------------------------------------
                            If 外枠検査色 = GetPixel(ghDC1, x1, CY) Then
                                CX = x1
                            ElseIf 外枠検査色 = GetPixel(ghDC1, x2, CY) Then
                                CX = x2
                            ElseIf 外枠検査色 = GetPixel(ghDC1, CX, y1) Then
                                CY = y1
                            ElseIf 外枠検査色 = GetPixel(ghDC1, CX, y2) Then
                                CY = y2
                            ElseIf 外枠検査色 = GetPixel(ghDC1, x1, y1) Then
                                CX = x1 : CY = y1
                            ElseIf 外枠検査色 = GetPixel(ghDC1, x2, y1) Then
                                CX = x2 : CY = y1
                            ElseIf 外枠検査色 = GetPixel(ghDC1, x2, y2) Then
                                CX = x2 : CY = y2
                            ElseIf 外枠検査色 = GetPixel(ghDC1, x1, y2) Then
                                CX = x1 : CY = y2
                            Else
                                '元のスタートに戻った
                                If c > 10 Then
                                    If (pts(1).X = CX Or pts(1).X = x1 Or pts(1).X = x2) And (pts(1).Y = CY Or pts(1).Y = y1 Or pts(1).Y = y2) Then
                                        Exit Do
                                    End If
                                End If
                                '-----------------------------------------------
                                If Not GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策(ghDC1, 外枠検査色, pts(c).X, pts(c).Y, CX, CY) Then
                                    Exit Do
                                End If
                            End If
                            If c > 100000 Then 'if error
                                c = 0 : Exit Do
                            End If
                        Loop
                        ReDim Preserve pts(c)
                        If 縦線横線データーダブり削除 Then c = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除(pts, True)
                    End If
                    gggint = SelectObject(ghDC1, oldbmp)
                    oldbmp = 0
                End If
                gggint = DeleteObject(GDIbmp)
            End If
            pctbox.Refresh()
        End If
        Return c
        'qqqqq "ポイント総数 = " + CStr(c)
        'For a = 1 To c Step 20: qqqqq CStr(pts(a).X) + ",  " + CStr(pts(a).y): Next
errop:
        If Err.Number <> 0 Then MsgBox("""Ⅹ画像の外枠の_POINT_配列を作成()""　内でエラーが発生しました。" & vbCrLf & vbCrLf & ErrorToString())
        Return 0
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策(ByRef hDC As Integer, ByRef 外枠検査色 As Integer, ByRef X As Integer, ByRef Y As Integer, ByRef CX As Integer, ByRef CY As Integer) As Boolean
        '2016-0204
        Dim y4, y2, x5, x3, x1, x2, x4, y1, y3, y5 As Integer
        x1 = X - 2 : x2 = X - 1 : x3 = X : x4 = X + 1 : x5 = X + 2
        y1 = Y - 2 : y2 = Y - 1 : y3 = Y : y4 = Y + 1 : y5 = Y + 2
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x1, y3, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x5, y3, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x3, y1, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x3, y5, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x1, y1, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x1, y2, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x1, y4, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x1, y5, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x5, y1, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x5, y2, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x5, y4, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x5, y5, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x2, y1, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x4, y1, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x2, y5, CX, CY) Then GoTo OKreturn
        If GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(hDC, 外枠検査色, x4, y5, CX, CY) Then GoTo OKreturn
        Return False
OKreturn:
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠の_POINT_配列を作成_外枠途切れの対策_DO(ByRef hDC As Integer, ByRef 外枠検査色 As Integer, ByRef X As Integer, ByRef Y As Integer, ByRef CX As Integer, ByRef CY As Integer) As Boolean
        '2021/03/21 chg  '2016-0204
        If 外枠検査色 = GetPixel(hDC, X, Y) Then
            CX = X : CY = Y
            Return True
        Else
            Return False
        End If
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除(ByRef pts() As POINTAPI, ByRef r斜め直線データー削除 As Boolean) As Integer
        '2021/03/21 chg  '2016/0605  X Y の兼ね合いでエラーになりうることを発見　関数を作り直す
        '画像の外枠の_POINT_配列()　は　0　から始まる。
        Dim m, a2, a0, a1, c, mmm As Integer
        Dim p(0) As POINTAPI
        Dim ppp(0) As Integer
        Dim py1, px2, px0, px1, py0, py2 As Integer
        gggbol = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_CopyData(pts, p, ppp, m) '''''''' 	GoSub CopyData
        mmm = m
        For a0 = 0 To m - 2
            px0 = p(a0).X : a1 = a0 + 1 : a2 = a0 + 2
            If px0 = p(a1).X And px0 = p(a2).X Then ppp(a1) = 1
        Next
        gggbol = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_ChkCopy(pts, p, ppp, m, c) '''''	GoSub ChkCopy
        gggbol = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_CopyData(pts, p, ppp, m) '''''''' 	GoSub CopyData
        For a0 = 0 To m - 2
            py0 = p(a0).Y : a1 = a0 + 1 : a2 = a0 + 2
            If py0 = p(a1).Y And py0 = p(a2).Y Then ppp(a1) = 1
        Next
        gggbol = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_ChkCopy(pts, p, ppp, m, c) '''''	GoSub ChkCopy
        If r斜め直線データー削除 Then
            'qqqqq CStr(c)
            gggbol = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_CopyData(pts, p, ppp, m) '''''''' 	GoSub CopyData
            For a0 = 0 To m - 2
                a1 = a0 + 1 : a2 = a0 + 2
                px0 = p(a0).X : px1 = p(a1).X : px2 = p(a2).X
                If px0 - px1 = px1 - px2 Then
                    py0 = p(a0).Y : py1 = p(a1).Y : py2 = p(a2).Y
                    If py0 - py1 = py1 - py2 Then
                        ppp(a1) = 1
                        'qqqqq "斜め直線データー削除 実行"
                    End If
                End If
            Next
            gggbol = GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_ChkCopy(pts, p, ppp, m, c) '''''	GoSub ChkCopy
            'qqqqq CStr(c)
        End If
        'qqqqq CStr(mmm) + "  --->  " + CStr(c)
        Return c
    End Function
    Function GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_CopyData(ByRef pts() As POINTAPI, ByRef p() As POINTAPI, ByRef ppp() As Integer, ByRef m As Integer) As Boolean
        Dim a0 As Integer
        m = UBound(pts) : ReDim p(m) : ReDim ppp(m)
        For a0 = 0 To m
            p(a0).X = pts(a0).X : p(a0).Y = pts(a0).Y : ppp(a0) = 0
        Next
        Return True
    End Function
    Function GMCOMⅩ画像の外枠の_POINT_配列を作成_縦線横線データーダブり削除_SUB_ChkCopy(ByRef pts() As POINTAPI, ByRef p() As POINTAPI, ByRef ppp() As Integer, ByRef m As Integer, ByRef c As Integer) As Boolean
        Dim a0 As Integer
        c = -1
        For a0 = 0 To m
            If ppp(a0) = 0 Then
                c = c + 1 : pts(c).X = p(a0).X : pts(c).Y = p(a0).Y
            End If
        Next
        ReDim Preserve pts(c)
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠の_POINT_配列を圧縮(ByRef 画像の外枠の_POINT_配列() As POINTAPI, ByRef 画像サイズに対する省略比率 As Single) As Boolean
        '2021/03/21 chg
        '画像の外枠の_POINT_配列()　は　0　から始まる。
        '画像の外枠の_POINT_配列()　のデーターサイズを小さくするために呼び出す。
        '画像サイズとは、画像の外枠の_POINT_配列()の配列内で X Y それぞれ、最大値から最小値を引いた値
        '画像サイズに対する省略比率　---- 配列内での次のデーターとの差の大きさを指定をする引数。 0.1 から 0.001  の間で指定する。画像サイズにこの値をかけて、データー省略の基準値にする。
        '画像の外枠の_POINT_配列()の配列内で X Y 両方ともに、次のデーターとの絶対値の差が、データー省略の基準値以下であれば、次のデーターは省略して、配列から取り除く。
        '画像の外枠の_POINT_配列()の配列 を Redim Preseve して返す。
        '画像の外枠の_POINT_配列()の配列が小さくなった場合は　True　を返す。
        'qqqqq "Ⅹ画像の外枠の_POINT_配列を圧縮() in  " + CStr(UBound(画像の外枠の_POINT_配列()))
        Dim Xcur, Ymin, Xmin, c, a, 差X, 画像サイズX, 画像サイズY, 差Y, b, m, Xmax, Ymax, Ycur As Integer
        Dim DelCount As Integer
        If 画像サイズに対する省略比率 > 0.1 Or 画像サイズに対する省略比率 < 0.001 Then Return False
        m = UBound(画像の外枠の_POINT_配列)
        If m < 1 Then Return False
        Xmin = 2000000000 : Xmax = -2000000000 : Ymin = 2000000000 : Ymax = -2000000000
        For a = 0 To m
            With 画像の外枠の_POINT_配列(a)
                If Xmin > .X Then Xmin = .X
                If Xmax < .X Then Xmax = .X
                If Ymin > .Y Then Ymin = .Y
                If Ymax < .Y Then Ymax = .Y
            End With
        Next
        画像サイズX = Xmax - Xmin : 画像サイズY = Ymax - Ymin
        差X = CInt(CSng(画像サイズX) * 画像サイズに対する省略比率) : 差Y = CInt(CSng(画像サイズY) * 画像サイズに対する省略比率)
        If 差X > 0 Or 差Y > 0 Then
            DelCount = 0
            For a = 0 To m - 1
                Xcur = 画像の外枠の_POINT_配列(a).X : Ycur = 画像の外枠の_POINT_配列(a).Y
                For b = a + 1 To m
                    If System.Math.Abs(画像の外枠の_POINT_配列(b).X - Xcur) < 差X Then
                        If System.Math.Abs(画像の外枠の_POINT_配列(b).Y - Ycur) < 差Y Then
                            画像の外枠の_POINT_配列(b).X = &HFFFFFF : 画像の外枠の_POINT_配列(b).Y = &HFFFFFF
                            DelCount = DelCount + 1
                            'DelCount = DelCount + 1: qqqqq Format$(DelCount, "000") + "    " + CStr(a)
                            a = b
                        Else
                            Exit For
                        End If
                    Else
                        Exit For
                    End If
                Next
            Next
            If DelCount > 0 Then
                c = 0
                For a = 1 To m
                    If 画像の外枠の_POINT_配列(a).X <> &HFFFFFF Then
                        c = c + 1
                        画像の外枠の_POINT_配列(c).X = 画像の外枠の_POINT_配列(a).X : 画像の外枠の_POINT_配列(c).Y = 画像の外枠の_POINT_配列(a).Y
                    End If
                Next
                ReDim Preserve 画像の外枠の_POINT_配列(c)
            End If
        End If
        Return True
        'qqqqq "Ⅹ画像の外枠の_POINT_配列を圧縮() out " + CStr(UBound(画像の外枠の_POINT_配列()))
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩ画像の外枠の_POINT_配列から同じデーターを削除(ByRef 画像の外枠の_POINT_配列() As POINTAPI) As Boolean
        '2021/03/21 chg
        '画像の外枠の_POINT_配列()　は　0　から始まる。
        '画像の外枠の_POINT_配列()　のデーターサイズを小さくするために呼び出す。
        '画像の外枠の_POINT_配列()の配列内で X Y 両方ともに、次のデーターと同じであれば、次のデーターは省略して、配列から取り除く。
        '画像の外枠の_POINT_配列()の配列 を Redim Preseve して返す。
        '画像の外枠の_POINT_配列()の配列が小さくなった場合は　True　を返す。
        Dim Xcur, c, a, b, m, Ycur As Integer
        m = UBound(画像の外枠の_POINT_配列)
        If m < 1 Then Return False
        c = 0
        For a = 0 To m - 1
            Xcur = 画像の外枠の_POINT_配列(a).X : Ycur = 画像の外枠の_POINT_配列(a).Y
            For b = a + 1 To m
                If 画像の外枠の_POINT_配列(b).X = Xcur And 画像の外枠の_POINT_配列(b).Y = Ycur Then
                    'non op next
                Else
                    c = c + 1 : 画像の外枠の_POINT_配列(c).X = 画像の外枠の_POINT_配列(b).X : 画像の外枠の_POINT_配列(c).Y = 画像の外枠の_POINT_配列(b).Y
                    Exit For
                End If
            Next
            a = b - 1
        Next
        ReDim Preserve 画像の外枠の_POINT_配列(c)
        Return (m > c)
        'qqqqq "Ⅹ画像の外枠の_POINT_配列から同じデーターを削除() in , out   " + Format$(m, "0000") + " , " + Format$(UBound(画像の外枠の_POINT_配列()), "0000")
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

#Region "ユラユラ計算"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩユラユラデーター処理(ByRef rMake1_Del2_SetCur幅高3 As Integer, ByRef rwユラユラ() As Single, ByRef rwユラユラMAX As Integer, ByRef rCurIDX As Integer, _
                                    ByRef rBMP幅 As Integer, ByRef rBMP高 As Integer, ByRef wCur幅 As Integer, ByRef wCur高 As Integer, _
                                    Optional ByRef r全画幅 As Integer = 0, Optional ByRef r全画高 As Integer = 0, _
                                    Optional ByRef r波長係数 As Single = 0, Optional ByRef rズーム比率_1_to_3 As Single = 0) As Boolean
        'r波長係数　       　　は画面内での波数の逆数に比例するが、Rnd関数で波数は分散する。
        'rズーム比率_1_to_3　　はオリジナル画像の拡大率で、１．０　～　３．０倍　の範囲になる。
        Dim a, n As Integer : Dim xx, zm As Single
        Select Case rMake1_Del2_SetCur幅高3
            Case 1 '
                ReDim rwユラユラ(rwユラユラMAX)
                rwユラユラ(1) = 1.0#
                n = Math.Max(80, Math.Min(rwユラユラMAX, (r全画幅 + r全画高) \ 10))
                xx = 6.28 * (1 / (n * Ⅹ数値範囲Sng(0.2, 2.0#, r波長係数) * (Rnd() + 1)))
                zm = Ⅹ数値範囲Sng(1.0#, 3.0#, rズーム比率_1_to_3) - 1.0#
                For a = 2 To rwユラユラMAX
                    rwユラユラ(a) = 1.0# + (System.Math.Abs(System.Math.Sin(a * xx)) * zm)
                Next
                'qqqqq "全画幅 全画高 = " + CStr(n) + "  /  ユラユラMAX = " + CStr(rwユラユラMAX)
                'qqqqq "xx = " + Format(xx, "#.####")
                'For a = 2 To rwユラユラMAX Step 10:    qqqqq CStr(rwユラユラ(a)):    Next
            Case 2 '
                ReDim rwユラユラ(0) : rwユラユラMAX = 0
            Case 3 '
                wCur幅 = rBMP幅 * rwユラユラ(rCurIDX) : wCur高 = rBMP高 * rwユラユラ(rCurIDX)
            Case Else
                Return False
        End Select
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩユラユラデーター処理_05_to_15(ByRef rMake1_Del2_SetCur幅高3 As Integer, ByRef rwユラユラ() As Single, ByRef rwユラユラMAX As Integer, ByRef rCurIDX As Integer, _
                                ByRef rBMP幅 As Integer, ByRef rBMP高 As Integer, ByRef wCur幅 As Integer, ByRef wCur高 As Integer, _
                                Optional ByRef r全画幅 As Integer = 0, Optional ByRef r全画高 As Integer = 0, _
                                Optional ByRef r波長係数 As Single = 0, Optional ByRef rズーム比率_00_to_05 As Single = 0, Optional ByRef rズームサイクルスピード_1_to_3 As Single = 0) As Boolean
        'r波長係数　       　　　は画面内での波数の逆数に比例するが、この関数内で　(Rnd + 0.5)　乱数を使用しているので、波数は分散する。
        'rズーム比率_00_to_05　　はオリジナル画像の拡大率で、＋－０．０　～　０．５　の範囲になる。呼び出しもとで　Rnd　乱数を使用して、いろんな値を設定できる。　結果として０．５　～　１．５になる。
        'Static mmmm As Long
        Dim a As Integer : Dim zm, n, xx, pich As Single
        Select Case rMake1_Del2_SetCur幅高3
            Case 1 '
                ReDim rwユラユラ(rwユラユラMAX)
                rwユラユラ(1) = 1.0#
                pich = Ⅹ数値範囲Sng(0.1, 10.0#, rズームサイクルスピード_1_to_3)
                n = Math.Max(80.0#, Math.Min(CSng(rwユラユラMAX), ((r全画幅 + r全画高)) * pich))
                xx = 6.28 / (n * Ⅹ数値範囲Sng(0.1, 2.0#, r波長係数) * (Rnd() + 0.5))
                zm = Ⅹ数値範囲Sng(0.0#, 0.5, rズーム比率_00_to_05)
                For a = 2 To rwユラユラMAX
                    rwユラユラ(a) = 1.0# + (System.Math.Sin(a * xx) * zm)
                Next
                'mmmm = mmmm + 1 : If mmmm Mod 5 = 0 Then qqqqq("n = " + Format(n, "0000") + " / pich = " + Format(pich, "#.####") + " / xx = " + Format(xx, "#.####"))
                'qqqqq "全画幅 全画高 = " + CStr(n) + "  /  ユラユラMAX = " + CStr(rwユラユラMAX)
                'qqqqq "xx = " + Format(xx, "#.####")
                'For a = 2 To rwユラユラMAX Step 10:    qqqqq CStr(rwユラユラ(a)):    Next
            Case 2 '
                ReDim rwユラユラ(0) : rwユラユラMAX = 0
            Case 3 '
                wCur幅 = rBMP幅 * rwユラユラ(rCurIDX) : wCur高 = rBMP高 * rwユラユラ(rCurIDX)
            Case Else
                Return False
        End Select
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Function GMCOMⅩユラユラデーター処理_05_to_15_シンクロ(ByRef rwシンクロズームカウンタ As Integer, ByRef rBMP幅 As Integer, ByRef rBMP高 As Integer, ByRef wCur幅 As Integer, ByRef wCur高 As Integer, Optional ByRef rズームサイクルスピード_100_to_1000 As Single = 300, Optional ByRef rズーム比率_00_to_05 As Single = 0.5) As Boolean
        Static 波値(0) As Single : Static 波値MAX As Integer
        Dim a As Integer
        Try
            a = UBound(波値)
        Catch
            ReDim 波値(0)
            a = UBound(波値)
        End Try
        Try
            If rwシンクロズームカウンタ > UBound(波値) Then
                Dim radipich, zoom As Single
                波値MAX = (0.2 + Rnd()) * rズームサイクルスピード_100_to_1000
                ReDim 波値(波値MAX)
                波値(1) = 1.0#
                radipich = 6.28 / 波値MAX
                zoom = Ⅹ数値範囲Sng(0.0#, 0.5, rズーム比率_00_to_05 * (1.0# + Rnd()) / 2.0#) '2021/05/30  rズーム比率_00_to_05)
                For a = 2 To 波値MAX
                    波値(a) = 1.0# + (System.Math.Sin(radipich * a) * zoom)
                Next
                rwシンクロズームカウンタ = 1
            End If
            wCur幅 = rBMP幅 * 波値(rwシンクロズームカウンタ) : wCur高 = rBMP高 * 波値(rwシンクロズームカウンタ)
            Return True
        Catch
            MsgBox(ErrorToString())
        End Try
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

#Region "アプリゲーム状態"
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    '以下のプロパティ群では、設定値は　True　のみ可能。 False　を指定しても、無視される。
    '2023/03/09  以下のフラッグ設定のロジックには、かなり問題がありそうだ。
    Private mアプリゲーム状態 As Integer = 0
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Friend Function ppアプリゲーム状態_GetSet(ByVal Get0_Set1 As Integer, ByVal old_mアプリゲーム状態 As Integer) As Integer
        Select Case Get0_Set1
            Case 0
                Return mアプリゲーム状態
            Case Else
                mアプリゲーム状態 = old_mアプリゲーム状態
        End Select
    End Function
    Public Property ppゲームクリア状態() As Boolean
        Get
            Return (mアプリゲーム状態 = 0)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 0
        End Set
    End Property
    Public Property ppゲーム実行中() As Boolean
        Get
            Return (mアプリゲーム状態 = 1)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 1 Else mアプリゲーム状態 = 0
        End Set
    End Property
    Public Property ppスイスイ実行中() As Boolean
        Get
            Return (mアプリゲーム状態 = 2)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 2
        End Set
    End Property
    Public Property ppユラユラ実行中() As Boolean
        Get
            Return (mアプリゲーム状態 = 3)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 3
        End Set
    End Property
    Public Property ppスイスイandユラユラ実行中() As Boolean
        Get
            Return (mアプリゲーム状態 = 5)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 5
        End Set
    End Property
    Public ReadOnly Property ppスイスイフラフラ_いずれかあるいは両方_を実行中() As Boolean
        Get
            Return (ppスイスイ実行中 Or ppユラユラ実行中 Or ppスイスイandユラユラ実行中)
        End Get
    End Property
    Public ReadOnly Property ppスイスイフラフラ_いずれも停止している() As Boolean
        Get
            Return Not ppスイスイフラフラ_いずれかあるいは両方_を実行中
        End Get
    End Property
    Public Property ppカードショー実行中() As Boolean
        Get
            Return (mアプリゲーム状態 = 6)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 6 Else mアプリゲーム状態 = 0
        End Set
    End Property
    Public Property ppカードショーテスト実行中() As Boolean
        Get
            Return (mアプリゲーム状態 = 7)
        End Get
        Set(ByVal value As Boolean)
            If value Then mアプリゲーム状態 = 7 Else mアプリゲーム状態 = 0
        End Set
    End Property
    Public ReadOnly Property ppカードショー_or_カードショーテスト_を実行中() As Boolean
        Get
            Return (ppカードショー実行中 Or ppカードショーテスト実行中)
        End Get
    End Property
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

#Region "その他の..."
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Friend Function GMCOM_ゲームデーターメニュー_VisibleSet(ByVal mnttt時間枚数 As ToolStripMenuItem) As Boolean
        mnttt時間枚数.Visible = ppスイスイフラフラ_いずれも停止している And (Not ppカードショー_or_カードショーテスト_を実行中)
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    Friend Function GMCOM_ゲーム結果パネル表示_切替(ByVal rShow1_Hide2 As Integer) As Boolean
        With frmMain
            Select Case rShow1_Hide2
                Case 1
                    .pnlゲーム結果.Width = 320
                    .pnlゲーム結果.BringToFront()
                    .pnlゲーム結果.Visible = True
                    System.Windows.Forms.Application.DoEvents()
                Case 2
                    .pnlゲーム結果.Visible = False
            End Select
        End With
        Return True
    End Function
    '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
#End Region

End Module
