.Simba 发表于 2020-5-16 20:49:41

[已解决]状态栏如何跟随窗口大小而改变

本帖最后由 .Simba 于 2020-5-18 14:10 编辑

#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>

;功能:控制窗口最小尺寸100 x 100,最大尺寸800 x 800
;~ Global Const $WM_GETMINMAXINFO = 0x0024
$Gui = GUICreate("控制窗口大小", 300, 300, -1, -1, 0x00040000) ;$WS_SIZEBOX
GUISetState()

;状态栏设置
      Local $aParts =
      Local $aText =
      _GUICtrlStatusBar_Create($Gui, $aParts, $aText)

GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") ;注册回调函数

Do
Until GUIGetMsg() = -3

Func WM_GETMINMAXINFO($hwnd, $Msg, $wparam, $lparam)
      Local $tagMINMAXINFO = "int;int;int;int;int;int;int;int;int;int"
      $MINMAXINFO = DllStructCreate($tagMINMAXINFO, $lparam)
      DllStructSetData($MINMAXINFO, 7, 100)   ;min x
      DllStructSetData($MINMAXINFO, 8, 100)   ;min y
      DllStructSetData($MINMAXINFO, 9, 800)   ;max x
      DllStructSetData($MINMAXINFO, 10, 800)   ;max y
EndFunc   ;==>WM_GETMINMAXINFO自己尝试拼接代码,没有成功,哪位坛友帮忙指点下。


afan 发表于 2020-5-16 21:04:35

注册 WM_SIZE 消息,在该消息中计算部件宽度并SetParts

.Simba 发表于 2020-5-16 21:10:52

afan 发表于 2020-5-16 21:04
注册 WM_SIZE 消息,在该消息中计算部件宽度并SetParts

A大,上边的例子高度也不会改变,是不是也要计算高度?

afan 发表于 2020-5-16 21:15:03

.Simba 发表于 2020-5-16 21:10
A大,上边的例子高度也不会改变,是不是也要计算高度?

高度?是Y坐标吧?状态栏高度是常量。Y坐标SetParts就行了,会自动定位

.Simba 发表于 2020-5-16 21:31:36

afan 发表于 2020-5-16 21:15
高度?是Y坐标吧?状态栏高度是常量。Y坐标SetParts就行了,会自动定位


A大,窗口改变后,鼠标拖动这里也状态栏一下就下去了,是不是有简单一点的方法?



.Simba 发表于 2020-5-16 21:32:56

afan 发表于 2020-5-16 21:15
高度?是Y坐标吧?状态栏高度是常量。Y坐标SetParts就行了,会自动定位
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

;功能:控制窗口最小尺寸100 x 100,最大尺寸800 x 800
;~ Global Const $WM_GETMINMAXINFO = 0x0024
$Gui = GUICreate("控制窗口大小", 300, 300, -1, -1, 0x00040000) ;$WS_SIZEBOX
GUISetState()

;状态栏设置
Local $aParts =
Local $aText =
$g_hStatus = _GUICtrlStatusBar_Create($Gui, $aParts, $aText)

GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") ;注册回调函数
GUIRegisterMsg($WM_SIZE, 'WM_SIZE') ;改变状态栏大小

Do
Until GUIGetMsg() = -3

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
      Switch $hWnd
                Case $Gui
                        Switch $wParam
                              Case 0

                              Case 1

                              Case 2

                              Case 3

                              Case 4

                        EndSwitch
      EndSwitch

      $aPos = WinGetPos($Gui)
      If Not IsArray($aPos) Then Return
      ;这里不会写了
      ConsoleWrite($aPos & '->' & $aPos & '->' & $aPos & '->' & $aPos & @CRLF)

EndFunc   ;==>WM_SIZE

Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
      Local $tagMINMAXINFO = "int;int;int;int;int;int;int;int;int;int"
      $MINMAXINFO = DllStructCreate($tagMINMAXINFO, $lParam)
      ConsoleWrite($MINMAXINFO)
      DllStructSetData($MINMAXINFO, 7, 100)   ;min x
      DllStructSetData($MINMAXINFO, 8, 100)   ;min y
      DllStructSetData($MINMAXINFO, 9, 800)   ;max x
      DllStructSetData($MINMAXINFO, 10, 800)   ;max y
EndFunc   ;==>WM_GETMINMAXINFO

afan 发表于 2020-5-16 21:38:03

你要简单可以
Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
_GUICtrlStatusBar_Resize($hStatus)
EndFunc
要做就做好,敷衍很简单。

.Simba 发表于 2020-5-16 21:43:34

afan 发表于 2020-5-16 21:38
你要简单可以
Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
_GUICtrlStatusBar_Resize($hStatus)


谢谢A大,我再看看。 主要是对这个没头绪,不知道怎么下手。

.Simba 发表于 2020-5-16 22:01:35

afan 发表于 2020-5-16 21:38
你要简单可以
Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
_GUICtrlStatusBar_Resize($hStatus)


        ;这里不会写了
        ConsoleWrite($aPos & '->' & $aPos & '->' & $aPos & '->' & $aPos & @CRLF)
        Local $x = int($aPos / 3)
        ConsoleWrite($x & @CRLF)
        Local $arrX
        $arrX = $x
        $arrX = $x
        $arrX = -1
        _GUICtrlStatusBar_SetParts($g_hStatus, 3, $arrX)


A大我认真看了一下帮助,是不是这样的效果?

afan 发表于 2020-5-16 22:06:31

.Simba 发表于 2020-5-16 22:01
A大我认真看了一下帮助,是不是这样的效果?

去掉第二个参数位
_GUICtrlStatusBar_SetParts($g_hStatus, $arrX)

.Simba 发表于 2020-5-16 22:10:58

afan 发表于 2020-5-16 22:06
去掉第二个参数位
_GUICtrlStatusBar_SetParts($g_hStatus, $arrX)

去掉第二个参数,拖动窗口改变大小的时候,第二格栏会消失。


afan 发表于 2020-5-16 22:13:12

.Simba 发表于 2020-5-16 22:10
去掉第二个参数,拖动窗口改变大小的时候,第二格栏会消失。

那是因为你上面的计算不对,这也要我说么…

afan 发表于 2020-5-16 22:18:30

如果要第二个参数那就将3改为 -1
_GUICtrlStatusBar_SetParts($g_hStatus, -1, $arrX)

.Simba 发表于 2020-5-16 22:31:02

afan 发表于 2020-5-16 22:18
如果要第二个参数那就将3改为 -1
_GUICtrlStatusBar_SetParts($g_hStatus, -1, $arrX)

谢谢A大,我这里折腾如何计算还是没成功。

afan 发表于 2020-5-16 22:41:40

#include <GuiStatusBar.au3>

Global $hGui = GUICreate("控制窗口大小", 300, 300, -1, -1, 0x00040000) ;$WS_SIZEBOX
GUISetState()
Global $vbfb0 = 0.25, $vbfb1 = 0.5
Local $aParts =
Local $aText =
Global $hStatus = _GUICtrlStatusBar_Create($hGui, $aParts, $aText)
GUIRegisterMsg(0x05, "WM_SIZE")

Do
Until GUIGetMsg() = -3

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
        Local $aWp = WinGetPos($hGui)
        Local $aParts = [$aWp * $vbfb0, $aWp * $vbfb1, -1]
        _GUICtrlStatusBar_SetParts($hStatus, $aParts)
EndFunc   ;==>WM_SIZE
页: [1] 2
查看完整版本: [已解决]状态栏如何跟随窗口大小而改变