: 내 MDI 폼의 생성자에서
나는 다음과 같은 코드를 사용하고 있습니다. MDIClient 개체는 ImageLayout.Stretch를 지원하지 않습니다. 이것은 문서화되어있다. 실제로 이것을 정확하게 수행하는 것은 큰 고통입니다. (필요에 따라 편집)이 비슷한에서 MDI 폼을 상속보십시오 : 당신의 자신에 당신이있어
public class MdiForm : System.Windows.Forms.Form
{
private static readonly float _bg_scale = FormGraphics.mdi_background.Width/(float)FormGraphics.mdi_background.Height;
private MdiClient _mdi_client = null;
private Image _background_cache = null;
public MdiForm()
{
SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
Shown += MdiForm_Shown;
SizeChanged += MdiForm_SizeChanged;
IsMdiContainer = true;
}
private void MdiForm_Shown(object sender, EventArgs eventArgs)
{
foreach (MdiClient control in Controls.OfType<MdiClient>())
{
_mdi_client = control;
control.Paint += MdiClient_Paint;
control.BackColor = Color.White;
//LA LA LA I CAN'T HEAR YOU
//this DOES work and IS required to avoid flicker
MethodInfo mInfoMethod = typeof(MdiClient).GetMethod(
"SetStyle",
BindingFlags.Instance | BindingFlags.NonPublic,
Type.DefaultBinder,
new[] { typeof(ControlStyles), typeof(bool) },
null);
mInfoMethod.Invoke(control, new object[] {
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true });
}
}
private void MdiClient_Paint(object sender, PaintEventArgs e)
{
if(_background_cache == null) { _background_cache = new Bitmap(FormGraphics.mdi_background, (int)(Height * _bg_scale), Height); }
e.Graphics.DrawImageUnscaled(_background_cache, Point.Empty);
}
private void MdiForm_SizeChanged(object sender, EventArgs e)
{
if (_background_cache != null) { _background_cache.Dispose(); }
_background_cache = null;
if (_mdi_client != null) { _mdi_client.Invalidate(); }
}
}
을 오류가 여기에 처리하기 위해, 분명히.
다시 기록 할 수 없습니다. MessageBox가 튀어 나오고 있습니까? 이미지가 유효합니까? – LarsTech
예 MessageBox가 표시되고 이미지도 유효합니다. 경로가 잘 설정되어 있습니다. 배경 이미지를 설정할 수 있습니까? 이미지의 크기를 인쇄하더라도 크기가 잘 인쇄됩니다. – Volatil3
폼에 두 개의 패널을 배치하고 둘 다 배경 이미지를 표시했습니다. – LarsTech