トップページ > 過去ログ > 記事閲覧
子ウインドウでDxLibを…
名前:essex 日時: 2010/01/08 01:29

 初めまして。  先日、DXライブラリを知りました。とても良いライブラリで是非使ってみたく、 Cをやった事が無いにも関わらず(^^;ダウンロードしました。  管理人様、素晴らしいライブラリをありがとうございます。  早速Visual Studio ExpressのC++もダウンロードし、見よう見まねでプログラムを 作り始めたのですが、早速壁にぶち当たりました。どなたかご教授下さいませ。  現在製作しているのは、スクリーン・セーバです。  処理の最初でコマンドライン引数を見て、"/s"の時はスクリーン・サイズでGraphModeを セットした後、通常通り全画面表示で起動、"/p"の時はプレビュー・ウインドのハンドルを 引数にしてGetWindowRect()でサイズと位置を取得して、ウインドウ・モードで起動しています。  でも、これだとプレビュー画面の位置に合わせてウインドを開いているだけなので、設定の ダイアログを移動すると、ウインドだけがそこに残ってしまいます。  こんな状態ですね…  h ttp://homepage2.nifty.com/essex/temp/WS_CHILD.jpg  例えばwin32のCreateWindowに、子ウインドウを生成するWS_CHILDみたいなオプションが ありましたが、DxLibで同じ様な事ができるのでしょうか?過去ログやDxLib.hの中も読んで みたのですが、残念ながら分かりませんでした。(もし見落としがあったら、済みません)  どうか、宜しくお願い致します。

Page: 1 |

Re: 子ウインドウでDxLibを… ( No.1 )
名前:管理人 日時:2010/01/17 17:20

非公開関数で // DXライブラリで利用するウインドウのハンドルをセットする(DxLib_Init を実行する以前でのみ有効) int SetUserWindow( HWND WindowHandle ) ; という、既に作成されているウインドウを使用してDXライブラリを使うといった機能があります この関数を使用してプレビューウインドウの子ウインドウを作成してその子ウインドウを SetUserWindow に渡すか、 可能ならプレビューウインドウ自体を SetUserWindow に渡すかするとご希望の処理が実現できるかもしれません 因みに SetUserWindow に渡したウインドウのメッセージ処理はDXライブラリでは行われませんので、 自前でメッセージ処理を行う必要があります こちらにサンプルを載せておきますので、よろしければご覧下さい m(_ _)m #include <windows.h> #include "DxLib.h" LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; char szClassNme[] = "ウィンドウクラス・ネーム"; int QuitMessage = 0 ; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG msg; WNDCLASS myProg; // ウインドウの作成 if( !hPreInst ) { myProg.style =CS_HREDRAW | CS_VREDRAW; myProg.lpfnWndProc =WndProc; myProg.cbClsExtra =0; myProg.cbWndExtra =0; myProg.hInstance =hInstance; myProg.hIcon =NULL; myProg.hCursor =LoadCursor(NULL, IDC_ARROW); myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); myProg.lpszMenuName =NULL; myProg.lpszClassName =szClassNme; if( RegisterClass( &myProg ) == FALSE ) return FALSE ; } hWnd = CreateWindow( szClassNme, "テストプログラム", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow( hWnd, nCmdShow ) ; UpdateWindow( hWnd ) ; // 作成したウインドウをセット SetUserWindow( hWnd ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 裏画面を使用する SetDrawScreen( DX_SCREEN_BACK ) ; // メッセージループ while( ProcessMessage() == 0 && QuitMessage == 0 ) { // 画面をクリア ClearDrawScreen() ; // ボックスを描画 DrawBox( 100, 100, 200, 200, GetColor( 255,0,0 ), TRUE ) ; // 裏画面の内容を表画面に反映する ScreenFlip() ; // メッセージ処理 if( PeekMessage( &msg, hWnd, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ) ; DispatchMessage( &msg ) ; } } // DXライブラリの後始末 DxLib_End(); return msg.wParam ; } // メッセージ処理用関数 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_DESTROY : PostQuitMessage( 0 ) ; QuitMessage = 1 ; break ; default : return DefWindowProc(hWnd, msg, wParam, lParam ) ; } return 0 ; }
Re: 子ウインドウでDxLibを… ( No.2 )
名前:essex 日時:2010/01/19 00:30

 管理人様、お忙しい中サンプルまで示してくださり、ありがとうございました。  サンプルにしたがって早速やってみたのですが、残念ながらうまくできずにいます。  下記のプログラムは、プレビュー処理部分のみの抜粋なのですが、CreateWindow()で ウィンドウ・スタイルにWS_CHILDを指定した場合、どうもうまく動きません。試しに スタイルを、例えばWS_POPUP等他に変えると、ウインドウは生成されDxlibもちゃんと 動きます。  ご教授下さった関数の使い方を、私が間違っているのだと思うのですが、何処がいけないか、 お教えて下さいませ。  お手数をおかけしますが、よろしくお願い致します。 #include <windows.h> #include "DxLib.h" LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; char szClassNme[] = "ウィンドウクラス・ネーム"; int QuitMessage = 0; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { HWND hWnd,hWnd1; MSG msg; WNDCLASS myProg; int i; int width,height; char buf[255]; RECT rect; // ウインドウの作成 if( !hPrevInstance ) { myProg.style =CS_HREDRAW | CS_VREDRAW; myProg.lpfnWndProc =WndProc; myProg.cbClsExtra =0; myProg.cbWndExtra =0; myProg.hInstance =hInstance; myProg.hIcon =NULL; myProg.hCursor =LoadCursor(NULL, IDC_ARROW); myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); myProg.lpszMenuName =NULL; myProg.lpszClassName =szClassNme; if( RegisterClass( &myProg ) == FALSE ) return FALSE ; } //コマンドライン引数の確認-------------------------------------------- for(i = 1; i < __argc; i++) { strcpy(buf,__argv[1]); buf[2] = '\0'; if ((strcmp(buf,"/P") == 0) || (strcmp(buf,"/p") == 0)){//プレビューモード hWnd = (HWND) atoi (__argv[2]);        //第2引数(ハンドル)を取得 GetWindowRect(hWnd,&rect);           //矩形を取得 width = rect.right - rect.left; height= rect.bottom- rect.top; hWnd1 = CreateWindow( szClassNme, "テストプログラム", WS_CHILD | WS_OVERLAPPED, //ウィンドウ・スタイルを設定 0, 0, width, height, hWnd, NULL, hInstance, NULL); } } ShowWindow( hWnd1, nCmdShow ) ; UpdateWindow( hWnd1 ) ; // 作成したウインドウをセット SetUserWindow( hWnd1 ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 裏画面を使用する SetDrawScreen( DX_SCREEN_BACK ) ; // メッセージループ while( ProcessMessage() == 0 && QuitMessage == 0 ) { // 画面をクリア ClearDrawScreen() ; // ボックスを描画 DrawBox( 10, 10, 200, 200, GetColor( 255,0,0 ), TRUE ) ; // 裏画面の内容を表画面に反映する ScreenFlip() ; // メッセージ処理 if( PeekMessage( &msg, hWnd, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ) ; DispatchMessage( &msg ) ; } } // DXライブラリの後始末 DxLib_End(); return msg.wParam ; } // メッセージ処理用関数 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_DESTROY : PostQuitMessage( 0 ) ; QuitMessage = 1 ; break ; default : return DefWindowProc(hWnd, msg, wParam, lParam ) ; } return 0 ; }
Re: 子ウインドウでDxLibを… ( No.3 )
名前:管理人 日時:2010/01/28 01:51

プレビュー時は DirectInput でマウスを使おうとするとエラーが発生するみたいですので DxLib_Init を呼ぶ前に SetUseDirectInputFlag( FALSE ) ; を実行すれば大丈夫みたいです 私が試した限りではプレビュー画面に赤い四角が描画されました、よろしければお試し下さい
Re: 子ウインドウでDxLibを… ( No.4 )
名前:essex(解決) 日時:2010/01/30 20:11

 できました!!!管理人様、本当にありがとうございました。  window生成の引数を変えてみたり、手順を入れ替えてみたり 色々やってもうまくできず途方に暮れていたのですが、 教えていただいた通りDirectInputを使わない様セットしたら プレビューウインドに表示されました!!  DxLibを使って、これから色々作ろうと思います。お忙しい中 ご教授くださり、本当にありがとうございました。
Re: 子ウインドウでDxLibを… ( No.5 )
名前:いっち(解決) 日時:2010/01/30 21:59

私も色々と試しては見たものの全然出来ないので、息を潜めて拝見しておりましたが、 おかげさまで動きました。ありがとうございます。 お役に立てず、すみません。 > essexさん
Re: 子ウインドウでDxLibを… ( No.6 )
名前:essex(解決) 日時:2010/01/31 02:17

 いっちさん  とんでもありません!色々試して下さったのですね。感謝します。 ありがとうございます^^  管理人さん、いっちさん…もし他にも、試してくださった方がいらしたら、 皆さんに感謝します。  私も勉強して、他の方のお役に立てる位になりたいです。 

Page: 1 |