Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7880 / 13644 ツリー ←次へ | 前へ→

【36270】画面サイズ変更を実現させるには? ueda 06/3/27(月) 12:08 質問[未読]
【36283】Re:画面サイズ変更を実現させるには? yuu1 06/3/27(月) 15:32 回答[未読]
【36284】Re:画面サイズ変更を実現させるには? ueda 06/3/27(月) 15:42 質問[未読]
【36295】Re:画面サイズ変更を実現させるには? yuu1 06/3/27(月) 17:10 回答[未読]
【36311】Re:画面サイズ変更を実現させるには? ueda 06/3/28(火) 9:39 お礼[未読]

【36270】画面サイズ変更を実現させるには?
質問  ueda  - 06/3/27(月) 12:08 -

引用なし
パスワード
   Excel VBAで画面サイズを縦幅のみ変更可能にし、
横幅を常に固定表示させるフォームを実現させるため、
以下のようなコードを書きました。
モーダルフォームに対しては、意図した動きになるのですが
モーダレスフォームに対しては、画面が表示された段階で
CPUの負荷が常に100%になり、EXCELが固まってしまいます。
ちなみにVBではモーダルフォーム、モーダレスフォームに対しても意図した動きになります。
Excel VBAのモーダレスフォームに対して画面サイズ変更を実現させるには
どうすればいいのでしょうか?
皆さんのお知恵をお貸し下さい。

------------------------------------------------
Private Sub UserForm_Initialize()
  'ユーザーフォームのハンドル取得
  hwnd = FindWindow("ThunderDFrame", Me.Caption)
  'フックの開始
  OldWp = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf fncWndProc)
End Sub
------------------------------------------------
Public Function fncWndProc( _
  ByVal hwnd As Long, ByVal uMsg As Long, _
  ByVal wParam As Long, ByVal lParam As Long) As Long

    'RECTワーク
    Dim wkRect As RECT
  
    '関数返値の初期値
  fncWndProc = 0
  
    'フックしたメッセージの振り分けと対処
  Select Case uMsg
    Case WM_SIZING
      Call MoveMemory(wkRect, ByVal lParam, LenB(wkRect))
      '横幅は固定
      wkRect.Right = wkRect.Left + 250
      '縦幅は50ピクセル刻み
      wkRect.Bottom = wkRect.Top + ((wkRect.Bottom - wkRect.Top) \ 50) * 50
      Call MoveMemory(ByVal lParam, wkRect, Len(wkRect))
    Case Else
      fncWndProc = CallWindowProc(OldWp, hwnd, uMsg, wParam, lParam)
  End Select

End Function
------------------------------------------------

【36283】Re:画面サイズ変更を実現させるには?
回答  yuu1  - 06/3/27(月) 15:32 -

引用なし
パスワード
   こんにちは
>モーダルフォームに対しては、意図した動きになるのですが
>モーダレスフォームに対しては、画面が表示された段階で
>CPUの負荷が常に100%になり、EXCELが固まってしまいます。
Excel(Modelessのユーザーフォーム)でフック処理は無謀です。
ほぼ必ずハンブアップするでしょう。
ややこしい事はせずにResizeイベントで処理できると思います。

【36284】Re:画面サイズ変更を実現させるには?
質問  ueda  - 06/3/27(月) 15:42 -

引用なし
パスワード
   yuu1 さん、早速の回答ありがとうございます。
当初、Resizeイベントで画面サイズ変更をさせようとしたのですが
画面のプロパティ→効果タブで
「ドラッグ中にウィンドウの内容を表示する」
にチェックを入れると画面がちらついてしまい、断念してしまいました。
もしちらつきの回避方法をご存知でしたらお教えいただけないでしょうか?

宜しくお願い致します。

【36295】Re:画面サイズ変更を実現させるには?
回答  yuu1  - 06/3/27(月) 17:10 -

引用なし
パスワード
   こんにちは
>「ドラッグ中にウィンドウの内容を表示する」
>にチェックを入れると画面がちらついてしまい、断念してしまいました。
これだと一般のウィンドウもサイズ変更すると結構ちらつきますよ。
いくらか改善するなら、でWaitをおくとか、
Resizeでサイズ変更した場合のイベントを抑止するとかでしょうか。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub UserForm_Resize()
 '処理
 '
 DoEvents
 Sleep 200
End Sub

【36311】Re:画面サイズ変更を実現させるには?
お礼  ueda  - 06/3/28(火) 9:39 -

引用なし
パスワード
   yuu1 さん、回答ありがとうございます。
Waitをおくことでちらつきが改善されました。
情報ありがとうございました。

7880 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free