タイトル : Re^3: ユーザーコントロールの背景を透明にすると文字がおかしくなる 投稿日 : 2017/02/10(Fri) 23:30 投稿者 : 魔界の仮面弁士
> フォームのウィンドウハンドル、DCあたりを取得、コントロールがある場所の範囲をBitBltでコピー・・・とかでしょうか。 OleDraw API とか BitBlt とかやりようはありますが、親コンテナの内容が 書き換わったら、即座に反映されるような作り込みが必要ですね。 > やっぱりちょっと難易度が高そう・・・。 UserControl 側に背景を描画するのではなく、 Container 側に前景を描画する方向で実装できないかと思案。 ContainerHwnd に対する WM_PAINT を拾い、 標準描画処理が行われた後で、GDI の TextOut API もしくは GDI+ の GdipDrawString API などで追加描画するとか。 コンテナの AutoRedraw が有効なら、Print メソッドという手も ありそうですが、その場合、Cls だか RedrawWindow だかで 前回の描画結果を消す処理も必要になりそうな予感。 ひとまず、Image や Label や Shape と同様の、「中層」配置なコントロールにするべく、 Windowless=True な UserControl を使って実験してみましたが、 再描画すべき領域が変動したタイミングを捉えきれませんでした。難しいですね。 Caption の変更 → UserControl_AmbientChanged Height/Width の変更 → UserControl_Resize Left/Top の変更 → ??? |