ここから本文です

VC#でMDIを使った時、親フォームにスクロールバーが表示されないようにしたいので...

rei********さん

2011/11/1115:52:32

VC#でMDIを使った時、親フォームにスクロールバーが表示されないようにしたいのですが

子フォームを親フォームからはみ出す位置に置いても、Excelのようにスクロールバーが表示されないようにしたいです。
親フォームやMDIClientのハンドルに対してShowScrollBarで設定してみたりしましたがまるで効果がありませんでした。

絶対MDIじゃなきゃいけない、という訳ではないのでMDI以外で実現可能ならそのような方法でも構いません。

どうすればExcelのような親フォームと子フォームの動作が再現出来るでしょうか。ご教授よろしくお願いいたします。

閲覧数:
1,068
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

nlf********さん

2011/11/1414:42:48

MDI親フォームのコードを次のように記述すれば実現可能です。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, WndProcDelegate NewWndProc);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, WndProcDelegate NewWndProc);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, int wParam, int lParam);

private const int GW_HWNDNEXT = 2;
private const int GW_CHILD = 5;
private const int WM_NCCALCSIZE = 0x83;
private const int GWL_WNDPROC = -4;

private IntPtr PrevWndProc;
private delegate int WndProcDelegate( IntPtr hWnd, uint uMsg, int wParam, int lParam );
private WndProcDelegate wpd;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder(100);
IntPtr hwnd = GetWindow(this.Handle, GW_CHILD);
while (hwnd != IntPtr.Zero)
{
GetClassName(hwnd, sb, sb.Capacity);
if (sb.ToString().IndexOf("MDICLIENT") != -1)
{
wpd = new WndProcDelegate(NewWndProc);
if (IntPtr.Size == 4)
{
PrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, wpd);
}
else
{
PrevWndProc = SetWindowLongPtr(hwnd, GWL_WNDPROC, wpd);
}
return;
}
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
}

private int NewWndProc( IntPtr hWnd, uint uMsg, int wParam, int lParam )
{
if (uMsg == WM_NCCALCSIZE)
{
return 0;
}
return CallWindowProc(PrevWndProc, hWnd, uMsg, wParam, lParam);
}
}
}

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる