1

同じ目に会った人いますか?Adobe AI 用のプラグインには、カスタム カーソルがあります。これは XML 記述を含む PNG ファイルであり、PNG と XML は .r REZ ファイルで宣言されています。sUser->SetCursor(resID, iResourceManager); カーソルを設定するために使用されます。また、AI CS6 でも動作しますが、16.0.3 アップデート パッケージをインストールした後、カスタム カーソルはなく、代わりにデフォルトの黒い矢印だけが表示されました。高解像度の画面解像度をサポートしているため、この更新によりカーソルにいくつかの変更が加えられることはわかっていますが、AI カーソルは詳細を失うことなくサイズを変更できます。カーソル リソースを追加するにはどうすればよいですか?

4

1 に答える 1

1

昨日、この問題に対処しました。はAIResourceManagerHandle有効に見えましたが、何を試しても への呼び出しはエラーをsAIUser->SetCursor()返しました。CANTカーソルPNGIID は正しかったし、XML_ホット スポット ID も正しかったなど。カーソル用にさまざまな高解像度の PNG を作成しようとしましたが、どちらも役に立ちませんでした。さらに新しいバージョンの SDK もありますが、差分を実行したところ、関連のないコメントがいくつか変更されただけでした。

Mac 用のプラットフォーム コードを使用して回避し、Windows 用の Illustrator コードを使い続けました。既にカーソル クラスが用意されているため、はるかに簡単になりました (まだ持っていない場合は作成することをお勧めします)。最終的には次のようになりました。

class Cursor
{
    public:
        Cursor(const int cursorID_);
        virtual ~Cursor();
        virtual void enable();

    private:    
        int __cursorID;
        #if defined(MAC_ENV)
            NSCursor* __cursorMac;
        #endif
};

bool getResourceData(
    const long type_,
    const int id_,
    char*& data__,
    int& size__
) const
{
    static const int oneMeg = 1048576;

    data__ = NULL;
    size__ = 0;

    AIDataFilter* aidf = NULL;
    AIErr error = sAIDataFilter->NewResourceDataFilter(
        yourPluginRef,
        type_,
        id_,
        "",
        &aidf
    );
    if(error != kNoErr || !aidf)
        return false;

    // This is the max size to read when going in to ReadDataFilter(),
    // and the actual size read when coming out.
    size_t tmpSize = oneMeg;

    data__ = new char[ oneMeg ];
    error = sAIDataFilter->ReadDataFilter(aidf, data__, &tmpSize);

    AIErr ulError = kNoErr;
    while(aidf && ulError == kNoErr)
    {
        ulError = sAIDataFilter->UnlinkDataFilter(aidf, &aidf);
    }

    if(error != kNoErr)
    {
        delete[] data__;
        return false;
    }

    size__ = tmpSize;
    return true;
}

Cursor::Cursor(const int cursorID_)
{
    this->__cursorID = cursorID_;

    #if defined(MAC_ENV)
        this->__cursorMac = nil;

        char* pngData = NULL;
        int pngDataSize = 0;
        if(!getResourceData('PNGI', this->__cursorID, pngData, pngDataSize))
            return;

        NSPoint hs = NSMakePoint(0.0, 0.0);
        char* xmlData = NULL;
        int xmlDataSize = 0;
        if(getResourceData('XML_', this->__cursorID, xmlData, xmlDataSize))
        {
            std::string xmlStr(xmlData, xmlDataSize);
            // Parse xmlStr however you prefer. If you have an XML parser, rock on.
            // Otherwise, the XML is so simple that an sscanf() call should work.

            delete[] xmlData;
            xmlData = NULL;
        }

        NSData* pngNSD = [[NSData alloc] initWithBytes:pngData length:pngDataSize];
        delete[] pngData;
        pngData = NULL;

        NSImage* pngNSI = [[NSImage alloc] initWithData:pngNSD];
        [pngNSD release];
        pngNSD = nil;

        this->__cursorMac = [[NSCursor alloc] initWithImage:pngNSI hotSpot:hs];
        [pngNSI release];
        pngNSI = nil;
    #endif
}

Cursor::~Cursor()
{
    #if defined(MAC_ENV)
        if(this->__cursorMac)
        {
            [this->__cursorMac release];
            this->__cursorMac = nil;
        }
    #endif
}

void Cursor::enable()
{
    #if defined(MAC_ENV)
        if(this->__cursorMac)
        {
            [this->__cursorMac set];
        }
    #elif defined(WIN_ENV)
        sAIUser->SetCursor(this->__cursorID, yourCursorRsrcMgr);
    #endif
}

#import <AppKit/AppKit.h>プロジェクトの構成方法によっては、ソース ファイルを Objective-C++ および/またはどこかでコンパイルするように設定する必要がある場合があります。

于 2012-12-18T17:28:53.313 に答える