• ベストアンサー

Formサイズの最小値

環境 VB6.0 ResizerというOCX Formのサイズを可変にしています。 小さくできる最小値を設定したいのですが、 どのように出来ますか? Form_Resizeに、 if me.width < '最小値' then me.width = '最小値' end if としたら、最小値より小さくしようとして戻すので、 画面がチカチカします。 Resizerで簡単にできませんか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#185804
noname#185804
回答No.2

Resizerについては分かりませんが ResizerにEnabledプロパティはありますか? あれば下記のようにResizeされた時に Enabled=Falseされても改善されませんか? Private Sub Form_Resize() If Not Me.WindowState = vbMinimized Then  If Me.Width < '最小値' Then   Resizer.Enabled = False   Me.Width = '最小値'  End If End If End Sub Resizerでサイズ制限が出来るのならその方が良いのですが。

wan-chan
質問者

お礼

ありがとうございます。 Resizerでは出来なかったのですが、 Me.enabled = false を入れてできました。 ただし、他の方が作成した実現できているソースを見ると、 Form_Resizerには何も書かれていません。 でも、最小値でぴたりと止ります。 比較しても、、ResizerのHelpを見てもわかりませんでした…。 今回はこれで対応しました。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

> Resizerでは出来なかったのですが、 > Me.enabled = false > を入れてできました。 Me.Enabled = False にして、その後どうやってフォームを操作するので しょうか? 何か技があるんですか? ともあれ解決したなら良かったですね^^ > Form_Resizerには何も書かれていません。 サブクラス化によるサイズ制限のサンプルがありましたので、蛇足になり ますが一応提示しておきます。お試しになる場合は不意に終了しない様に くれぐれもご注意下さい。 ' // 標準モジュール ------------------------------------------------------------ Option Explicit ' フォームのサイズ制限 Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" ( _   ByRef pDest As Any, _   ByRef pSrc As Any, _   ByVal iSize As Long) Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _   ByVal lpPrevWndFunc As Long, _   ByVal hwnd As Long, _   ByVal Msg As Long, _   ByVal wParam As Long, _   ByVal lParam As Long _ ) As Long Private Const WM_GETMINMAXINFO = &H24 Private Type POINTAPI   x As Long   y As Long End Type Private Type MINMAXINFO   ptReserved   As POINTAPI   ptMaxSize   As POINTAPI   ptMaxPosition As POINTAPI   ptMinTrackSize As POINTAPI   ptMaxTrackSize As POINTAPI End Type Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _   ByVal hwnd As Long, _   ByVal nIndex As Long, _   ByVal dwNewLong As Long _ ) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _   ByVal hwnd As Long, _   ByVal nIndex As Long) As Long Private Const GWL_WNDPROC = (-4) Private PreWndProcAddress As Long Private Limit_hWnd    As Long Private LimitSize     As POINTAPI Public Function WndProc( _   ByVal hwnd As Long, _   ByVal iMsg As Long, _   ByVal wParam As Long, _   ByVal lParam As Long) As Long   Dim ret     As Long   Dim MINMAX   As MINMAXINFO   If iMsg = WM_GETMINMAXINFO And Limit_hWnd = hwnd Then     memcpy MINMAX, ByVal lParam, LenB(MINMAX)     With MINMAX       .ptMinTrackSize.x = LimitSize.x       .ptMinTrackSize.y = LimitSize.y     End With     memcpy ByVal lParam, MINMAX, LenB(MINMAX)     ret = 0&   Else     ret = CallWindowProc(PreWndProcAddress, hwnd, iMsg, wParam, lParam)   End If   WndProc = ret End Function Public Sub LimitStart( _   ByVal hwnd As Long, _   ByVal MinX As Long, _   ByVal MinY As Long)      LimitEnd   If hwnd <> 0 Then     LimitSize.x = MinX     LimitSize.y = MinY     Limit_hWnd = hwnd     PreWndProcAddress = GetWindowLong(hwnd, GWL_WNDPROC)     SetWindowLong hwnd, GWL_WNDPROC, AddressOf WndProc   End If End Sub Public Sub LimitEnd()   If Limit_hWnd <> 0 Then     SetWindowLong Limit_hWnd, GWL_WNDPROC, PreWndProcAddress     Limit_hWnd = 0   End If End Sub ' // フォームモジュール ------------------------------------------------------ Private Sub Form_Load()   Dim MinX As Long, MaxX As Long   MinX = Me.Width / Screen.TwipsPerPixelX   MinY = Me.Height / Screen.TwipsPerPixelY   Call LimitStart(Me.hwnd, MinX, MinY) End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)   ' 必ず最後に呼び出して下さい。   Call LimitEnd End Sub

wan-chan
質問者

お礼

