- ベストアンサー
非クライアント領域への描画について
非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>以下の(2)では書けますが、(1)では書いてくれません。 というか、(1)はクライアント領域に描画されますよね? >CPaintDCはクライアント領域でないとダメなのですか? だめです。 http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_cpaintdc.htm >CPaintDC クラスは、CDC クラスから派生したデバイス コンテキスト クラスです。構築時に CWnd::BeginPaint 関数を実行し、消滅時に CWnd::EndPaint 関数を実行します。 > >CPaintDC オブジェクトは、WM_PAINT メッセージに応答するときのみ使います。通常は OnPaint メッセージ処理メンバ関数で使います。 WM_PAINTが送られてきたときにBeginPaintを呼んで得られる デバイスコンテキストは、クライアント領域ですよね。 これで非クライアント領域まで描画できるとすると、 通常のクライアント領域の描画がとても大変になってしまいますよね。
その他の回答 (4)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
おまけ http://www.okweb.jp/kotaeru.php3?q=825118 ここで、Viewのメンバ変数の値を子ウィンドウから見ようとしていましたよね。 で、解決方法が、 1.親ウィンドウのCViewを取得する 2.親ウィンドウをCViewにする の2つの方法が回答されています。 こうしなければいけない理由が、 1.CDialogのコンストラクタで親ウィンドウを指定しなかった場合は、アプリケーションのメインウィンドウ(フレーム)となっているから。 2.フレームとビューのウィンドウは別だから。 ということなのです。 ここでの理由をしっかり考えていただければ今回の質問は出てこなかったかな?
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ビュー=クライアント領域と思っていましたが、 >クライアント領域の上にビューが描かれているという >ことでしょうか? MFCのスケルトンから生成したウィンドウアプリの構造に少々誤解があるようですね。 MFCのウィンドウアプリは、ドキュメント/ビューアーキテクチャーといって、4つの主要なクラスによって成り立っていて、それぞれに別の役割を持たせています。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_document.2f.view_architecture_topics.asp ここで、CFrameWndとCViewが、ウィンドウの表示に関するクラスとなっていて、その関係は、CFrameWndが親ウィンドウで、CViewが子ウィンドウになっています。 他のクラスの役割についてはurlの内容を読んでください。 MFCのスケルトンでは、メニューを含めたウィンドウ全般の処理は、CFrameWndで、クライアント領域への描画はCViewとクラスを分けることで、処理を切り分けるようなつくりになっています。 このため、CFrameWndのクライアント領域は、通常はその全てをCViewのウィンドウが覆っている状態となっています。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>CMainFrame::OnPaint() >そう思ったのですが、クライアント領域にも描画されません。 >もちろん、void CXxxView::OnPaint()内なら描画されます。 ってことは、CMainFrameにビューが張り付いてるっとことですよね。 描画対象となるクライアント領域って見えてますか? 見えてないなら描画結果も見えないと思いますけど。
お礼
回答ありがとう御座います。 ビュー=クライアント領域と思っていましたが、 クライアント領域の上にビューが描かれているという ことでしょうか? ダイアログベースで試すと確かに書くことが出来ました。
- Aruku-20030515
- ベストアンサー率23% (362/1544)
最近、プログラムしていませんので空耳程度に、、 うーん、デスクトップ画面以外のターゲットにそれをやるとエラーになった気がします。<仮想表示エリアが無いため
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。 >というか、(1)はクライアント領域に描画されますよね? そう思ったのですが、クライアント領域にも描画されません。 もちろん、void CXxxView::OnPaint()内なら描画されます。