WinAPIのLoadImage関数の使い方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

WinAPIのLoadImage関数の使い方について

#1

投稿記事 by MoNoQLoREATOR » 14年前

SetClassLongPtr(GetMainWindowHandle(), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_WAIT) )

マウスカーソルの形状を変えたいとき、私は上記のようにしているのですが、LoadCursor関数は推奨されていないそうですね。
代わりにLoadImage関数を使えと書かれていました。
しかし、その関数の使い方がわからなかったため、そのままにしていました。

もちろんこれ以外の方法でマウスカーソルの形状を簡単に変える方法があるのならば教えてください。
SetCursor関数を使用する方法は知っていますが、マウスを動かすと元に戻ってしまうので使い物になりませんでした。

最後に、GetMainWindowHandle()でわかったと思いますが、念のため DXライブラリを使用することを前提にお願いします。

ご教授よろしくお願いいたします。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: WinAPIのLoadImage関数の使い方について

#2

投稿記事 by みけCAT » 14年前

コード:

LoadCursor(NULL, IDC_WAIT)

コード:

LoadImage(NULL, IDC_WAIT, IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR)
ではダメでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

Re: WinAPIのLoadImage関数の使い方について

#3

投稿記事 by naohiro19 » 14年前

引数は以下のようになっています。

コード:

HANDLE LoadImage(
HINSTANCE hinst,   // インスタンスのハンドル
LPCTSTR lpszName,  // イメージの名前または識別子
UINT uType,        // イメージのタイプ
int cxDesired,     // 希望する幅
int cyDesired,     // 希望する高さ
UINT fuLoad        // ロードのオプション
);
インスタンスハンドルは

コード:

HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL);
で取得ができます。
第二引数はMAKEINTRESOURCEマクロです。
第三引数はIMAGE_CURSORを指定します。
第四・第五引数は0を指定します。
第六引数はLR_DEFAULTSIZEを指定してください。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: WinAPIのLoadImage関数の使い方について

#4

投稿記事 by MoNoQLoREATOR » 14年前

>>みけCATさん
>>naohiro19さん
返信ありがとうございます。

下記2種類でそれぞれためしてみましたが、マウスカーソルの形状はいずれも変わりませんでした。

コード:

#include "DxLib.h"
#include <windows.h>

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int ){
	ChangeWindowMode( TRUE );
	SetWindowText( "DxLib:" DXLIB_VERSION_STR );
	if ( DxLib_Init( ) == -1 ) return -1;
	SetMouseDispFlag( TRUE );
	int white = GetColor( 255, 255, 255 );
	SetDrawScreen( DX_SCREEN_BACK );



	
	SetClassLongPtr( GetMainWindowHandle( ), GCL_HCURSOR, (LONG)LoadImage(NULL, IDC_WAIT, IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR) );	//1種類目。みけCATさん案
	SetClassLongPtr( GetMainWindowHandle( ), GCL_HCURSOR, (LONG)LoadImage(NULL, IDC_WAIT, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE) );	//2種類目。naohiro19さん案



	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
		ClearDrawScreen( );
		DrawString( 0, 0, "changed", white);
		ScreenFlip( );
	}

	DxLib_End( );
	return 0;
}

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: WinAPIのLoadImage関数の使い方について

#5

投稿記事 by ISLe » 14年前

MoNoQLoREATOR さんが書きました:SetCursor関数を使用する方法は知っていますが、マウスを動かすと元に戻ってしまうので使い物になりませんでした。
ウィンドウクラスにカーソルがセットされているとすぐ元に戻ってしまいます。
SetCursorのリファレンスに書いてあります。

DXライブラリの初期化後に一回だけSetClassLongPtrでカーソルのハンドルをNULLに設定して、SetCursorで変更するほうがシンプルなコードになるような気がします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: WinAPIのLoadImage関数の使い方について

#6

投稿記事 by ISLe » 14年前

SetCursor使うほうがめんどうくさくなりそうですね。
前言撤回します。

これでどうでしょう。

コード:

#define OEMRESOURCE
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE);
	SetMouseDispFlag(TRUE);
	if (DxLib_Init() != 0) return 0;
	SetDrawScreen(DX_SCREEN_BACK);

	SetClassLongPtr(GetMainWindowHandle(), GCLP_HCURSOR, (LONG_PTR)(HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE));

	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
		ClearDrawScreen();
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: WinAPIのLoadImage関数の使い方について

#7

投稿記事 by MoNoQLoREATOR » 14年前

下記のコードでためしてみましたが、マウスカーソルの形状は変わりませんでした。

コード:

#define OEMRESOURCE
#include "DxLib.h"
#include <windows.h>
#include <Winuser.h>

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int ){
	ChangeWindowMode( TRUE );
	SetWindowText( "DxLib:" DXLIB_VERSION_STR );
	if ( DxLib_Init( ) == -1 ) return -1;
	SetMouseDispFlag( TRUE );
	int white = GetColor( 255, 255, 255 );
	SetDrawScreen( DX_SCREEN_BACK );



	//SetClassLongPtr( GetMainWindowHandle( ), GCL_HCURSOR, (LONG)LoadCursor( NULL, IDC_WAIT ) );	//1種類目。修正前
	//SetClassLongPtr( GetMainWindowHandle( ), GCL_HCURSOR, (LONG)LoadImage(NULL, IDC_WAIT, IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR) );	//2種類目。みけCATさん案
	//SetClassLongPtr( GetMainWindowHandle( ), GCL_HCURSOR, (LONG)LoadImage(NULL, IDC_WAIT, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE) );	//3種類目。naohiro19さん案
	SetClassLongPtr(GetMainWindowHandle(), GCLP_HCURSOR, (LONG_PTR)(HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE) );


	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
		ClearDrawScreen( );
		DrawString( 0, 0, "changed", white);
		ScreenFlip( );
	}

	DxLib_End( );
	return 0;
}

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: WinAPIのLoadImage関数の使い方について

#8

投稿記事 by ISLe » 14年前

LoadImageにLR_SHAREDフラグを追加してください。
必須らしいです。

コード:

SetClassLongPtr(GetMainWindowHandle(), GCLP_HCURSOR, (LONG_PTR)(HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED));
投稿する際うっかり削ってしまいました。
MSDNライブラリ英語版には記述があるのに日本語版にないし。
http://msdn.microsoft.com/en-us/library ... s.85).aspx
http://msdn.microsoft.com/ja-jp/library/cc364835.aspx

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: WinAPIのLoadImage関数の使い方について

#9

投稿記事 by MoNoQLoREATOR » 14年前

ありがとうございます。
解決しました。

一応ソースコードを載せておきます。

コード:

#define OEMRESOURCE
#include "DxLib.h"
#include <windows.h>
#include <Winuser.h>

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int ){
	ChangeWindowMode( TRUE );
	SetWindowText( "DxLib:" DXLIB_VERSION_STR );
	if ( DxLib_Init( ) == -1 ) return -1;
	SetMouseDispFlag( TRUE );
	int white = GetColor( 255, 255, 255 );
	SetDrawScreen( DX_SCREEN_BACK );


	SetClassLongPtr(GetMainWindowHandle(), GCLP_HCURSOR, (LONG_PTR)(HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED) );


	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
		ClearDrawScreen( );
		DrawString( 0, 0, "changed", white);
		ScreenFlip( );
	}

	DxLib_End( );
	return 0;
}
みけCATさん、naohiro19さん、ISLeさん お答えいただき本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る