ありがとうございます。 Me.Enabled = False にして、最小値を設定したらすぐにTrueに戻しています。 これで、ちらつきはなくなりました。 今回、サブクラス化は試していませんが、 時間が取れるときに、絶対試してみます。 今後のためにも。 ありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。 Resizer というのは使ったことがありませんので分かりませんが、ドキュメントを 読めば少なくともその OCX で可能かどうかぐらいはわかるのでは? VB では通常ご質問文にあるようなコードでフォームのサイズ制限をしますけど、 チラツキがどうしても気になるのであれば、サブクラス化するしかないと思います。 WM_GETMINMAXINFO + VB 辺りで ウェブ検索すればサンプルが見つかると思います。 あまりお勧めできませんが...

wan-chan
質問者

お礼

ありがとうございます。 調べてみます。

関連するQ&A

  • 3フォームの重なり順を変えない方法+同時最小化

     今晩は、質問させていただきます。どうぞよろしくお願いいたします。 Form1(メインフォーム)の下にForm2を、 Form2の下にForm3を表示し、これらの順番が変わらないように致したく、 次のようにコーディングいたしました。 【Form1のコード】  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    Dim form2o As New Form2    Dim form3o As New Form3    Me.Owner = form2o    form2o.Show()  End Sub 【Form2のコード】  Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    Dim form3o As New Form3    Me.Owner = form3o    form3o.Show()  End Sub  この状態のまま、タスクバー上のアプリケーション名をクリックした際の 最小化⇔普通化を(3フォームとも一緒に)させたいのですがうまくいきません。。  Form1に、下の【コード1】のようにコーディングいたしましたら、 タスクバーのForm1クリック(最小化) →3つとも最小化(成功)いたしますが、 Form1とForm2がタスクバー上から消えてしまい、Form1クリックによる最大化ができなくなります。  またForm3に、下の【コード2】のようにコーディングいたしましたら、 タスクバーのForm3をクリックしてもForm1が一回ちらつくだけで、最小化すらできません。。  まったく違うイベントを取る方法や、Owner指定方法自体を行わない方法でも結構でございますので、 何かこの動作をうまくできる方法はないでございましょうか?  ずっと悩んでおりますが、解決致しません。もしお詳しい方がいらっしゃいましたら, 是非ともアドバイスいただきたく、どうぞよろしくお願いいたします。 【コード1】   Public Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize     Dim form2o As New Form2     If Me.WindowState = FormWindowState.Minimized Then       Owner.WindowState = FormWindowState.Minimized       Owner.Owner.WindowState = FormWindowState.Minimized     ElseIf Me.WindowState = FormWindowState.Normal Then       Owner.WindowState = FormWindowState.Normal       Owner.Owner.WindowState = FormWindowState.Normal     End If   End Sub 【コード2】   Public Sub Form3_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize     If Me.WindowState = FormWindowState.Minimized Then       Form1.WindowState = FormWindowState.Minimized       Form2.WindowState = FormWindowState.Minimized     ElseIf Me.WindowState = FormWindowState.Normal Then       Form2.WindowState = FormWindowState.Normal       Form1.WindowState = FormWindowState.Normal     End If   End Sub  何卒お願いいたします。

  • VB.NET Form1からForm2を開いたり閉じたりする方法

    VB.NET2005でForm1にあるCheckBoxをTrueにするとform2をモードレスフォームとして開き、CheckBoxをFalseにするとform2を閉じる方法がわかりません。また、form2の[×]で閉じた時にはForm1にあるCheckBoxをFalseにする方法がわかりません。 '----------------------------------- Private Sub CheckBox2_CheckedChanged ・・・   Dim f_cnt As Integer   Dim form2 As New Form2()   f_cnt = My.Application.OpenForms.Count   If CheckBox1.Checked = True Then     If f_cnt = 1 Then form1.Show() 'モードレスフォームとして表示する   Else    form2.Close() ←閉じない   End If End Sub '-----------------------------------

  • 最小化したフォームを元に戻す

    VB2005Expressにて開発を行っています。 最小化したフォームを元に戻せなくて困っています。 どなたかご存知の方がいらっしゃいましたらご教授願います。 下記の動作を実現したいと思っています。 ・Form1でボタンが押されたらForm2を表示する ・この際にForm1を最小化する ・Form2を閉じる ・この際にForm1を元に戻す(手前に表示する) 以下が作成したプログラムです。 ---モジュールにて下記を宣言 Module Module1 'オブジェクトの宣言 Public f1 As New Form1 Public f2 As New Form2 End Module ---Form1でForm2を開くボタンを押した場合の処理 Private Sub Button1_Click(ByVal sender~ 'Form2を表示 If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 End If f2.Show() 'Form1を最小化する Me.WindowState = FormWindowState.Minimized End Sub ---Form2にて閉じるボタンを押した場合 Private Sub Button4_Click(ByVal sender~ f1.WindowState = FormWindowState.Normal ↑コレで実現できるかと思ったのですが、最小化されたままです・・・ End Sub

  • フォームがリサイズされた時の各コントロールの位置変更コードについて

    教えてください。 前々から疑問だったのですが、VBでフォームをリサイズした場合に それぞれのコントロールもそれに合わせて大きさが変更されたり 移動したりという状態にするには、当然Form_Resizeのコードを 書く必要があると思うのですが、VBでツールを作成される方は 皆さんひとつひとつのコントロールの位置を計算しながら毎回 コードを書いているのでしょうか? OCXなどを使うと、勝手にコントロールの位置を調整してくれるものも ありますが、やはり皆さん自分でコードを書いていらっしゃるのでしょうか? 私が分かるのは、フォームにテキストボックスのみを貼り付けて、 Private Sub Form_Resize() Form1.text1.Top = 0 Form1.text1.Left = 0 Form1.text1.Width = ScaleWidth Form1.text1.Height = ScaleHeight End Sub と書くと、リサイズに合わせてテキストボックスが画面いっぱいにサイズ変更 するというものです。 コマンドボタンとか色々貼り付けた状態ではどのように書けばいいのか いまひとつ分かりません。 皆さんはどのようにされているのでしょうか? 是非是非教えてください。

  • VB.NET:モーダルで表示したフォームを最小化

    Form2をForm1の所有として、モーダルで表示しました。 '------------------------ Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChildMdl.Click  'Form2を開く  Dim frmN As New Form2  frmN.ShowDialog(Me) 'MeはForm1 End Sub '------------------------ Form2が最小化された時に、親フォームであるForm1も最小化させたいと思い、 Form2のResizeメソッドに以下のようなコードを書きました。 '------------------------ Private Sub Form2_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize  Select Case Me.WindowState   Case FormWindowState.Minimized    '親フォームも最小化((1))    Me.Owner.WindowState = FormWindowState.Minimized   Case FormWindowState.Maximized    '親フォームも最大化((2))    Me.Owner.WindowState = FormWindowState.Maximized   Case FormWindowState.Normal    '親フォームも通常サイズ((3))    Me.Owner.WindowState = FormWindowState.Normal  End Select End Sub '------------------------ しかし、(2)、(3)は問題なく実行できるのですが、 (1)を実行すると、自フォーム(Form2)が閉じてしまうのです。 そういう仕様なのでしょうか? ご存知の方、教えてください。よろしくお願いします。

  • form2がボタンを押すと消えてしまう

    vb2010で、作成しています。form1から、form2を呼び出し、okボタンまたは、cancelボタンを押すと、無条件でform2が消えてしまいます。私がしたいのは、form2(パスワード入力ウィンドウ)でテキストボックスにパスワードを入力してokボタンを押して、それが正しい(1234)ときのみform2を消去することです。現在のところ、入力したパスワードが間違っていてもokボタンを押すと、form2は消えてしまいます。 form1側のコードとform2側のコードは以下です。お手数ですが御教示いただけると幸いです。 /////////Form1 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Form2() f.TextBox1.PasswordChar = "*"c '//入力文字をマスクする If f.ShowDialog(Me) = DialogResult.OK Then If f.TextBox1.Text = "1234" Then f.Dispose() End If End If End Sub End Class /////////Form2 Public Class Form2 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.OK End Sub Private Sub btncancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncancel.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.Cancel End Sub End Class

  • VB6での画像のサイズ変更に関して

    お世話になります VB6での画像のサイズ変更に関して教えていただけないでしょうか 機能としては、画像を読み込み、指定サイズ枠内のサイズで一旦フォームに表示して画像を確認 問題なければ、エクセルに保存なのですが フォーム表示時にサイズを変更したにも関わらず、 エクセルに保存すると、元画像のサイズで保存されてしまいます。 表示と保存を同じtwip幅にするにはどのようにしたらよろしいでしょうか ******** 画像読み込み&リサイズ抜粋 Me.CDialog.CancelError = True Me.CDialog.Flags = cdlOFNExplorer + cdlOFNLongNames + cdlOFNHideReadOnly + cdlOFNNoChangeDir + cdlOFNFileMustExist Me.CDialog.Filter = strMessage(33) & "(*.jpg;*.bmp)|*.jpg;*.bmp" Me.CDialog.Filename = "" Me.CDialog.ShowOpen Me.CDialog.Flags = 0 If Err Then Err.Clear On Error GoTo 0 Exit Sub End If If Trim(Me.CDialog.Filename) = "" Then On Error GoTo 0 Exit Sub End If ' 画像の比率を保って、画像をセットする Me.PImage(Index).Stretch = False ' 一旦元の大きさで読み込み指定 Me.PImage(Index).Visible = False ' 一旦非表示にする Me.PImage(Index).Picture = LoadPicture(Me.CDialog.Filename) ' 縦方向基準縮尺変更 If Me.PImage(Index).Height > Report_PImageHei Then Me.PImage(Index).Stretch = True HWTemp = Me.PImage(Index).Height Me.PImage(Index).Height = Report_PImageHei Me.PImage(Index).Width = Me.PImage(Index).Width * Me.PImage(Index).Height / HWTemp End If ' 横方向基準縮尺変更 If Me.PImage(Index).Width > Report_PImageWid Then HWTemp = Me.PImage(Index).Width Me.PImage(Index).Stretch = True Me.PImage(Index).Width = Report_PImageWid Me.PImage(Index).Height = Me.PImage(Index).Height * Me.PImage(Index).Width / HWTemp End If ********* エクセルへの出力抜粋(上記と別関数) Clipboard.Clear Clipboard.SetData Me.PImage(i).Picture WB.ActiveSheet.Cells(YY1, XX1).Select WB.ActiveSheet.Paste pict = Selection.Name Clipboard.Clear

  • Form間のデータ渡しについて

    申し訳ありません。VB.NET初心者です。 Form1から、ボタンAをクリックするとForm2がオープンします。 Form1から、ボタンBをクリックするとForm3がオープンします。 Form1では、Form2またはForm3で設定した値をそれぞれ演算に使おうとしています。 MicrosoftのHPからパクってForm1 - Form2間のデータの引渡しを行うことはできたの ですが、新規でForm3を作成して、Form1 - Form3間のデータの引渡しを行おうとする とForm3の立ち上がり時に "NullReferenceException はハンドルされませんでした"となり、 困ってしまいました。 使われている方から見ると簡単かもしれず 申し訳ありませんが、どなたか教えていただけないでしょうか。 ==================== Form1.vb ======================= Form1には、Label1、Label2、Button1、Button2があります。 Public Class Form1 Inherits System.Windows.Forms.Form Private m_form2 As Form2 Private m_form3 As Form3 Public Property LabelText() As String Get Return Label1.Text End Get Set(ByVal Value As String) Label1.Text = Value End Set End Property Public Property LabelText2() As String Get Return Label2.Text End Get Set(ByVal Value As String) Label2.Text = Value End Set End Property Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScaleYokusou.Click m_form2 = New Form2(Me) m_form2.ShowDialog() m_form2.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScaleHikito.Click m_form3 = New Form3() m_form3.ShowDialog() m_form3.Dispose() End Sub End Class ==================== Form2.vb ======================= Form2には、TextBox1、Button1があります。 Public Class Form2 Inherits System.Windows.Forms.Form Private m_form1 As Form1 Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If m_form1 Is Nothing = False Then m_form1.LabelText = Me.TextBox1.Text End If End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If m_form1 Is Nothing = False Then Me.TextBox1.Text = m_form1.LabelText End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub End Class ==================== Form3.vb ======================= Form3には、TextBox1、Button1があります。 Public Class Form3 Inherits System.Windows.Forms.Form Private m_form1 As Form1 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If m_form1 Is Nothing = False Then m_form1.LabelText2 = Me.TextBox1.Text End If End Sub Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.TextBox1.Text = m_form1.LabelText2 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub End Class

  • Form1上にあるTextBox1を Module1.vbから参照したい

    初歩的なことで、すいません・・・ 以前、覚えていたのですが、ド忘れしてしまいました。 タイトルどおりで、Form1上に配置したTextBox1を、Module1.vb内に書いた関数内で用いるには、TextBox1のみの記述だと、ビルドエラーとなります。 他のモジュールから、Form1上に配置したTextBox1を見るには、どのように指定するのか、ご教授下さい。 よろしくお願いします。 ----------以下だと"TextBox1"のところでエラーとなる---------- <Module1.vb> Sub xxxxx()  If TextBox1.Text = "0" Then   ・・・・  End If End Sub

  • フォームのリサイズ

    現在、フォームのリサイズのときにこれ以上高さを変えないようにするために以下のようなコードを記述しています。 ------------------------------ Private Sub MDIForm_Resize()    If Height < 2500 Then     Height = 2500     Exit Sub    End If End Sub ------------------------------ 一応、これで上手くはいっているのですが、実行時、高さを2500以下にしようと動かしたとき、ちらつきというか妙な残像のようなものが出てしまいます。 こんな変な残像が出ずに、VB自身の画面を変えたときのようにピタっと止まるような表示が出来るようにする方法は無いものでしょうか。 ちなみに、開発環境はWin2000、VB6です。 よろしくお願いします。