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