SetWindowPos関数でサイズを変更できない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
腹減った丸

SetWindowPos関数でサイズを変更できない

#1

投稿記事 by 腹減った丸 » 10年前

コード:

#include "DxLib.h"
#include <windows.h>
#include "controll.h"
#include "dialog.h"
#include "image.h"
#include "input.h"

/* ウィンドウ情報 */
#define	WINDOW_DOUBLE		(true)		// 二重起動フラグ
#define WINDOW_STYLE		(0x2)		// ウィンドウスタイル
#define WINDOW_TRANS		(true)		// ウィンドウ透過フラグ
#define WC_R				(0)			// 背景色R
#define WC_G				(0)			// 背景色G
#define WC_B				(0)			// 背景色B

/* 画像情報構造体 */
typedef struct{
	int handle;
	GrInfoF_t info;
}Graph_t;

/* ウィンドウ情報構造体 */
typedef struct{
	HWND hWnd;
	GrInfoF_t info;
}Window_t;

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
	/*ウィンドウ情報の書き換え*/
	SetDoubleStartValidFlag( WINDOW_DOUBLE );			// 多重起動の許可
	ChangeWindowMode( true );							// ウィンドウモードに設定
	SetWindowStyleMode( WINDOW_STYLE );					// ウィンドウスタイルの変更(枠なし)
	SetUseBackBufferTransColorFlag( WINDOW_TRANS );		// ウィンドウの透過を許可
	SetBackgroundColor( WC_R, WC_G, WC_B );				// 背景色をセット
	SetTransColor( WC_R, WC_G, WC_B ) ;					// 透過色をセット
	DxLib_Init();										// ウィンドウ生成&ライブラリ初期化
	SetDrawMode( DX_SCREEN_BACK );						// 描画先の設定

	/* ダイアログから画像呼び出し */
	FileInfo file = OpenFileToDialog( "画像の選択", "画像ファイル(*.jpg,*.png,*.bmp)\0*.jpg;*.png;*.bmp\0全て(*.*)\0*.*\0\0", "" );
	/* キャンセルされたらプログラムの終了 */
	if(file.path[0] == '\0'){
		DxLib_End();
		return 1;
	}
		
	/* 変数宣言と必要な情報の取得 */
	Graph_t	graph = { LoadGraph(file.path), GetNowImageInfoF( 0, 0, graph.handle ) };	// 画像構造体に画像読み込みと画像の情報取得
	Window_t window = { GetMainWindowHandle() };										// ウィンドウ構造体のwindow.hWndにウィンドウハンドル取得

	/* ループ */
	SetWindowPos( window.hWnd, HWND_TOPMOST, 0, 0, 80, 80, SWP_NOZORDER);				// ウィンドウを常に最前面とする
	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
		
		DrawGraphF( graph.info.x1, graph.info.y1, graph.handle, true );

	}
	
	DxLib_End();
	return 0;
}
画面上にマスコットキャラ的な奴を配置するツールを作ろうと思い立ち
背景を透過させた枠なしウィンドウを最前面表示させるプログラムを組んだのですが、
ウィンドウの大きさが変更できず困っています。

上記のソースではSetWindowPos()でウィンドウのサイズを80x80に設定しているのですが
画像を読み込んでいざ表示されると80x80になっておらず、SetWindowSize()関数を使ってみても変更されません。
何が原因なのかご教授願います。。。

アバター
Ketty
記事: 103
登録日時: 11年前

Re: SetWindowPos関数でサイズを変更できない

#2

投稿記事 by Ketty » 10年前

提示されたソースコードは私の環境ではビルドできなかったので、
以下のように最小限なコードで実験してみたところ、80*80になりました。

Test.cpp

コード:

#include <DxLib.h>		// DXライブラリを使用します

// メイン関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	//++++++++++++++++++++++++++++
	// DXライブラリ設定
	//++++++++++++++++++++++++++++
	// ウィンドウモードで起動
	DxLib::ChangeWindowMode( TRUE ) ;
	// 画面モード設定
	DxLib::SetGraphMode( 640, 480, 32 ) ;

	// DXライブラリ初期化(失敗したら終了)
	if( DxLib::DxLib_Init() != 0 ){ return 0 ; }

	// 80*80に設定
	DxLib::SetWindowSize( 80, 80 ) ;

	// 描画先を裏画面に設定
	DxLib::SetDrawScreen( DX_SCREEN_BACK ) ;

	//++++++++++++++++++++++++++++
	// メインループ
	//++++++++++++++++++++++++++++
	while( DxLib::ProcessMessage() == 0 )
	{
		// ESCキーで終了
		if( DxLib::CheckHitKey( KEY_INPUT_ESCAPE ) != 0 ){ break ; }

		// ピンクで四角形を表示
		DxLib::DrawBox( 0, 0, 200, 200, DxLib::GetColor( 255, 0, 255 ), TRUE ) ;

		// 画面反映
		if( DxLib::ScreenFlip() != 0 ){ break ; }

		// 裏画面クリア
		if( DxLib::ClearDrawScreen() != 0 ){ break ; }

		// しばらく待つ
		Sleep( 10 ) ;
	}

	// DXライブラリ終了
	DxLib::DxLib_End() ;

	// ソフトの終了
	return 0 ;
}
DXライブラリのSetWindowSize関数も効かないということですが、
例えば、DXライブラリのバージョンが古いとかいうことはありませんか。

上記のような、ひな形に対して、少しずつご自身のソースコードをつけ加えてゆくか、
逆にご自身のソースコードから1行ずつコメントアウトしてゆけば、どの行が原因かわかると思います。

腹減った丸

Re: SetWindowPos関数でサイズを変更できない

#3

投稿記事 by 腹減った丸 » 10年前

Kettyさんありがとうございます。
改めてプログラムを組み直してなんとかサイズ変更する事が出来ました。
ですが違う問題も発生してしまいました。
以下現在のコードです。

コード:

#include "DxLib.h"
#include "main.h"

/* メイン */
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
	/* ウィンドウ設定 */
	SetDoubleStartValidFlag( true );			// 多重起動のON
	SetAlwaysRunFlag( true );					// 非アクティブ時の処理をON
	ChangeWindowMode( true );					// ウィンドウモードをON
	SetUseBackBufferTransColorFlag( true );		// ウィンドウ透過をON
	DxLib_Init();								// DXライブラリ初期化
	SetTransColor( 0, 0, 0 );					// 画面の透過色を指定
	SetWindowPos( GetMainWindowHandle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE); // 常に最前面へ設定
	

	/* 画像のパスを取得 */
	FileInfo file = OpenFileToDialog( "画像の選択", "画像ファイル(*.jpg,*.png,*.bmp)\0*.jpg;*.png;*.bmp\0全て(*.*)\0*.*\0\0", "" );


	/* その他設定 */
	int w = GetGraphWidth(file.path), h = GetGraphHeight(file.path);					// 画像の縦横幅を取得
	// SetGraphMode( w, h, 16 );														// 画像とウィンドウのサイズを同じに設定
	Graph_t graph = { LoadGraph( file.path ), GetNowImageInfoF( 0, 0, graph.handle ) }; // SetGraphMode()で破棄された画像を改めて読み込み


	SetDrawMode( DX_SCREEN_BACK );														// 描画先を裏画面に設定


	/* ループ */
	while( !Update() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey( KEY_INPUT_ESCAPE ) ){




		// 画像を描画
		DrawRotaGraphF( (float)graph.info.x0, (float)graph.info.y0, graph.info.ExRate, graph.info.angle, graph.handle, true );




	}

	/* 終了処理 */
	DxLib_End();
	return 0;

}


ウィンドウの透過をONにした状態で30行目のSetGraphMode( w, h, 16 );を記述すると
何故か何も表示されなくなってしまいます。 SetGraphMode( w, h, 16 );のコメントアウトを解除して
逆にSetUseBackBufferTransColorFlag( true );の部分をコメントアウトすると画像のサイズに合わせて
ウィンドウサイズが変更されるのですが、SetUseBackBufferTransColorFlag()とSetGraphMode()の併用
は無理なことなのでしょうか?それともプログラムに不備があるだけでしょうか?
改めてアドバイスお願いします。

ついでにプロジェクトも置いておきます。
http://www.dotup.org/uploda/www.dotup.org5347955.zip

腹減った丸

Re: SetWindowPos関数でサイズを変更できない

#4

投稿記事 by 腹減った丸 » 10年前

すいません、30行目ではなく22行目のSetWindowSize( w, h, 16);の部分です。

Rittai_3D
記事: 525
登録日時: 12年前

Re: SetWindowPos関数でサイズを変更できない

#5

投稿記事 by Rittai_3D » 10年前

SetWindowSize( w, h, 32 )
としてみてください。おそらく16が原因かと。
オフトピック
Dxライブラリを使用するならSetWindowPos()を使用せずに

コード:

SetGraphMode( a, b, 32 ); // ウィンドウのサイズ変更
SetWindowPosition( x, y );  // ウィンドウの場所を変更

DxLib_Init(); // 上の関数より下で呼び出す必要がある?
で何とかなると思いますが・・・。このあたりの関数は使用したことがあまりないので間違っていたらすいません。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2452
あたりが参考になるかもしれません。
初心者です

アバター
Ketty
記事: 103
登録日時: 11年前

Re: SetWindowPos関数でサイズを変更できない

#6

投稿記事 by Ketty » 10年前

■SetUseBackBufferTransColorFlagを使った場合、
通常の描画方法では表示できなくて、特別な手続きが必要です。

ウィンドウを透過して、画像を見えるようにするために必要なのは
1.MakeARGB8ColorSoftImage
2.GetDrawScreenSoftImage
3.UpdateLayerdWindowForPremultipliedAlphaSoftImage
という関数です。
そして、ScreenFlipを使いません(3.の関数がその代わりになる)

さらに、画像自体も透明度を持つ場合は
4.SetUsePremulAlphaConvertLoad
5.MakeScreen
といった関数も必要になります。

詳しくは以下のURLにありますのでどうぞ(^_^)
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3158

■ちなみに、SetGraphMode( w, h, 16 ); についてですが、
wやhに指定できる値は、自由ではなく、パターンが決まっていますのでご注意ください。
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1

なので、もし、w=80, h=80を実現されたいなら工夫がいると思います。

間違っていたので追記します:
w、hの値で気を付けるべきは、フルスクリーンモードのときで、
ウィンドウモードのときは、ひょっとすると、制限なしかもしれません(不明です)
オフトピック
手元で検証してみたところ 1*1などというミニサイズを指定しても正常に動作しましたm(__)m
■それから、
DXライブラリの関数の引数はBOOL(整数型)であって、bool(true/false)ではないです。

コード:

SetDoubleStartValidFlag( true );   // ←こうではなく
SetDoubleStartValidFlag( TRUE );  // ←こうが正しい 
Visual Studioだとどちらも同じように動くようですが、念のため正確に記述されることをお勧めします。

閉鎖

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