<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />스크립트로 JMP 색상 선택 창이 열리도록하고 싶습니다. 사용자가 선택한 색상을 반환해야합니다 (RGB 값).
그래서 나는이 창들을 스크립트로 열고 싶다.


이것이 가능한가? 지금까지 나는 그것을 할 수있는 방법을 찾지 못했습니다 (JMP 12.1).
그래서 당신은 Windows dll을 사용할 수 있다고 생각했습니다. 내 문제는 DLL을 사용하는 방법에 대한 단서가 없다는 것입니다 ...
아래에 언급 된 JMP 스크립트 가이드 및 구문 참조 서 및 인터넷 페이지를 통해 다음 코드를 만들었습니다.
/*user32 = Load Dll( "User32" );user32 << DeclareFunction( "FindWindowA", Convention( STDCALL ), Alias( "FindWindow2" ), Arg( UInt32, input, "lpClassName" ), Arg( AnsiString( 200 ), input, "lpCaption" ), Returns( UIntPtr ));lpCaption = "Script - JMP";hWnd = user32 << FindWindow2( 0, lpCaption );user32 << UnloadDLL();*/dll = LoadDLL("C:\Windows\System32\comdlg32.dll");dll << Declare Function( "ChooseColorA", Convention(STDCALL), Alias("ColorPalette"), StructArg( Arg(UInt32, "lStructSize"), Arg(Int64, "hwndOwner"), Arg(Int64, "hInstance"), Arg(UInt32, update, "rgbResult"), Arg(AnsiString, "lpCustColors"), Arg(UInt32, "Flags"), Arg(Int64, "lCustData"), Arg(Int64, "lpfnHook"), Arg(AnsiString, "lpTemplateName"), update ), Returns(Int8));selected_color = 5;hwnd = 0;size = 36 ;result = dll << ColorPalette( size, // lStructSize hwnd, // hwndOwner 0, // hInstance selected_color, // rgbResult "", // lpCustColors 2, // flags; 2 = show all colors 0, // lCustData 0, // lpfnHook "" // lpTemplateName);show(result);dll << UnloadDLL();이 코드는 작동하지 않으며 색상 선택 창이 표시되지 않지만 ColorPalette 함수 호출의 결과는 항상 0입니다.
하나의 문제는 'lStructSize'에 대한 올바른 값을 모른다는 것입니다. 나는 1에서 10000까지 모든 값을 변경하지 않고 시도했다. 그래서 분명히 내 코드에 더 많은 오류가있다 (내가 말했듯이, 나는 DLL을 어떻게 사용하는지 전혀 모른다).
도움을 줄 수 있습니까?
다음은 몇 가지 유용한 링크입니다.
https://msdn.microsoft.com/en-us/library/ms646912%28v=vs.85%29.aspx
https://msdn.microsoft.com/en-us/library/ms646829%28v=vs.85%29.aspx#choosing_color
https://msdn.microsoft.com/de-de/library/windows/desktop/ms646830%28v=vs.85%29.aspx
그리고 여기에 MS Excel (인터넷에서 발견 된 약간 수정 된 코드)에서 작동하는 일부 VBA 코드가 있습니다. 나는 비슷한 방식으로 JMP에서 그것을 시도했다.
Option ExplicitPrivate Type CHOOSECOLOR lStructSize As Long hwndOwner As Long hInstance As Long rgbResult As Long lpCustColors As String flags As Long lCustData As Long lpfnHook As Long lpTemplateName As StringEnd TypePrivate Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _"ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongDim CustomColors() As ByteSub test() Form_Load Dim cc As CHOOSECOLOR Dim Custcolor(16) As Long Dim lReturn As Long cc.lStructSize = Len(cc) 'Debug.Print cc.lStructSize cc.hwndOwner = Application.Hwnd cc.hwndOwner = 0 cc.hInstance = 0 cc.lpCustColors = StrConv(CustomColors, vbUnicode) 'cc.flags = 0 cc.flags = 2 ' all colors 'cc.flags = CC_FULLOPEN lReturn = ChooseColorAPI(cc) If lReturn <> 0 Then Dim Farbe, Rot, Gruen, Blau As Long Farbe = cc.rgbResult Rot = Farbe Mod 256 Farbe = (Farbe - Rot) / 256 Gruen = Farbe Mod 256 Farbe = (Farbe - Gruen) / 256 Blau = Farbe Mod 256 MsgBox "Color: " & cc.rgbResult & vbNewLine & "Rot: " & Rot & vbNewLine & "Grün: " & Gruen & vbNewLine & "Blau: " & Blau CustomColors = StrConv(cc.lpCustColors, vbFromUnicode) Else MsgBox "User chose the Cancel Button" End IfEnd SubSub Form_Load() ReDim CustomColors(0 To 16 * 4 - 1) As Byte Dim i As Integer For i = LBound(CustomColors) To UBound(CustomColors) CustomColors(i) = 0 Next iEnd Sub
나는 똑같은 요구를했다. 감사합니다. 샘플 코드. 나는 그것을 개정하고 JMP 12에서이 시험을 통과했다.
여기 내 대본이있다.
ChooseColor = Function( {intColor, flags=3},
{Default Local},
If( Host is( Windows ),
dll = Load DLL("C:/Windows/System32/Comdlg32.dll", Quiet );
dll << Declare Function( "ChooseColorW", Convention(STDCALL), Alias("PickColor"),
StructArg(
Arg(Int64, "lStructSize"),
Arg(Int64, "hwndOwner"),
Arg(Int64, "hInstance"),
Arg(Int32, "rgbResult"),
Arg(AnsiString(64), "lpCustColors"),
Arg(Int64, "Flags"),
Arg(Int64, "lCustData"),
Arg(Int64, "lpfnHook"),
Arg(UnicodeString, "lpTemplateName"),
Update,
"CHOOSECOLOR"
),
Returns(Int32)
);
lStructSize = 72;
hwndOwner = 0;
lstRGB = As List( ( Matrix( Color To RGB(intColor) ) * 255 ) );
hexRGB = Concat(Substr(Hex(lstRGB[3], "integer"),7,2), Substr(Hex(lstRGB[2], "integer"),7,2), Substr(Hex(lstRGB[1], "integer"), 7,2));
rgbResult = Hex to Number( hexRGB );
lpCustColors = Repeat(Hex To Char( "FFFFFF00" ), 16);
lCustData = 0;
lpfnHook = 0;
intRc = dll << PickColor(lStructSize, 0, 0, rgbResult, lpCustColors, Flags,0,0,"");
If(intRC == 0,
Return(intColor)
,
hexRGB = Hex(rgbResult, "integer");
Return( RGB Color( Hex to Number(Substr(hexRGB,7,2)), Hex to Number(Substr(hexRGB,5,2)), Hex to Number(Substr(hexRGB,3,2) ) ) );
);
dll << Unload DLL();
);
);