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);
作品。103
viaの間接性は、resource.h
ravenspoint のポイントを理解しようとするときの私の混乱の原因でした:)
ただし、リソースapp.rc
の および 文字列識別子を使用せずに を使用することはresource.h
、おそらく設計者の最初の意図でした。したがって、書く
mycursor CURSOR "MYCURSOR.CUR"
リソース スクリプト ファイル コンパイラが"mycursor"
、LoadCursor()
関数内またはwxCursor("mycursor", ...);
. これは VZ が推奨する方法であり、指摘された wx サンプルに含まれています。
cursor.rc2
マウス カーソル リソース情報を含む独自のリソースを作成しました。次に、他のリソース情報と結合するためにファイルに.rc2
含まれます...そしてそれは機能します! app.rc
:) 要約は次のとおりです:リソースの識別に番号を使用しないでください。文字列を使用します。
あなたの時間と経験をありがとう、Petr