DxLib 隠れ関数使用例




DxLibFanに戻る

1.Windowのハンドルを得る

extern HWND GetMainWindowHandle( void ) ;
というMainWindowを取得する関数がDxLib.hで定義されていますので、多分使えます。
よってMessageBoxとかで使用する場合に使うんだと思います。

こんな感じ



2.ソフトがアクティブかどうかを取得する

extern int GetActiveFlag( void ) ;
という関数でアクティブかどうかを取得できるようです。 さてさて、戻り値はいくらだ?
調べた結果
アクティブ時:return value = 1;
非アクティブ時:return value = 0;
という結果でした。
しかし、この関数はSetAlwaysRunFlag(int Flag);関数(非アクティブ時でも処理を行うかどうか?TRUEで処理を行う) の関数を呼び出しTRUEに設定してやらなきゃなりません。(少なくとも私の環境では)
ソフトをアクティブ状態に保つ場合は重宝するかもしれません。
( ̄∧ ̄)(_ _)フムフム・・・勉強になりました?



3.ErrorLogAddとAddLogの違い

ErrorLogAddはDxLibが吐き出すAppLog.txtに吐き出す関数である
AddLogはprintfDxの元の関数である。

(`□´) 以上である!(爆)

d金魚→ヽ(TдT(☆○=(`◇´*)o 偉そうにするな!

てな訳で、自分のソフトが吐き出すTEXTファイルを作りたいですよね^^;
よって以下の関数を用意しました。DxLibを解剖して持ってきました。
(未完成品なので稀な条件によってバグが起こる。しかし実用上は問題ないと思う)
カレントディレクトリを変更するとおかしな場所にファイルが生成されます^^;
よってdSetCurrentDirectory関数を用意しました^^;
dAddLogの内部で呼び出せば常にカレントディレクトリです^^;が遅くなります。



4.Windowのスタイルを変える

DxLibプログラミング質問掲示板より引用
新しい int SetWindowStyleMode( int Mode ) ; という関数を 追加しました。
今のところモードは0から2までの三つで、以下のようになっています。

0:今までどおりの普通のウインドウ
1:タイトルバーなし、縁あり
2:タイトルバーも縁もなし
使い方はそのまんま SetWindowStyleMode( 2 ) ; 等とやるだけです。
この関数は DxLib_Init 関数を呼ぶ前に使っておくと、起動時から ウインドウのスタイルを変えておくことが出来ます。

2002年12月17日現在の仕様
管理人さん。新しい関数有り難う by d金魚



5.GDI描画を必要とする場合

さて、DirectXでフルスクリーンにした時、ダイアログボックスとか表示したくなったことありませんか?
いや、私だけですか?DirectDrawで自分で実装するのは楽なのですが、さすがに大規模ライブラリのDxLibに手を加えるのは難しいです^^;
ソンな方の為に。奥さんチョット聞いて〜(意味不明)
int SetUseGDIFlag( int Flag ) ;// GDI描画を必要とするか、を変更する
このような関数があります。
引数:TRUE=GDI描画を使用。FALSE=使用しない(デフォルト)
しかし、TRUEにしてしまうとバックバッファに書きこまないと上手く動作しないそうです。
ちなみにDxLibScreenSaverLibraryでも内部でこの関数を使用しています。



6.GUIDを設定してDualDisplayでも画面が選べるようにしよう

int SetDDrawUseGuid( GUID FAR *Guid ) ; // DirectDrawが使用するGUDIを設定する

