标题:如何禁用MDI窗口的自动滚动条
取消只看楼主
frankzh
Rank: 1
来 自:SH
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-9-5
 问题点数:0 回复次数:2 
如何禁用MDI窗口的自动滚动条

网上已经找过很多类似的问题,但似乎还没有人能解决这个问题。
问题很简单,就在怎么样在MDI窗体中禁用掉自动滚动条。如果子窗体的边缘超过的主窗体的显示区域,便会出现滚动条。已经设置过主窗体或子窗体的autoscroll属性,都没有。
可能的解决方案是找出MDIClient实例,scrollbar可能就是由MDIClient 控制,但是不知如何能得到这个scrollbar的实例。
请各路高手帮忙。谢谢

搜索更多相关主题的帖子: MDI 窗体 窗口 滚动 自动 
2007-09-05 16:12
frankzh
Rank: 1
来 自:SH
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-9-5
得分:0 
噢,这不是我想要的。 这个窗体就没办法移动的,我需要的是一个正常的窗体。就像在Excel里的子窗体操作一样
2007-09-05 17:14
frankzh
Rank: 1
来 自:SH
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-9-5
得分:0 
终于找到答案了,大家分享一下
原始C#


Code Block        
    private const int SB_BOTH = 3;

        private const int WM_NCCALCSIZE = 0x83;

 

        [DllImport("user32.dll")]

        private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);

 

        protected override void WndProc(ref Message m)

        {

            if (mdiClient != null)

            {

                ShowScrollBar(mdiClient.Handle, SB_BOTH, 0 /*Hide the ScrollBars*/);

            }

 

            base.WndProc(ref m);

        }

        MdiClient mdiClient = null;

        private void Form1_Load(object sender, EventArgs e)

        {

            foreach (Control c in this.Controls) //Find the MdiClient in the MdiWindow

            {

                if (c is MdiClient)

                {

                    mdiClient = c as MdiClient;

                }

            }

 

            Form2 form = new Form2();

            form.MdiParent = this;

            form.Show();

        }



 

 

修改後的


程式碼區塊
Imports System.Runtime.InteropServices

Public Class Form1

    Dim mdiClient As MdiClient = Nothing
    Dim SB_BOTH As Integer = 3

    <DllImport("user32.dll")> _
    Private Shared Function ShowScrollBar(ByVal hWnd As IntPtr, ByVal wBar As Integer, ByVal bShow As Integer) As Integer
    End Function

    Protected Overrides Sub WndProc(ByRef m As Message)
        If mdiClient IsNot Nothing Then
            ShowScrollBar(mdiClient.Handle, SB_BOTH, 0)
        End If

        MyBase.WndProc(m)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        For Each c As Control In Me.Controls
            If TypeOf c Is MdiClient Then
                mdiClient = c
            End If
        Next

        Dim fm As Form = New Form2
        fm.MdiParent = Me
        fm.Show()

    End Sub
End Class
2007-12-18 13:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-167888-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.972358 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved