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