SC_MAXIMIZE和SC_RESTORE的问题

noibird 2010-12-27 01:16:27
大家好,我是用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);

...全文
1911 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
My_Love 2010-12-29
  • 打赏
  • 举报
回复
不用找M$的Bug在DefWindowProc里,
function DefWindowProc; external user32 name 'DefWindowProcA';
function DefWindowProcA; external user32 name 'DefWindowProcA';
function DefWindowProcW; external user32 name 'DefWindowProcW';
看看VC那边的人有办法没?
fxworld 2010-12-29
  • 打赏
  • 举报
回复

用个替代方法算了

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);
}
noibird 2010-12-28
  • 打赏
  • 举报
回复
我如果在一个button里用SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)和SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_RESTORE, 0)则可以最大化和恢复窗口的大小。
但如果我在panel的双击事件里使用,则不响应。。这是为什么啊?
noibird 2010-12-28
  • 打赏
  • 举报
回复
在panel的双击事件里用SendMessage(FmMain->Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)无法最大化窗口,用postmessage可以最大化,但是获取的窗口的值不正确

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

这是为什么阿
[Quote=引用 6 楼 fall513 的回复:]

读取之前加个延迟看看
[/Quote]
fall513 2010-12-28
  • 打赏
  • 举报
回复
读取之前加个延迟看看
noibird 2010-12-28
  • 打赏
  • 举报
回复
知音啊!!求在双击事件中SendMessage的办法...................................
fall513 2010-12-28
  • 打赏
  • 举报
回复
悲剧了。。。。好多错别字。。。
fall513 2010-12-28
  • 打赏
  • 举报
回复
我试了几个环境双击事件中都无法响应SendMessage跟PostMessage

我不知道你怎么实现的

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

PostMessage只是发送消息而已

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

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

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

不过如果你知道了为什么SendMessage在双击事情中无法响应的原因请麻烦告诉我一下,我也很想知道
noibird 2010-12-28
  • 打赏
  • 举报
回复
自己顶上去!
noibird 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 my_love 的回复:]

PostMessag => SendMessage结果就会是你要求的。
[/Quote]

用sendmessage, 最大化都实现不了了
My_Love 2010-12-27
  • 打赏
  • 举报
回复
PostMessag => SendMessage结果就会是你要求的。
|????| 2010-12-27
  • 打赏
  • 举报
回复
FmMain->Width的值应该还是显示之前的值,你可以把
Label1->Caption = "最大化" + IntToStr(FmMain->Width);
这句放在Form的Resize或是Paint事件里,应该会是正确的值。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