<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MikeSoft &#187; MDI</title>
	<atom:link href="http://mikesoft.ws/tag/mdi/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikesoft.ws</link>
	<description>Practical Software</description>
	<lastBuildDate>Mon, 28 Nov 2011 18:09:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MDI и Windows Vista</title>
		<link>http://mikesoft.ws/2009/08/13/mdi-windows-vista/</link>
		<comments>http://mikesoft.ws/2009/08/13/mdi-windows-vista/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:53:53 +0000</pubDate>
		<dc:creator>Smike</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Советы]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[MDI]]></category>
		<category><![CDATA[Windows Vista]]></category>

		<guid isPermaLink="false">http://mikesoft.ws/?p=202</guid>
		<description><![CDATA[В Windows Vista во многих MDI приложениях часто наблюдается баг (субъективно &#8212; в SP1/SP2 значительно реже) при максимизации дочернего окна &#8212; оно занимает не всю отведенную ему область. Справа остается небольшое пространство. Ответ был найден на MSDN форуме, но применительно к MFC. Но в Delphi эта проблема также встречается и решается аналогично. Вот исходный код, [...]]]></description>
			<content:encoded><![CDATA[<p>В Windows Vista во многих MDI приложениях часто наблюдается баг (субъективно &#8212; в SP1/SP2 значительно реже) при максимизации дочернего окна &#8212; оно занимает не всю отведенную ему область. Справа остается небольшое пространство.<span id="more-202"></span></p>
<p>Ответ был найден на MSDN форуме, но применительно к MFC. Но в Delphi эта проблема также встречается и решается аналогично. Вот исходный код, который поможет исправить проблему. Его нужно добавить к дочернему окну (FormStyle = fsMDIChild).</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">type</span>
  TMDIChild <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><span style="color: #000066;">&#40;</span>TForm<span style="color: #000066;">&#41;</span>
  <span style="color: #000000; font-weight: bold;">private</span>
    <span style="color: #000000; font-weight: bold;">procedure</span> WMGetMinMaxInfo<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> Message<span style="color: #000066;">:</span> TWMGetMinMaxInfo<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> message WM_GETMINMAXINFO<span style="color: #000066;">;</span>
  <span style="color: #000066;">...</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #000066;">...</span>
<span style="color: #808080; font-style: italic;">(*
Оригинальный комментарий к решению:
--------------------------------------------------------------------------------
Заплатка на MFC версий ниже 8.0
&nbsp;
В MFC версиях 8.0 на Vista есть проблема, когда
окно дочернего MDI фрейма максимизируется при максимизированном
родительском MDI фрейме. В этом случаи максимальный размер окна ограничивается
данными структуры MINMAXINFO, которые были вычесленны ранее
системой при заданных стилях окна.
&nbsp;
Однако сам MFC в процессе ресайза этого окна любит менять ему
стили на ходу в результате система путается и MINMAXINFO содержит неправильные
данные.
&nbsp;
Это было не критично на XP и более старых системах, т.к. ошибка
была в 1 пиксель, теперь же на Vista, когда бордюр имеет занчительную ширину (4
пикселя), эта ошибка стала заметна (как раз на эту ширину - 4 пикселя).
&nbsp;
Чтобы исправить ошибу я вручную правлю структуру MINMAXINFO под
максимально возможный размер окна.
--------------------------------------------------------------------------------
&nbsp;
Smike: Похоже этот баг перенесли и в Delphi :)
*)</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">procedure</span> TMDIChild<span style="color: #000066;">.</span><span style="color: #006600;">WMGetMinMaxInfo</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> Message<span style="color: #000066;">:</span> TWMGetMinMaxInfo<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  <span style="color: #000000; font-weight: bold;">if</span> WindowState &lt;&gt; wsMaximized <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #000000; font-weight: bold;">inherited</span>
  <span style="color: #000000; font-weight: bold;">else</span>
    <span style="color: #000000; font-weight: bold;">with</span> Message<span style="color: #000066;">.</span><span style="color: #006600;">MinMaxInfo</span><span style="color: #000066;">^</span> <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">begin</span>
      <span style="color: #000000; font-weight: bold;">if</span> ptMaxTrackSize<span style="color: #000066;">.</span><span style="color: #006600;">X</span> &lt; ptMaxSize<span style="color: #000066;">.</span><span style="color: #006600;">X</span> <span style="color: #000000; font-weight: bold;">then</span> ptMaxTrackSize<span style="color: #000066;">.</span><span style="color: #006600;">X</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ptMaxSize<span style="color: #000066;">.</span><span style="color: #006600;">X</span><span style="color: #000066;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> ptMaxTrackSize<span style="color: #000066;">.</span><span style="color: #006600;">Y</span> &lt; ptMaxSize<span style="color: #000066;">.</span><span style="color: #006600;">Y</span> <span style="color: #000000; font-weight: bold;">then</span> ptMaxTrackSize<span style="color: #000066;">.</span><span style="color: #006600;">Y</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ptMaxSize<span style="color: #000066;">.</span><span style="color: #006600;">Y</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #808080; font-style: italic;">{ // Если не жалко пару десятков килобайт
  // в исполняемом файле - можно использовать функции модуля Math
  if WindowState &lt;&gt; wsMaximized then
    inherited
  else
    with Message.MinMaxInfo^ do
    begin
      ptMaxTrackSize.X := Max(ptMaxTrackSize.X, ptMaxSize.X);
      ptMaxTrackSize.Y := Max(ptMaxTrackSize.Y, ptMaxSize.Y);
    end;}</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://mikesoft.ws/2009/08/13/mdi-windows-vista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

