- ベストアンサー
VisualC++におけるメインウィンドウの領域に子ウィンドウを配置する際に発生する問題
メインウインドウの領域に子ウインドウを作成し、その子ウインドウの領域にオブジェクトを表示しようとしています。 そこで、子ウインドのプロシージャに描画するソースを書いているのですが、子ウインドウの描画領域には何も表示されず、親ウインドウの描画領域に表示されてしまいます。 どうすれば子ウインドウの領域に描画することができるのでしょうか? 説明の至らない点もあると思いますが、わかる方いらっしゃいましたら宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
描画コードでデバイスコンテキストを使っているはずですが、親ウィンドウ用のデバイスコンテキストを使っているのではないでしょうか? MFCなどのフレームワークを使っていないなら、CreateCompatibleDC()などのAPIで子ウィンドウ用のデバイスコンテキストを作らないといけません。 描画コードをさらせば、もっと的確な回答を得られると思いますよ。
その他の回答 (3)
- tettsu
- ベストアンサー率30% (4/13)
CV::関係の関数が何をしているのか分からないので何とも言えないですが、 static関数で、呼び出されているようなので、 CV::RenderStart(); 以下の描画コードは、カレントのウインドウに対して実行されると推測できます。 ソースを見ると、多分ですけど、親ウインドウの3D初期化の方が、子ウインドウの3D初期化よりも後に実行されます。 ということは、後に呼ばれた、親ウインドウがカレントウインドウになっていると思われます。 その後に、CV::関係で、ウインドウハンドルを引数に持つような関数が実行されていないようなので、親ウインドウにしか描画されないのではないでしょうか? ちなみにOpenGLの場合は、 wglMakeCurrent という関数で、描画対象のHDCを切り替えるようになっています。 ですので、CVのライブラリに、それっぽい関数はないですか?
お礼
確認したところ、ダイレクトXでは子ウインドウでの3D描画がサポートされていないことがわかりました。 なので、別の方法を考えてみたいと思います。ご回答ありがとうございました。
- MeeCat
- ベストアンサー率75% (6/8)
ソースからは、元々g_Avatarが特定の1つのウィンドウにのみ描画する作りになっているように見えますが。。。 問題の本質が、DirectXと子ウィンドウにあるのなら、私は分かりません。 先ほどの回答でCreateCompatibleDC()とか書いたのはうそです。 恥ずかしいので取り消させてください。 ↑これが書きたくて無理やり解答しました。
お礼
Child1ProcのWM_Paintの部分にもRenderStart()で3D描画処理を記述したので、子ウインドウにもg_Avatarの部分が表示されると思ってたのですが、、表示されていない点が疑問に感じました。 上にあるTextOutの部分は表示されているのですが・・・ 親切に何度もご回答ありがとうございます。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★子ウインドウのプロシージャとは、サブクラス化ってことかな? ・描画処理部分が『WM_PAINT』ならば、そのソース部分を教えて下さい。 ・また、本当に子ウインドウのプロシージャ・アドレスなのかな? ・親ウインドウのアドレスを処理していませんか? ・もう少し詳しいソースなどを記述して下さい。 ・また、読みますので。
補足
ご回答ありがとうございます。 当方、初心者でして説明が至らないと思いますがすみません。 ソースの一部として、メインと子ウインドウのプロシージャの一部をのせておきます。 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } init3DInstance(hWnd); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } bool init3DInstance(HWND hWnd) { //3Dオブジェクト描画の初期設定 { CV::InitWin(hWnd);//3Dデバイスの初期化 } //アバタの初期設定 { g_Avatar.Create("X/man.X"); //xファイルの読み込み g_Avatar.SetPosition(0.0, 0.0, 0.0); //初期位置の設定 g_Avatar.SetOrientation(-90, 0, 0); //初期姿勢の設定 g_Avatar.SetWorldMatrix(); //ワールド座標に変換する g_Avatar.SetHardCord( 4800 );//アニメーション速度の設定 } return true; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static int an1=20,an2=0; static bool flag = false; static char *szWindowChildClass = "child"; HWND hChild; HINSTANCE hInst;// switch (message) { case WM_CREATE: //子ウインドウを作成・表示します。 hChild = CreateMyChild(hWnd, Child1Proc, "mychild1", "子ウインドウ"); if (!hChild) { return FALSE; } init3DInstance(hChild); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); break;} case WM_PAINT: { HDC hdc; //char *str_org = "( %f ,%f ,%f )"; char strx[256]; PAINTSTRUCT paint; g_Avatar.GetPosition(&Avatar_Pos.x,&Avatar_Pos.y,&Avatar_Pos.z); sprintf((LPSTR)strx,"(%f,%f,%f,%d)", 0.0,Avatar_Pos.x, Avatar_Pos.z, LocaleID); hdc = BeginPaint(hWnd, &paint); TextOut(hdc, 10, 10, (LPSTR)strx, strlen(strx)); EndPaint(hWnd, &paint); InvalidateRect(hWnd,NULL,0);//WM_PAINTの呼び出し } { CV::RenderStart(); //3D描画処理 g_Avatar.SetPosition(hight,0.0,weight);//初期位置の設定 g_Avatar.SetWorldMatrix(); //ワールド座標に変換する g_Avatar.Render(); //アバタの再描画 g_Avatar.GetPosition(&Avatar_Pos.x,&Avatar_Pos.y,&Avatar_Pos.z); cam_from = CVector(cam_from.x,cam_from.y,move(-20.0f,cam_from.z)); // カメラで使用 cam_at = CVector(cam_at.x,3.45, cam_at.z); // カメラで使用 cam_up = CVector(0.0f,1.0f, 0.0f); // カメラで使用 g_Camera.Create(g_Avatar,&cam_from, &cam_at, &cam_up );//カメラの生成 } Sleep (70); CV::RenderEnd(); break; case WM_DESTROY: //3DCGオブジェクト描画の破棄 { CV::Clear(); } PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } LRESULT CALLBACK Child1Proc(HWND hChild, UINT msg, WPARAM wp, LPARAM lp) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static int an1=20,an2=0; static bool flag = false; HINSTANCE hInst; switch (msg) { case WM_PAINT: { 以下メインプロシージャの同じ描画処理・・・ 3D描画のアバターの部分をメイン子とともに表示させたいのですが、、 よろしければまた宜しくお願い致します。
補足
アドバイスありがとうございます。 えと、TextOutの部分はメインウインドウ、子ウインドウともに表示されるのですが、、、 RenderStart()以下の3D描画部分が、親ウインドウのほうしか表示されません。 上に描画コードの一部をのせますので、よろしければまたお願い致します。