ページ 11

DXLibのウィンドウ上にテキストボックスを作成したい

Posted: 2012年7月15日(日) 16:38
by びす
DXライブラリで作成されたウィンドウの上に、
Windowsのフォームでよく見るテキストボックスを表示したいです
(DXライブラリにも文字列入力用の関数がありますが
今回は少し事情があり、テキストボックスでの入力をしたいと思っています)

調べたところ、CreateWindowという関数を使えば
指定したウィンドウの上にテキストボックスを作成できるとのことで、以下のようなコードを書きました

実行してみると、きちんと左上にテキストボックスが作成はされているようなのですが
カーソルを合わせたとき、文字を入力したときなど、おそらく再描画される瞬間でしょうか?
そのタイミングでしか画面上に表示されません・・・

なんとかして常に表示させるようにしたいのですが、どうすればよいのでしょうか
どうぞよろしくおねがいします

コード:

#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
         LPSTR lpCmdLine, int nCmdShow )
{
    //ウインドウモードで起動
    ChangeWindowMode( TRUE );
    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1;    // エラーが起きたら直ちに終了
    }
    // 描画先を裏画面に設定
    SetDrawScreen( DX_SCREEN_BACK ) ;
    // 白色の値を取得
    int Cr = GetColor( 255 , 255 , 255 ) ;


    //ウィンドウハンドルを取得
    HWND hWnd = GetMainWindowHandle();
    //EDITを作成
    CreateWindow(
        "EDIT",                            // ウィンドウクラス名
        "hello!",                                 // キャプション
        WS_EX_COMPOSITED | WS_CHILD | WS_VISIBLE ,        // スタイル指定
        0, 0,                                    // 座標
        200, 50,                                    // サイズ
        hWnd,                                    // 親ウィンドウのハンドル
        (HMENU)(INT_PTR)1,                      // メニューハンドル
        hInstance,                                 // インスタンスハンドル
        NULL                                     // その他の作成データ
    );


    for(;;){
        // 画面を初期化
        ClearDrawScreen() ;

        // 1000個の点を描く
        for( int i = 0 ; i < 1000 ; i ++ )
        {
            DrawPixel( GetRand( 639 ) , GetRand( 479 ) , Cr ) ;
        }
        //表画面に反映
        ScreenFlip() ;
        // Windows依存処理
        if( ProcessMessage() == -1 ) break ;
    }
    DxLib_End() ;        // DXライブラリ使用の終了処理
    return 0 ;        // ソフトの終了
}

Re: DXLibのウィンドウ上にテキストボックスを作成したい

Posted: 2012年7月15日(日) 17:27
by softya(ソフト屋)
DXライブラリはDirectXの管轄で、EDITボックスはWin32APIの管轄なので相性が悪いと思います。
別のダイアログウィンドウに表示したらダメなのでしょうか?
あとDXライブラリで毎フレーム表示中に入力できないとダメですか?

補足して本家DXライブラリの掲示板よりWin32APIの併用についてです。
「Windows APIとの併用」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ast&no=491

Re: DXLibのウィンドウ上にテキストボックスを作成したい

Posted: 2012年7月15日(日) 18:01
by びす
softyaさん 返信ありがとうございます

管轄が違い、相性が悪いとは知りませんでした
softya(ソフト屋) さんが書きました:別のダイアログウィンドウに表示したらダメなのでしょうか?
できれば、DXライブラリのウィンドウ上に表示したいと思っています
どうしても難しいようであれば、別のダイアログに表示する方法を使いたいとおもいます
ありがとうございます
softya(ソフト屋) さんが書きました:あとDXライブラリで毎フレーム表示中に入力できないとダメですか?
毎フレーム更新するプログラムの上に表示をしたいです

ためしにScreenFlip()の行を削除してみましたら、正常に表示されました
毎フレーム更新のせいであんな表示になってしまってるんですね
softya(ソフト屋) さんが書きました:補足して本家DXライブラリの掲示板よりWin32APIの併用についてです。
DxLib_Init() の前に SetUseDirectDrawFlag( FALSE );
後に SetUseGDIFlag( TRUE ); を追記しましたが、あまり変化はみられませんでした...

DXライブラリの作者さんも難しいとおっしゃっているんですね
やはりあきらめるしかないでしょうか><

Re: DXLibのウィンドウ上にテキストボックスを作成したい

Posted: 2012年7月15日(日) 18:22
by softya(ソフト屋)
普通は全てDXライブラリで入力欄を作りますからね。
あと代替え方法としてダイアログボックスをWin32APIで作り、その一部をDXライブラリで表示させると言う方法がありました。
staticコントールなどをDXLIBの表示ウィンドウに使えるのではないかと思います(試していません)。

「子ウインドウでDxLibを…」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1556

良かったら試してみて下さい。

Re: DXLibのウィンドウ上にテキストボックスを作成したい

Posted: 2012年7月17日(火) 22:07
by びす
返信が遅くなってしまいすみません

今の自分にはどうも無理そうなので、透明でタスクバーに表示されないウィンドウを作成し、
重ねて表示する方法を検討してみたいと思います

softyaさん、どうもありがとうございました