- ベストアンサー
Formサイズの最小値
環境 VB6.0 ResizerというOCX Formのサイズを可変にしています。 小さくできる最小値を設定したいのですが、 どのように出来ますか? Form_Resizeに、 if me.width < '最小値' then me.width = '最小値' end if としたら、最小値より小さくしようとして戻すので、 画面がチカチカします。 Resizerで簡単にできませんか?
- wan-chan
- お礼率76% (1582/2056)
- Visual Basic
- 回答数3
- ありがとう数5
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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でサイズ制限が出来るのならその方が良いのですが。
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 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
お礼
ありがとうございます。 Me.Enabled = False にして、最小値を設定したらすぐにTrueに戻しています。 これで、ちらつきはなくなりました。 今回、サブクラス化は試していませんが、 時間が取れるときに、絶対試してみます。 今後のためにも。 ありがとうございました。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 Resizer というのは使ったことがありませんので分かりませんが、ドキュメントを 読めば少なくともその OCX で可能かどうかぐらいはわかるのでは? VB では通常ご質問文にあるようなコードでフォームのサイズ制限をしますけど、 チラツキがどうしても気になるのであれば、サブクラス化するしかないと思います。 WM_GETMINMAXINFO + VB 辺りで ウェブ検索すればサンプルが見つかると思います。 あまりお勧めできませんが...
お礼
ありがとうございます。 調べてみます。
関連する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 何卒お願いいたします。
- ベストアンサー
- Visual Basic
- 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 '-----------------------------------
- ベストアンサー
- Visual Basic
- 最小化したフォームを元に戻す
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
- ベストアンサー
- Visual Basic
- フォームがリサイズされた時の各コントロールの位置変更コードについて
教えてください。 前々から疑問だったのですが、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 と書くと、リサイズに合わせてテキストボックスが画面いっぱいにサイズ変更 するというものです。 コマンドボタンとか色々貼り付けた状態ではどのように書けばいいのか いまひとつ分かりません。 皆さんはどのようにされているのでしょうか? 是非是非教えてください。
- ベストアンサー
- Visual Basic
- 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)が閉じてしまうのです。 そういう仕様なのでしょうか? ご存知の方、教えてください。よろしくお願いします。
- 締切済み
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Visual Basic
- 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
- 締切済み
- Visual Basic
- フォームのリサイズ
現在、フォームのリサイズのときにこれ以上高さを変えないようにするために以下のようなコードを記述しています。 ------------------------------ Private Sub MDIForm_Resize() If Height < 2500 Then Height = 2500 Exit Sub End If End Sub ------------------------------ 一応、これで上手くはいっているのですが、実行時、高さを2500以下にしようと動かしたとき、ちらつきというか妙な残像のようなものが出てしまいます。 こんな変な残像が出ずに、VB自身の画面を変えたときのようにピタっと止まるような表示が出来るようにする方法は無いものでしょうか。 ちなみに、開発環境はWin2000、VB6です。 よろしくお願いします。
- ベストアンサー
- Visual Basic
お礼
ありがとうございます。 Resizerでは出来なかったのですが、 Me.enabled = false を入れてできました。 ただし、他の方が作成した実現できているソースを見ると、 Form_Resizerには何も書かれていません。 でも、最小値でぴたりと止ります。 比較しても、、ResizerのHelpを見てもわかりませんでした…。 今回はこれで対応しました。