NX二次开发-调内部函数UGS::UICOMP_enum::set_width(int)更改BlockUI的枚举控件宽度


  • 版本

NX11+VS2013

 

  • 内容说明

这个内部函数的设置方法,我之前不会,是QQ群里的一位大佬分享出来的。

关于这块,我也百度搜了一下,找到了几个相关的。

1.直接手动修改BlockUI界面

在低版本是可以手动设置的BlockUI的(NX9是可以的,到了NX11就不行了)

 

 图片为转载,出处如下

https://www.cnblogs.com/bizca/p/4998344.html

 

2.调用内部函数

UGS::UICOMP_enum::set_width(int)

相关参考资料 https://blog.csdn.net/u012077233/article/details/118557584

 

  • 代码
static void setEnumWidth(const tag_t uiTag, int width)
{
    HMODULE uifw = LoadLibrary("libuifw");
    HMODULE syss = LoadLibrary("libsyss");
    typedef void*(*TagToPtr_fp_t)(tag_t);
    typedef void(*setWidth_fp_t)(void*, int);

    TagToPtr_fp_t TagToPtr = NULL;
    setWidth_fp_t setWidth = NULL;

    char* ptrName = "?TAG_ask_pointer_of_tag@@YAPEAXI@Z";
    char* widthName = "?set_width@UICOMP_enum@UGS@@UEAAXH@Z";

    TagToPtr = (TagToPtr_fp_t)GetProcAddress(syss, ptrName);
    setWidth = (setWidth_fp_t)GetProcAddress(uifw, widthName);

    if (TagToPtr != NULL && setWidth != NULL)
    {
        setWidth(TagToPtr(uiTag), width);
    }
    FreeLibrary(uifw);
    FreeLibrary(syss);
}

 

  • 使用方法

加上#include <windows.h>头文件

如果提示这个问题,就添加#undef CreateDialog

 

 

 

去initialize_cb回调里使用函数

//------------------------------------------------------------------------------
//Callback Name: initialize_cb
//------------------------------------------------------------------------------
void TestEnmuDemo::initialize_cb()
{
    try
    {
        group = dynamic_cast<NXOpen::BlockStyler::Group*>(theDialog->TopBlock()->FindBlock("group"));
        enum0 = dynamic_cast<NXOpen::BlockStyler::Enumeration*>(theDialog->TopBlock()->FindBlock("enum0"));
        enum01 = dynamic_cast<NXOpen::BlockStyler::Enumeration*>(theDialog->TopBlock()->FindBlock("enum01"));
        enum02 = dynamic_cast<NXOpen::BlockStyler::Enumeration*>(theDialog->TopBlock()->FindBlock("enum02"));


        setEnumWidth(enum0->Tag(), 5);
    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        TestEnmuDemo::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
}
  • 演示

 

最后感谢大佬的分享,谢谢大佬。

 

阿飞

2021年10月20日

 

2021年10月24日补充

这是另外一位大佬分享到QQ群的

void* GetUITag(tag_t topBlockTag)//枚举对话框调用内部函数另一种方法
{
    char Lib[256] = "";
    char UGII_BASE_DIR[256] = "";
    strcpy(UGII_BASE_DIR, getenv("UGII_BASE_DIR"));
    sprintf(Lib, "%s%s", UGII_BASE_DIR, "\\NXBIN\\libjam.dll");
    typedef void* (*load_ufusr_f_p_t1)(tag_t pointer);
    load_ufusr_f_p_t1 GetTag = NULL;
    int error = UF_load_library(Lib, "JAM_lookup_tag", (UF_load_f_p_t*)&GetTag);
    void* topBlockPtr = GetTag(topBlockTag);
    UF_unload_library(Lib);
    return topBlockPtr;
}
        UF_initialize();

        char* temPath = "";
        UF_translate_variable("UGII_BASE_DIR", &temPath);
        char LibDir[256] = "";
        strcpy_s(LibDir, temPath);
        strcat_s(LibDir, "\\NXBIN\\libuifw.dll");
        typedef void(*load_ufusr_f_p_t)(void*, int);
        load_ufusr_f_p_t EnumSetWidth = NULL;
        int error = UF_load_library(LibDir,
            "?set_width@UICOMP_enum@UGS@@UEAAXH@Z",
            (UF_load_f_p_t*)&EnumSetWidth);
        if (EnumSetWidth != NULL)
        {
            EnumSetWidth(GetUITag(enum0->Tag()), 8);
        }
        UF_unload_library(LibDir);

        UF_terminate();

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM