Re: ボーダーレスウィンドウを作りたい ( No.1 ) |
- 名前:管理人 日時:2019/01/10 02:01
既存の機能ではサブモニタかどうかを判定する方法がなかったので、判定するための
関数を追加したバージョンをこちらにアップしました
よろしければダウンロードしてください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
こちらの関数を追加しました
// ディスプレイのデスクトップ上での矩形位置を取得する
int GetDisplayInfo( int DisplayIndex, int *DesktopRectX, int *DesktopRectY, int *DesktopSizeX, int *DesktopSizeY, int *IsPrimary ) ;
ディスプレイのデスクトップ上に配置されている矩形の情報と、プライマリモニタかどうかの情報を
取得するための関数です
この関数を使用してプライマリモニタではないモニタ全体と同じ大きさのウィンドウで
画面内を跳ね回る矩形を表示するプログラムを組んでみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int i ;
int x, y, addX, addY ;
int DisplayNum ;
int RectX, RectY, SizeX, SizeY, IsPrimary ;
// モニタの数を取得する
DisplayNum = GetDisplayNum() ;
// モニタの数だけ繰り返し
for( i = 0 ; i < DisplayNum ; i ++ )
{
// モニタの情報を取得
GetDisplayInfo( i, &RectX, &RectY, &SizeX, &SizeY, &IsPrimary ) ;
// プライマリモニタではなかったらループ終了
if( IsPrimary == FALSE )
{
break ;
}
}
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// タスクバーなし設定
SetWindowStyleMode( 1 ) ;
// ウィンドウの解像度をモニタの解像度と同じにする
SetGraphMode( SizeX, SizeY, 32 ) ;
// ウィンドウの位置をセット
SetWindowPosition( RectX, RectY ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// メインループ
x = 0 ;
y = 0 ;
addX = 16 ;
addY = 16 ;
while( ProcessMessage() == 0 )
{
// 画面内を跳ね回る
x += addX ;
y += addY ;
if( x < 0 || x > SizeX - 64 ) addX = -addX ;
if( y < 0 || y > SizeY - 64 ) addY = -addY ;
// 画面のクリア
ClearDrawScreen() ;
// 四角形の描画
DrawBox( x, y, x + 64, y + 64, GetColor( 255,255,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
 |
Re: ボーダーレスウィンドウを作りたい ( No.2 ) |
- 名前:長峰 日時:2019/01/10 08:38
わざわざご用意いただきありがとうございます。
サンプルコードはSetUseDisplayIndexまたはSetUseDirectDrawDeviceIndexを使用されてませんが、
過去ログで見た以下のペナルティは発生しないのでしょうか。
>因みに、ウインドウモードでは指定したデバイスと接続されているモニタ上でのみ正常に描画され、
>指定したデバイスに接続されていないモニタ上では何らかのペナルティが発生すると思います
>これはドライバかOSの仕様だと思いますので、ライブラリの側ではどうしようもありません
ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=past&no=1450
|
Re: ボーダーレスウィンドウを作りたい ( No.3 ) |
- 名前:管理人 日時:2019/01/11 02:12
> サンプルコードはSetUseDisplayIndexまたはSetUseDirectDrawDeviceIndexを使用されてませんが、
> 過去ログで見た以下のペナルティは発生しないのでしょうか。
すみません、失念していました m(_ _;m
ただ、こちらの過去ログでも言及していますが、ペナルティが発生するかどうかはグラフィックスデバイスのドライバ次第です
あと、過去ログの時点( 2009年 )では使用している API は DirectX9 でしたが、現在はグラフィックスデバイスが
対応している場合は DirectX11 を使用するようになっています、DirectX11 を使用する場合は DirectX9 の頃とは異なり
SetUseDisplayIndex を使用しなかった場合のペナルティはありませんので、現在ではペナルティが発生する条件は
『グラフィックスデバイスが DirectX11 に対応しておらず、且つグラフィックスデバイスが SetUseDisplayIndex で
指定したモニタ以外の領域にウィンドウがあった場合に描画パフォーマンスが落ちる設計になっている場合』
となります
No.1 のサンプルプログラムに SetUseDisplayIndex を使用するようにすると以下のようになります m(_ _)m
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int i ;
int x, y, addX, addY ;
int DisplayNum ;
int RectX, RectY, SizeX, SizeY, IsPrimary ;
// モニタの数を取得する
DisplayNum = GetDisplayNum() ;
// モニタの数だけ繰り返し
for( i = 0 ; i < DisplayNum ; i ++ )
{
// モニタの情報を取得
GetDisplayInfo( i, &RectX, &RectY, &SizeX, &SizeY, &IsPrimary ) ;
// プライマリモニタではなかったらループ終了
if( IsPrimary == FALSE )
{
break ;
}
}
// 使用するモニタを指定
SetUseDisplayIndex( i ) ;
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// タスクバーなし設定
SetWindowStyleMode( 1 ) ;
// ウィンドウの解像度をモニタの解像度と同じにする
SetGraphMode( SizeX, SizeY, 32 ) ;
// ウィンドウの位置をセット
SetWindowPosition( RectX, RectY ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// メインループ
x = 0 ;
y = 0 ;
addX = 16 ;
addY = 16 ;
while( ProcessMessage() == 0 )
{
// 画面内を跳ね回る
x += addX ;
y += addY ;
if( x < 0 || x > SizeX - 64 ) addX = -addX ;
if( y < 0 || y > SizeY - 64 ) addY = -addY ;
// 画面のクリア
ClearDrawScreen() ;
// 四角形の描画
DrawBox( x, y, x + 64, y + 64, GetColor( 255,255,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
 |
Re: ボーダーレスウィンドウを作りたい ( No.4 ) |
- 名前:長峰 日時:2019/01/11 11:45
詳細なご説明ありがとう ございます。
疑問がすべて解決しました。
|
|