d金魚が管理人さんに無理やり頼んで作っていただいた関数。
(管理人さん有り難うございます。ペコリ(o_ _)o)))
DualDisplay(デュアルディスプレイ)とは、Windows98あたり??からサポートされたらしい〜〜(爆)
ディスプレイを沢山用意してPCにつなげて画面領域を広げようという技術(だと思う)です。
Microsoftのフライトシミュレーターとかこれに対応してたような気がします。
さて、d金魚の環境ではAGPにGeForce256、PCIにSiS何たらとかのふる〜いGraphicCard(グラフィックカード)が刺さっていて、 普通ならAGPのから画面に出力します。が、しかし、他のグラフィックカードも試したい場合があるのです。
よってもう一つのディスプレイを隣のPC(d金魚の家のPCは2台並んで設置してある)からかっぱらってきてPCIのカードにつけて、 画面のプロパティで設定してDualDisplayにするのです。
画面領域が広くなり、快感ですよ〜〜^^
自慢するな〜!!!  川`0´)/☆#T。T) アウッ!
ってなわけで、そのグラフィックカードでDxLibがどのような動作がするかが見たいわけです。
なのでこちら側でディスプレイアダプタのGUIDを列挙して選択し、 この関数に渡せば見事PCIの方のグラフィックカード(性能が悪い方)が選択されるわけです。
実際、DxLibでは内部で性能のよさそうなグラフィックアダプタを選んで描画させるようです。(いや?プライマリのまんまで描画かな?)
前、調べたんだけど忘れてしまった^^;
いつか確認します。また、GUIDの列挙の方法も後々解説します。
余談:普通にDirectDrawでコーディングしているとたしかデュアルディスプレイ環境では画面を使用するのが一つ二つにかかわらずに自動的にHELデバイスになると思った。(d金魚も経験)それで某ゲームがものすごく遅くなって使用不能になったことがある。市販品ならこのくらいの対処はしていて欲しい。



7.Get XX 系関数は使えるかも!?

__inline extern int GetDrawScreenSize( int *XBuf , int *YBuf ) ;// 描画サイズを取得する

int GetDrawArea( RECT *Rect ) ;// 描画可能領域を得る

DxLibで定義されているGet XX 系関数の一部です。XXとは、隠語の○○禁関連の意味ではなくて、 Get何たらかんたら系関数って意味です。(なんか分かりにくいかな?)

DxLib.hを見れば分かりますが、このGet系の関数は沢山あるのです。
その中でd金魚がよく使うものをちょっとだけ挙げてみました。
GetDrawScreenSizeはSetGraphModeで設定した奴(デフォでは640X480)のスクリーンのサイズが得られます。
GetDrawAreaはSetDrawAreaで指定した描画領域のサイズが得られると思いました。
これらの関数であなたが欲しい関数とかがあるかもしれません。
DxLibプログラミング質問検事版で質問する前によくよく捜したほうが無難だと思いますが^^どうでしょうか?



8.DxLibでマルチスレッドのアプリを作りたいんだけど…

int SetMultiThreadFlag( int Flag ); この関数を使います。(DxLibプログラミング掲示板より)

説明:
DirectDraw の協調レベルをマルチスレッド対応にするかどうかをセットする
この関数に TRUE を渡して呼んでやれば協調レベルの設定時にDDSCL_MULTITHREADED を使用します。

まぁ、DirectDrawの基礎知識が無いと意味分からないかもしれませんが^^;
DirectX7以前が好きなd金魚にはかなり興味深い関数なんですが^^;

2003/12/11追記
DxLib Extension Library Project 研究事項:DxLibでマルチスレッドは可能か?



9.メモリ上に展開したWAVEデータを読む

DxLibのVersionが2.00eの時に話題になったもの。
その時、このような関数が作られました。ogg等を読み込むのに必要だったのですが、2003年3月3日現在ではDxLibはoggをサポートしてます。
ちなみにoggとはオッグボービス(圧縮した音楽データのひとつ)の拡張子です。また、それの略称です。
今では、自分で暗号化したWAVEファイル等をメモリ上に複合化展開した時に必要になります。

int LoadSoundMemByMemImage2( void *UData, int UDataSize, WAVEFORMATEX *UFormat, int UHeaderSize ) ;
引数説明:
void *UData:メモリ上に展開されたWAVEデータが存在しているアドレス
int UDataSize:WAVEデータのサイズ
WAVEFORMATEX *UFormat:WAVEデータのフォーマット
int UHeaderSize:WAVEデータのフォーマット情報のサイズを渡す

何故、第四引数にサイズを渡さなきゃいけないかと言うと、 WAVEFORMATEX 構造体の拡張構造体としてこの世のどこかで定義されているらしいからだそうです。



10.マウスのホイールの回転量を得よう!

int GetMouseWheelRotVol( void ) ; // マウスホイールの回転量を得る
です。
戻り値の説明:
+だったら奥に回された。
−だったら手前に回された。

マウスのホイールは回転させるとキチキチ音がしますよね。(しないのもありますが)
個々のマウスによって違いますが、「あ!ひとつ回ったな!」みたいな感じが指に伝わりませんか?
それで数値1つ分になるそうです。
じゃぁ、ホイールを押した時の状態は何の関数で得るの!?
d金魚-> ウーン (Θ_Θ;)
(ノ>。☆)ノ 自分で実装してください

(▼▼;)σ オマエツカエネー
d金魚 -> ( ┰_┰) シクシク



11.DxLibにメニューバーをつけよう!

以下の関数を使います。
int SetWindowMenu( int MenuID, int (*MenuProc)( WORD ID ) ) ; ウインドウにメニューをセットする関数です。
引数説明:
int MenuID: リソースに入っているメニューのID(IDR_MENUなど)メニューのリソースは自前で用意する必要があります。
int (*MenuProc)( WORD ID)):メニューのコマンドが選ばれた時に 選ばれたメニュー項目のID(IDM_END等)を 引数にして呼ばれるコールバック関数を渡します。
ウインドウモードの時は常に表示されていて、
フルスクリーンモードの時はESCキーが押されたら 表示されます。
(DxLibプログラミング質問掲示板より引用)
例
int EndFlag ;

int MenuCallBack( WORD Command )
{
switch( Command )
{
case IDM_END :
EndFlag = TRUE ;
break ;
}
return 0 ;
}
 //(と、いう関数とメニューリソースが存在するとして…)
 SetWindowMenu( IDR_MENU1, MenuCallBack ) ;
また、このメニューを表示する時は
SetDisplayMenuFlag(TRUE );
関数を呼び出さないといけません。
また、そのメニューを隠すにはその関数にFALSEを渡してやります。
GDIを使用する機能(ダイアログやメニュー等)をフルスクリーンモードで使う場合は
SetUseGDIFlag( TRUE ) ; としてGDIを使えるようにし、
SetDrawScreen( DX_SCREEN_BACK ) ; として、表画面には直接描画しないようにしなくてはいけません。
このようにしないとバグります。注意してください。

また、難解なコールバック関数についてこちら



12.リフレッシュレートを変える

実は! リフレッシュレートを変えるという行為は市販ゲームソフトではご法度だそうです。
なぜなら、そのグラフィックボードがそのリフレッシュレートで表示できない可能性があるからです。(Windowsプロフェッショナルゲームプログラミングより)
(しかし、私の作ったDxLibSetupを使えば、ソフト起動時に使用可能なリフレッシュレートを調べてユーザーに選択させる機能があります。)
さて、ご法度と知りながら知りたいのが世の常。どう変更するのでしょうか?
int SetGraphMode( int ScreenSizeX, int ScreenSizeY, int ColorBitDepth, int RefreshRate ) ; え?これってDxLibの本家のHPに書いている公式関数と同じジャン!って思った人!かなりのDxLibの使い手ですね。
さて、本家で紹介されているのは第三引数まででしたが、第四引数。RefreshRateがあります。
もちろん!ここでリフレッシュレートをぶち込みます。
戻り値はDX_CHANGESCREEN_OK が成功
画面モードの変更だけ成功して、リフレッシュレートの変更にだけ失敗した場合は DX_CHANGESCREEN_REFRESHNORMAL が 返ります。
私は絶対にリフレッシュレートはソフト側で変更しないので私はこの関数に入れる値をプログラマが定数で入れるのは奨励しません。変数にしてユーザーに選択させるべきです。



13.リソースからグラフィックを得る。

例:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
         LPSTR lpCmdLine, int nCmdShow )
{
  if( DxLib_Init() == -1 )// DXライブラリ初期化処理
  {
    return -1;// エラーが起きたら直ちに終了
  }

  // BMP画像の表示 BITMAP_RESOURCE_IDは各自変更するように
  // してください。
  int g=LoadGraphToResource(BITMAP_RESOURCE_ID) ;
  DrawGraph(0,0,g,TRUE);

  WaitKey() ;// キーの入力待ち((7-3)『WaitKey』を使用)

  DxLib_End() ;// DXライブラリ使用の終了処理

  return 0 ;// ソフトの終了
}
説明:
昔々、DxLibでスクリーンセーバーを作れるようにしよう! と、いうことで、リソースから読み出せるようにしないと、 フルパス指定にしないとグラフィックが読み込めないという問題になりまして、 d金魚が管理人さんに作っていただいたというありがたい関数です。
基本的にLoadGraphと同じです。
スクリーンセーバーの作り方でも取り上げた関数でしたが、隠れ関数使用例には無かったので、 取り上げた次第です。



14.メモリ領域からグラフィックハンドルを作る。

CreateGraphFromMemで作る事が出来るそうです。
メモリ領域はmalloc等で確保した領域にfopen等でBMPイメージを取り込み それを元にDxLibに読み込ませることです。




15.DxLibで作ったソフトの二重起動を許すかどうかを設定する

int SetDoubleStartValidFlag( int Flag ) ;で設定することができるそうです。
DxLib_Init()を呼ぶ前に、この関数のFlag引数にTRUEをいれると有効です。
使用例:
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
         LPSTR lpCmdLine, int nCmdShow )
{
  SetDoubleStartValidFlag( TRUE ) ;
  if( DxLib_Init() == -1 )  // DXライブラリ初期化処理
  {
     return -1;        // エラーが起きたら直ちに終了
  }
  WaitKey() ;        
  DxLib_End() ;      
  return 0 ;          
}



SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送