1

wxWidges (ネイティブ C++) を使用してアプリケーションを書き直しています。Visual Studio リソース エディターを使用して作成されたユーザー定義のマウス カーソルがいくつかあります。リソース エディターは、ビットマップとその他の情報を含む MYCURSOR.CUR のようなファイルを作成し、次のapp.rcようなエントリをファイルに 1 つ追加します。

IDC_MYCURSOR      CURSOR     "MYCURSOR.CUR"

...そして、生成されたようなものに1行追加しますresource.h:

#define  IDC_MYCURSOR 103

アプリケーションがコンパイルされると、コンパイルされたリソースはバイナリ形式になり、app.exe. wxWidgets フレームワークが使用されていない場合、以下を呼び出すことができます:

HCURSOR hCur = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_MYCURSOR));

ここhInstanceで、 はカーソル リソースを含む実行可能ファイルを持つアプリケーションのハンドルです (コンパイルされたバイナリ形式で、ここでは 内にありますapp.exe)。

wxWidgets を使用すると、クラスのインスタンスを作成しwxCursor、それにカーソルでファイルの名前を渡すことができますwxCursor cursor(wxT("MYCURSOR.CUR"));。ただし、MYCURSOR.CURファイルが見つかる必要があります (たとえば、 と同じディレクトリに配置されますapp.exe)。つまり、にアタッチされたコンパイル済みリソースは無視されapp.exeます。名前のファイルが見つからない場合、カーソル形状は読み込まれません。

Windows で、リソース番号に基づいてリソースからカーソルをロードできるようにする方法はありますか?

UnixベースのOSに移植可能な方法でコードを記述する必要があることを理解しています。Windows リソースまたはMYCURSOR.CURファイルを、生成された実行可能ファイルにコンパイルまたは添付される形式に変換するための推奨される方法はありますか?

アップデート

wxWidget ディスカッション フォーラムで、upCASE (2005 年 4 月) による.rc [Win] からの wxCursorのヒントを見つけました。

wxCursor( "#1", wxBITMAP_TYPE_CUR_RESOURCE );

私は自分の番号でそれを使用しようとしましたが、うまくいくようですが、理由はわかりません. それから私はそれを次のように改善しました:

#define STR(value) #value
#define RES(value) wxT("#") wxT(STR(value))
...
wxCursor cur(RES(IDC_MYCURSOR), wxBITMAP_TYPE_CUR_RESOURCE);

私はそれが醜く、正しい方法ではない可能性が高いと考えています。とにかく、それを説明できますか?

また、 の中を見るとc:\wxWidgets-2.9.4\src\msw\cursor.cpp、文字列引数を取るコンストラクターがそれをファイル名として解釈することがわかりました (少なくとも引数の名前は ですfilename)。コード...

switch ( kind )
{
    case wxBITMAP_TYPE_CUR_RESOURCE:
        hcursor = ::LoadCursor(wxGetInstance(), filename.t_str());
        break;
...

LoadCursor()は、スタック Windows カーソルに使用されない方法で使用されることを示唆しています (そうでない場合、最初の引数は NULL にする必要があります)。::LoadCursor引数の名前はLPCTSTR lpCursorNameであり、ドキュメントには

ロードするカーソル リソースの名前。または、このパラメーターは、下位​​ワードのリソース識別子と上位ワードのゼロで構成できます。MAKEINTRESOURCE マクロを使用して、この値を作成することもできます。

私も試してみました

wxCursor cur(MAKEINTRESOURCE(IDC_MYCURSOR), wxBITMAP_TYPE_CUR_RESOURCE);

wxCursorしかし、コンストラクターが文字列変換を適用するため、失敗します。上記を参照してくださいfilename.t_str()。これについてコメントいただけますか?

解決済み(さらに、私が直面したことの説明...)

以前は、IDE を介してのみ Windows アプリケーション リソースを操作したり、app.rcファイルを介して直接小さなことしか行っていませんでした。VZ の回答ravenspointの回答の助けを借りて深く掘り下げると、最初の意味と Microsoft が過去とその後に行ったこと、および私の混乱の原因をよりよく理解できるかもしれません。

まず、Visual Studio IDE を使用して何らかのリソース (マウス カーソルなど) を作成すると、自動的に数値 ID (たとえば103) が与えられます。番号は自動的に取り込まれresource.hます#define IDC_MYCURSOR 103。つまり、マクロ識別子も与えられます。マクロ識別子は、カーソルに関する情報が次のapp.rcように に挿入されるときに使用されます。

IDC_MYCURSOR      CURSOR     "MYCURSOR.CUR"

resource.hに含まれているためapp.rc、おそらくほぼ同等です。

103               CURSOR     "MYCURSOR.CUR"

リソースコンパイラはおそらく103数値を#103文字列などに変換します。おそらくそのため、wxCursor("#103", wxBITMAP_TYPE_CUR_RESOURCE);作品。103viaの間接性は、resource.hravenspoint のポイントを理解しようとするときの私の混乱の原因でした:)

ただし、リソースapp.rcの および 文字列識別子を使用せずに を使用することはresource.h、おそらく設計者の最初の意図でした。したがって、書く

mycursor          CURSOR     "MYCURSOR.CUR"

リソース スクリプト ファイル コンパイラが"mycursor"LoadCursor()関数内またはwxCursor("mycursor", ...);. これは VZ が推奨する方法であり、指摘された wx サンプルに含まれています。

cursor.rc2マウス カーソル リソース情報を含む独自のリソースを作成しました。次に、他のリソース情報と結合するためにファイルに.rc2含まれます...そしてそれは機能します! app.rc:) 要約は次のとおりです:リソースの識別に番号を使用しないでください。文字列を使用します。

あなたの時間と経験をありがとう、Petr

4

2 に答える 2

2

数値 ID では、あまり明白ではない を使用する必要がありますwxCursor("103")。これが、wxWidgets で通常文字列名を使用する理由です (my_cursor上記の回答のように)。

もちろん、あなたもすることができます

#include <wx/cpp.h>

wxCursor cursor(wxSTRINGIZE(IDC_CURSOR));
于 2012-10-03T07:57:30.387 に答える
1

これは機能しませんか?

リソースファイル内

my_cursor CURSOR "mycursor.cur"

コード内

wxCursor(my_cursor)
于 2012-10-02T19:28:42.357 に答える