開発環境は,Visual studio 2008 Professional Edition/
Visual C++ 2008/Windows Vista/です。
Windowsプログラミングをしています。
猫でもわかる~を読んだ程度のレベルです。
現在,ツールバーは作成し,今後以下のような動作を実現させたいと考えています。
1)ボタンをクリックしたら,自作のカーソルファイル(cursor1.cur)を読み込んでその形にカーソルが変わる。
2)そのカーソルのまま,ドラッグ&ドロップし,フォームにその図形を置く(描く)。
3)図形を置いたら,カーソルを元に戻す。
このような流れです。
たぶん,LoadImage()でカーソルファイルを読み込み,
SetCursor()でカーソルの形を変えると思うのですが,
以下のようなプログラムを書いてもうまくいきませんでした。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
INITCOMMONCONTROLSEX cc;
static HWND hTool;
static HMENU hMenu;
switch (msg) {
case WM_CREATE:
hMenu = GetMenu(hWnd);
cc.dwSize = sizeof(INITCOMMONCONTROLSEX);
cc.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&cc);
hTool = MyCreateToolbar(hWnd);
break;
case WM_COMMAND:
switch (LOWORD(wp)) {
case ID_BUTTON1:
HCURSOR hcur;
hcur = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 0, 0, LR_SHARED);
SetCursor(hcur);
//ドラッグ&ドロップ処理
//hcur = (HCURSOR)GetClassLongPtr(hwnd, GCL_HCURSOR); //カーソルを元に戻す
break;
一部分ですが,このような感じです。
ちなみにLoadImageの第一引数をNULLからhInst(HINSTANCE hInst;グローバル変数)に変えたところ,式を定義できないなどのエラーがでました。
ウインドウクラスの定義は,
//ウィンドウ・クラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;//プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = TEXT("MYMENU");//メニュー名
wc.lpszClassName = szClassName;
wc.hIconSm = NULL;
return (RegisterClassEx(&wc));
}
以上の通りです。
ボタンを押してもうんともすんともいいません。
例えば,ウインドプロシージャのところを,
case ID_BUTTON1:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
と変更したら,普通に終了メッセージが出ます。
プログラム上どこがおかしいのか教えてください。
よろしくお願いします。
※字下げされずに読みづらくてすいません。
No.1ベストアンサー
- 回答日時:
こんにちは。
カーソルリソースをロードする時、LoadImage()APIの第一パラメータに自分自身のモジュールハンドルを渡していないのが原因なのでは?
>>hcur = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 0, 0, LR_SHARED);
↓
>>hcur = (HCURSOR)LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 0, 0, LR_SHARED);
http://msdn.microsoft.com/ja-jp/library/cc364835 …
第一引数がおかしいんじゃないかなとは思っていたのですが,
ご指摘の通りに変更したらうまく動作してくれました!
かなり試行錯誤しながら悩んでいたので本当に助かりました。
どうもありがとうございました。
No.2
- 回答日時:
hcurがローカル変数のため、リソース解放するときにはハンドル失われているのでリソースリークする。
# 先に#1さんの指摘している部分の修正が必要ですが。
WM_COMMANDなどでSetCursor()しても、マウスカーソルを移動させるとウィンドウクラスに設定されたマウスカーソルへの再設定が行われる。
# クライスント領域内ではウィンドウクラスに登録したカーソルにOSが変更することで、ウィンドウのふちでのサイズ変更カーソルから戻せる。
とりあえず、リソースのハンドルを失わないようにstatic変数にするなどなんらかの対策を行いましょう。
WM_SETCURSORイベント時にSetCursor()しましょう。
# Spy++で監視しているとマウス移動と同時に大量に投げられています。
まだ,フォームの外へカーソルが出たら戻ってしまったり,
完璧な動作とは言えませんが,ひとつ壁を越えることができた気がします。
ご意見を参考に,さらにつっこんだ対策を練ろうと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 配列を使ったコードに直していただけますか 4 2023/05/06 15:18
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- その他(スマートフォン・携帯電話・VR) Bluetoothイヤホンとスマホの音量を連動させたい 1 2023/03/25 15:55
- 猫 飼い猫の乳腺腫瘍 1 2023/01/26 03:00
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- モニター・ディスプレイ 「.cur」のアイコン表示について 4 2023/03/04 10:21
- その他(IT・Webサービス) ANDROIDタブレットでZOOMのテストサイトを開いてもテストが始まりません https://ww 1 2023/08/26 16:31
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++のcase文の書き方
-
エディットコントロール入力時...
-
オーバーレイみたいな処理がしたい
-
プログラミングでエラーが出ま...
-
エディットボックスの背景の色...
-
return文がない場合の戻り値は...
-
COMPORTマルチスレッドで例外発生
-
【Windowsアプリ】ファイルのド...
-
C言語win32api、エディットボッ...
-
Win32APIでウィンドウを中央に...
-
PeekMessageについて
-
既約分数の表示プログラム
-
マイナスからプラスへ転じた時...
-
プログラムでの数字につく”f”の...
-
*をユーザーが入力した数字の数...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
Enterキーを押されたら次の処理...
-
DWORDの実際の型は何でしょうか
-
複数桁10進数の*桁目だけを抽出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
PeekMessageについて
-
ウィンドウ非表示に時に表示し...
-
C#のswitch文を簡略化したいの...
-
C言語win32api、エディットボッ...
-
音量調節
-
LoadImageを使用し、タイトルバ...
-
プログラミングでエラーが出ま...
-
エディットコントロール入力時...
-
ウィンドウハンドルがメッセー...
-
ボタンの色(WINAPI)
-
画像を表示したいのですが……
-
WINAPIでキーから文字列を入力...
-
エラー Run-Time Check Failur...
-
エディットボックスの背景の色...
-
Win32APIでアイコンファイルを...
-
WM_KEYDOWNでPrtScを捕まえる方...
おすすめ情報