VC2005 MFC です。
CTreeCtrlやCListCtrlなどの各コントロールの現在の表示状態を、
境界線や内部スクロールバーなどの非クライアント領域も含めて
メモリビットマップに描画したいのですが、
どのような方法が考えられますでしょうか。
試しに、メモリDCにメモリビットマップを選択して、
m_tree.SendMessage(WM_PAINT, (WPARAM)dcMem.m_hDC);
と送ってみたのですが、非クライアント領域までは描いてくれませんでした。
WM_PAINT の代わりに WM_PRINT を使ってみるとか?
情報ありがとうございます。
m_tree.SendMessage(WM_PRINT, (WPARAM)dcMem.m_hDC, PRF_CLIENT | PRF_NONCLIENT);
と、WM_PRINTを送ってみたところ、非クライアント領域も描画されました。
ただ、境界線がXPのテーマに沿ってくれませんでした。
クラシックスタイルの凹んだ枠になってしまいます。
2000などで動かす際にはこれでも問題無さそうですが、
なにか設定し忘れているものでも考えられますでしょうか。
PrintWindow なんて関数もありますが、結果は同じですかね?
> PrintWindow なんて関数もありますが、結果は同じですかね?
PrintWindowだと正しく境界線も描画されました。
どうやらこの問題は修正される予定の無いバグのようです。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=116821
ただPrintWindowをそのまま使ってしまうと、XP以降でしか使えなくなりますね。
遅延ロードを使って関数が無ければWM_PRINTを送る、
というような使いかたをしなければいけなそうです。
ありがとうございます。
> どうやらこの問題は修正される予定の無いバグのようです。
うーん…微妙に違う問題のような気がします。
そこは Visual Studio & .NET Framework のバグ報告をするところで、報告者も .NET
Framework のコントロールの枠が描画されない、と報告していると思います(Win32 に
TextBox というコントロールはありません)。
それに対してマイクロソフトは、「それは .NET Framework の問題ではなく Windows の
コモンコントロールの問題なので、.NET Framework 開発チームとしては何も手を打てな
い」と返答している気がします。
そのため、Windows 開発チームの方へフィードバックすれば、また違った回答が得られ
る可能性はあると思います。
まぁ、XP SP3 でも直っていないことに変わりはなく、報告しても今から XP で修正され
る望みはないと思いますが。
たしかによくよく読んでみると微妙に違いますね。失礼しました。
コモンコントロールの問題であることは確かなようなので、修正に頼らずに、
前述の通り遅延ロードで、XPならPrintWindow、2000以前ならWM_PRINTを
使い分けるようにしてみたいと思います。