SC_MAXIMIZE和SC_RESTORE的问题

时间:2022-03-15 19:33:36
大家好,我是用SC_MAXIMIZE和SC_RESTORE来控制窗口的最大化和恢复,当我用SC_MAXIMIZE的时候,可以最大化窗口,这个时候得到的窗口宽度是1024(实际上是1440); 用SC_RESTORE来恢复窗口的时候(从最大化恢复到正常窗口), 得到的窗口宽度是1440(实际是1024),两个值完全颠倒了。。。代码如下:

if (IsZoomed(FmMain->Handle))
{      
PostMessage(FmMain->Handle, WM_SYSCOMMAND, SC_RESTORE, 0);     // 最大化
Label1->Caption = "恢复" + IntToStr(FmMain->Width);


}
else
{
PostMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
Label1->Caption = "最大化" + IntToStr(FmMain->Width);

13 个解决方案

#1


FmMain->Width的值应该还是显示之前的值,你可以把
Label1->Caption = "最大化" + IntToStr(FmMain->Width);
这句放在Form的Resize或是Paint事件里,应该会是正确的值。

#2


PostMessag => SendMessage结果就会是你要求的。

#3


引用 2 楼 my_love 的回复:
PostMessag => SendMessage结果就会是你要求的。


用sendmessage, 最大化都实现不了了

#4


我如果在一个button里用SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)和SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_RESTORE, 0)则可以最大化和恢复窗口的大小。
但如果我在panel的双击事件里使用,则不响应。。这是为什么啊?

#5


该回复于2010-12-28 13:27:53被版主删除

#6


读取之前加个延迟看看

#7


在panel的双击事件里用SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)无法最大化窗口,用postmessage可以最大化,但是获取的窗口的值不正确

但是在button里用SendMessage最大化却又可以

这是为什么阿
引用 6 楼 fall513 的回复:
读取之前加个延迟看看

#8


自己顶上去!

#9


我试了几个环境双击事件中都无法响应SendMessage跟PostMessage

我不知道你怎么实现的

但是关于你的值不正确的原因我倒是知道一些

PostMessage只是发送消息而已

而SendMessage会知道消息执行完毕之后才会返回,所以你用PostMessage之后马上获取width时窗口实际上还没有改变

其实你可以用其他方法实现你想要的功能,比如说双击后开启一个1ms的定时器,让定时器去执行SendMessage,然后再获取width

有时候道路不仅仅一条,一条走不通还可以走其他路嘛

不过如果你知道了为什么SendMessage在双击事情中无法响应的原因请麻烦告诉我一下,我也很想知道

#10


悲剧了。。。。好多错别字。。。

#11


知音啊!!求在双击事件中SendMessage的办法...................................

#12


不用找M$的Bug在DefWindowProc里,
function DefWindowProc; external user32 name 'DefWindowProcA';
function DefWindowProcA; external user32 name 'DefWindowProcA';
function DefWindowProcW; external user32 name 'DefWindowProcW';
看看VC那边的人有办法没?

#13



用个替代方法算了

  if( IsZoomed(Handle) )
    {
      //SendMessage( Handle, WM_SYSCOMMAND, SC_RESTORE, 12);            // 最大化
      this->WindowState = wsNormal;
      Caption = "恢复" + IntToStr(Width);
    }
    else
    {
      // SendMessage( Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 1);
      this->WindowState = wsMaximized;
       Caption = "最大化" + IntToStr(Width);
    }

#1


FmMain->Width的值应该还是显示之前的值,你可以把
Label1->Caption = "最大化" + IntToStr(FmMain->Width);
这句放在Form的Resize或是Paint事件里,应该会是正确的值。

#2


PostMessag => SendMessage结果就会是你要求的。

#3


引用 2 楼 my_love 的回复:
PostMessag => SendMessage结果就会是你要求的。


用sendmessage, 最大化都实现不了了

#4


我如果在一个button里用SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)和SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_RESTORE, 0)则可以最大化和恢复窗口的大小。
但如果我在panel的双击事件里使用,则不响应。。这是为什么啊?

#5


该回复于2010-12-28 13:27:53被版主删除

#6


读取之前加个延迟看看

#7


在panel的双击事件里用SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)无法最大化窗口,用postmessage可以最大化,但是获取的窗口的值不正确

但是在button里用SendMessage最大化却又可以

这是为什么阿
引用 6 楼 fall513 的回复:
读取之前加个延迟看看

#8


自己顶上去!

#9


我试了几个环境双击事件中都无法响应SendMessage跟PostMessage

我不知道你怎么实现的

但是关于你的值不正确的原因我倒是知道一些

PostMessage只是发送消息而已

而SendMessage会知道消息执行完毕之后才会返回,所以你用PostMessage之后马上获取width时窗口实际上还没有改变

其实你可以用其他方法实现你想要的功能,比如说双击后开启一个1ms的定时器,让定时器去执行SendMessage,然后再获取width

有时候道路不仅仅一条,一条走不通还可以走其他路嘛

不过如果你知道了为什么SendMessage在双击事情中无法响应的原因请麻烦告诉我一下,我也很想知道

#10


悲剧了。。。。好多错别字。。。

#11


知音啊!!求在双击事件中SendMessage的办法...................................

#12


不用找M$的Bug在DefWindowProc里,
function DefWindowProc; external user32 name 'DefWindowProcA';
function DefWindowProcA; external user32 name 'DefWindowProcA';
function DefWindowProcW; external user32 name 'DefWindowProcW';
看看VC那边的人有办法没?

#13



用个替代方法算了

  if( IsZoomed(Handle) )
    {
      //SendMessage( Handle, WM_SYSCOMMAND, SC_RESTORE, 12);            // 最大化
      this->WindowState = wsNormal;
      Caption = "恢复" + IntToStr(Width);
    }
    else
    {
      // SendMessage( Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 1);
      this->WindowState = wsMaximized;
       Caption = "最大化" + IntToStr(Width);
    }