ページ 11

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

Posted: 2012年6月16日(土) 18:43
by MoNoQLoREATOR
SetClassLongPtr(GetMainWindowHandle(), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_WAIT) )

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

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

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

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

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

Posted: 2012年6月16日(土) 19:48
by みけCAT

コード:

LoadCursor(NULL, IDC_WAIT)

コード:

LoadImage(NULL, IDC_WAIT, IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR)
ではダメでしょうか?

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

Posted: 2012年6月16日(土) 21:44
by naohiro19
引数は以下のようになっています。

コード:

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を指定してください。

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

Posted: 2012年6月16日(土) 23:54
by MoNoQLoREATOR
>>みけ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;
}

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

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

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

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

Posted: 2012年6月17日(日) 01:21
by ISLe
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;
}

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

Posted: 2012年6月17日(日) 14:10
by MoNoQLoREATOR
下記のコードでためしてみましたが、マウスカーソルの形状は変わりませんでした。

コード:

#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;
}

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

Posted: 2012年6月18日(月) 01:56
by ISLe
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

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

Posted: 2012年6月18日(月) 19:56
by MoNoQLoREATOR
ありがとうございます。
解決しました。

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

コード:

#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さん お答えいただき本当にありがとうございました。