[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/02/01(Wed) 14:08
投稿者名:ダンボ
URL :
タイトル:
MSFlexGridのリサイズで疑問
皆さん、こんにちは
4列のMSFlexGridをリサイズ時にフォームにキッチリ表示したいので下記コードにしました。
4列目のセル幅を自動調整する内部仕様です。
ところが実物合わせでデバッグすると、9行目のように-98程度しないとぴったり収まりません。
この98(96が正解かも)って何でしょうかね?どういう演算で求められる?

Private Sub Form_Resize()
Dim VscrSize As Long

If Me.WindowState = vbMinimized Then Exit Sub
VscrSize = GetSystemMetrics(SM_CXVSCROLL)
With grdFILES
  .Left = 0
  .Height = Me.ScaleHeight - .Top
  .Width = Me.ScaleWidth - .Left
  .ColWidth(3) = .Width - .ColWidth(0) - .ColWidth(1) - .ColWidth(2) - 98
  If Not .RowIsVisible(.Rows - 1) Then
     .ColWidth(3) = .ColWidth(3) - VscrSize * Screen.TwipsPerPixelX
  End If
End With
End Sub

投稿時間:2006/02/01(Wed) 17:30
投稿者名:GOD
Eメール:
URL :
タイトル:
Re: MSFlexGridのリサイズで疑問
grdFILES.Width はクライアント領域の幅ではなくグリッド全体の幅です。
上記を踏まえた上で、中に表示できるセルの幅はクライアント領域-8twip分ということです。
(8twip分小さくしなければいけないのはMSFlexGridの内部仕様かと)

#98は3D表示した時の値で全体の幅-クライアント領域の幅=90(Screen.TwipsPerPixelX=15とした時)だから。
#フラット表示にすると38になる。

↓検証用
        .Width = Me.ScaleWidth - .Left
        Dim rc As RECT
        Call GetClientRect(.hwnd, rc)  'grdFILESのクライアント領域を求める
        .ColWidth(3) = (rc.Right * Screen.TwipsPerPixelX) - .ColWidth(0) - .ColWidth(1) -
.ColWidth(2) - 8

#ウィンドウの大きさによっては.ColWidth(3)が−値になる可能性があるので注意。

投稿時間:2006/02/01(Wed) 17:36
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: MSFlexGridのリサイズで疑問
枠線の幅とスクロールの余裕かと
スクロールの余裕 =8
3D の場合の枠線の幅 45×2 + 8 = 98
フラットの場合      15×2 + 8 = 38

.Appearance = flexFlat
.BorderStyle = flexBorderNone
の場合 = 8 (線幅がいらないからスクロールの余裕分だけ)


# かぶってしまった。

投稿時間:2006/02/01(Wed) 17:47
投稿者名:ダンボ
URL :
タイトル:
[解決]MSFlexGridのリサイズで疑問
GOD さん、花ちゃん さん どうもありがとうございます。まとめ感謝です。

> grdFILES.Width はクライアント領域の幅ではなくグリッド全体の幅です。
あ、納得納得。大納得です。.ScaleWidthはちょっと頭を掠めたのだけれど。
GetClientRectを使って自分でバンバンすればよいんですね。
ColWidth(3)の負値、バグの元です。

> .Appearance = flexFlat
> .BorderStyle = flexBorderNone
> の場合 = 8 (線幅がいらないからスクロールの余裕分だけ)
こういうややこしい場合分けは嫌だから、MSFlexGridにも.ScaleWidthがあれば良いのに。。

#確かSSTabには.ClientWidthがあったような(未確認)
#多分、昔はFlatだけだったので不要だったが3D表示を追加したときに.ScaleWidth/.ClientWidthを手抜きで追加しなかったのだろう

こんな内部関数を作って対処しました。スクロールバーも除いたサイズを返してくれるので結構。

Private Function InnerWidth(CNT As Control) As Long
Dim RCT As RECT, rc As Long
    rc = GetClientRect(CNT.hWnd, RCT)
    InnerWidth = RCT.Right * Screen.TwipsPerPixelX - 8
End Function

投稿時間:2006/02/13(Mon) 11:11
投稿者名:ダンボ
URL :
タイトル:
カラム幅調整のイベントは?
ちょっとだけ別件なのですが、密接に関連しているので同じスレッドに続けます。

上記まではフォームリサイズ時のColWidth(3)のサイズ調整の話でした。
今回は、MSFlexGridの持つカラム幅調整機能を使ったときにColWidth(3)のサイズをどう調整するか?

grdFILES.AllowUserResizing = flexResizeColumns と設定しておけば各カラム幅をマウスで調整できま
す。
問題点:カラム2とカラム3のセパレータをマウスで左に動かすとカラム2の幅は自動的に小さくなるがカ
ラム3の幅は変わらない。従って右側から空白の領域が現れてきて美しくない。
解決方法:やはりColWidth(3)のサイズを自動調節して吸収したい。

Private Sub grdFILES_?????()
If Me.WindowState = vbMinimized Then Exit Sub
With grdFILES
  .ColWidth(3) = InnerWidth(grdFILES) - .ColWidth(0) - .ColWidth(1) - .ColWidth(2)
End With
End Sub

質問:カラム間のセパレータをマウスで左右ドラッグしたときのイベントは何?
   (一応考えられるイベントにブレークポイントを入れて実験したけど来ない)

(*)ColWidth(3)の負値については無視して置いて下さい。