C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: フォームの枠線を表示せずにサイズ変更可能に


(過去ログ 19 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■7889 / inTopicNo.1)  フォームの枠線を表示せずにサイズ変更可能に
  
□投稿者/ やっくん (1回)-(2007/09/18(Tue) 19:02:02)

分類:[C#] 

以前に少しお世話になった者です。また宜しくお願い致します。
開発環境:VS2005、言語:C#、初心者

FormBorderStyleをNoneにしつつも、
Sizableのように自由にサイズを変更できるフォームを作りたいのですが、
上手い方法が分かりません。

this.ControlBox = false;
this.Text = "";
とする方法があるようですが、
フォームに枠が表示されてしまい、見栄えが悪くなってしまいます。
(タスクバーにテキストが表示されないのもちょっと・・・)

インターフェイスはFlashで作っていて、
Dock=Fillとしてフォームいっぱいに表示させています。
そのため、C#側ではMouseDownなどのイベントが全く反応せず、
独自にリサイズ機能を作るにしても、入り口すら掴めなくて困っています。
Flash側からfscommandでイベントを発生させることは可能かと思いますが、
フォームの外に掛かるカーソルを再現できなかったりと、不都合が多くなってしまいます。

リサイズ機能はそのままに、枠線だけ表示させないようなことは不可能でしょうか?
ご教授宜しくお願い致します。
引用返信 編集キー/
■7890 / inTopicNo.2)  Re[1]: フォームの枠線を表示せずにサイズ変更可能に
□投稿者/ れい (128回)-(2007/09/18(Tue) 19:07:15)
Flashはよくわかりませんが、
WndProcをオーバーライドして
WM_NCHITTESTで
該当する枠線に対応するHTXXXを返せばできると思います。
引用返信 編集キー/
■7895 / inTopicNo.3)  Re[2]: フォームの枠線を表示せずにサイズ変更可能に
□投稿者/ やっくん (2回)-(2007/09/18(Tue) 21:48:08)
早速のご回答を有難う御座います。
Flashを配置していない状態では、以下のようにオーバーライドすることで出来ました。

protected override void WndProc(ref Message m)
{
	base.WndProc(ref m);
	const int WM_NCHITTEST = 0x84;
	if ((m.Msg == WM_NCHITTEST))
	{
		m.Result = (IntPtr)17;
	}
}

WndProcの使い方をいまいち理解できていないのですが、
Flashオブジェクト(PictureBoxなどでも同じ)の上ではフォーカスがそちらにあるからか、
WM_NCHITTESTが送られてきません。
初歩的なことかもしれませんが、そのような場合はどのように書けばいいのでしょうか。

引用返信 編集キー/
■7897 / inTopicNo.4)  Re[3]: フォームの枠線を表示せずにサイズ変更可能に
□投稿者/ 渋木宏明(ひどり) (367回)-(2007/09/18(Tue) 23:52:02)
渋木宏明(ひどり) さんの Web サイト
> WndProcの使い方をいまいち理解できていないのですが、
> Flashオブジェクト(PictureBoxなどでも同じ)の上ではフォーカスがそちらにあるからか、
> WM_NCHITTESTが送られてきません。

「フォーカス」つーのは、「入力可能な状態にある」ことを指すので、こういう場合の表現としては不適です。

で、本題ですが、Flash でウィンドウの表示領域全体を覆ってしまっていたら、そりゃあそのウィンドウをクリックできるわけは無いですよね。

> 初歩的なことかもしれませんが、そのような場合はどのように書けばいいのでしょうか。

Flash をウィンドウの表示領域全体に広げないで、4ピクセル分くらい余白を残しておくのが簡単でしょうね。

それがイヤだとすると、まっとうな方法で。。。というのはかなり難しいんじゃないかな?

引用返信 編集キー/
■7898 / inTopicNo.5)  Re[3]: フォームの枠線を表示せずにサイズ変更可能に
□投稿者/ れい (129回)-(2007/09/19(Wed) 00:28:21)
No7895 (やっくん さん) に返信
> 早速のご回答を有難う御座います。
> Flashオブジェクト(PictureBoxなどでも同じ)の上ではフォーカスがそちらにあるからか、
> WM_NCHITTESTが送られてきません。
> 初歩的なことかもしれませんが、そのような場合はどのように書けばいいのでしょうか。

あう。
失礼しました。
何が問題になっているのか理解できてませんでした。

そうですよね。
メッセージが来ませんね。

さて、どうしましょう…。

昔なら描画しない窓を上に載せて、メッセージを送ったんですが、
Vistaではうまく動きません。
サイズ変更のためにマウスをフックするのもあまりやりたくないです。

だめですね。
私にはいい方法は思いつきません。

賢い方、教えてください。

引用返信 編集キー/
■7917 / inTopicNo.6)  Re[4]: フォームの枠線を表示せずにサイズ変更可能に
□投稿者/ mあ (65回)-(2007/09/19(Wed) 15:58:27)
2007/09/19(Wed) 16:01:44 編集(投稿者)
Flashコンテンツの
●上下左右枠±8ドット近辺を HitTest で検出
●マウスムーブで移動量検出
●ActionScriptでJavaScriptを呼び出す
  getURL("JavaScript:window.external.ResizeEvent(x,y)");

で親フォームをリサイズしてあげればいいのかな、たぶん。
マウスオーバー  サイズ変更カーソル
マウスアアウト  デフォルトカーソル
ドラッグ開始   サイズ変更カーソル
ドラッグ終了   デフォルトカーソル

FlashコンテンツをのっけるWebBrowserクラスのセキュリティレベルを緩和させてあげれば、
フラッシュ(ActionScript)->JavaScript->ブラウザフォーム という連携でリサイズイベント
を起こせます、たぶん。


サンプルではないけど、サンプル:
Flashは借り物なので中身いじれないのでこれと似たような仕組みで実装して下さい。
このサンプルでは、フラッシュのClickイベントが取れないが、mousemove は取れる
のでHitTestした範囲内のフラッシュサイズを変更して、Div タグのドラッグによる
Window サイズ変更を実現しています。サイズ変更ちゅーても、うまくいって2〜3
ドットくらいですけど(ドラッグ操作のデフォルトが範囲選択なのでこれをさせない
ようにするのが・・・挫折w)

VBです。


Imports System
Imports System.Windows.Forms
Imports System.Security.Permissions

Imports System.Text

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Form1

    Private _b As Boolean = False
    Private sz As Size

    Private webbrowser1 As New WebBrowser()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.Dock = DockStyle.Fill

        webbrowser1.ScrollBarsEnabled = False

        Controls.Add(webbrowser1)


        Dim sb As New StringBuilder
        sb.Append("<body style='margin:0px;border:solid 1px snow'>")
        sb.Append("<div width='100%' height='100%' style='margin:0px;background-color:pink;'")
        sb.Append(" onmouseout='window.external.MouseUpEx()'")
        sb.Append(" onmousemove='window.external.MouseMoveEx(event.x, event.y, event.button)'")
        sb.Append(" onmouseup='window.external.MouseUpEx()'")
        sb.Append(" onmousedown='window.external.ClickEx(event.button)'")
        sb.Append(" >")
        sb.Append("<OBJECT classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' id='FlashContent'")
        sb.Append(" codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'")
        sb.Append(" WIDTH='100%' HEIGHT='100%' style='margin:0px;'")
        'sb.Append(" onmouseout='window.external.MouseUpEx()'")
        'sb.Append(" onmousemove='window.external.MouseMoveEx(event.x, event.y, event.button)'")
        'sb.Append(" onmouseup='window.external.MouseUpEx()'")
        sb.Append(">")
        sb.Append("   <PARAM NAME=movie VALUE='http://hakuhin.hp.infoseek.co.jp/main/as/../../flash/as/menu_02.swf'>")
        sb.Append("   <PARAM NAME=loop VALUE=false>")
        sb.Append("   <PARAM NAME=quality VALUE=high>")
        sb.Append("   <PARAM NAME=bgcolor VALUE=#ffffff>")
        sb.Append("</OBJECT>")

        sb.Append("</div>")
        sb.Append("</body>")
        WebBrowser1.DocumentText = sb.ToString()

        WebBrowser1.ObjectForScripting = Me

        Me.StartPosition = FormStartPosition.Manual

        ''border:solid 1px snow のコレ(枠表示用に)
        Me.Size = New Size(102, 102)

        Me.Location = New Point(100, 100)
        sz = Me.Size

    End Sub

    Public Sub MouseMoveEx(ByVal x As Integer, ByVal y As Integer, ByVal b As Integer)

        If _b Then
            Me.Size = New Size(Me.Size.Width + 1, Me.Size.Height)
        End If

        Dim sx As Integer = Me.Size.Width - 8
        Dim ex As Integer = Me.Size.Width - 1

        If x > sx AndAlso x < ex Then
            Me.Cursor = Cursors.SizeWE
            WebBrowser1.Document.GetElementById("FlashContent").SetAttribute("width", "95%")
        Else
            Me.Cursor = Cursors.Default
        End If

        'Console.WriteLine("X:{0},Y:{1},B:{2}", x, y, b)

    End Sub


    Public Sub ClickEx(ByVal b As Integer)
        ''Me.Size = New Size(Me.Size.Width + 10, Me.Size.Height)
        If b = 1 Then
            _b = True
        Else
            _b = False
        End If
    End Sub
    Public Sub MouseUpEx()
        Me.Cursor = Cursors.Default
        WebBrowser1.Document.GetElementById("FlashContent").SetAttribute("width", "100%")
        _b = False
    End Sub

End Class




引用返信 編集キー/
■7923 / inTopicNo.7)  Re[4]: フォームの枠線を表示せずにサイズ変更可能に
□投稿者/ やっくん (3回)-(2007/09/19(Wed) 18:32:59)
No7897 (渋木宏明(ひどり) さん) に返信
> 「フォーカス」つーのは、「入力可能な状態にある」ことを指すので、こういう場合の表現としては不適です。

確かに不適切でしたね・・・。ご指摘有難う御座います。

> Flash をウィンドウの表示領域全体に広げないで、4ピクセル分くらい余白を残しておくのが簡単でしょうね。

やはりこの方法が一番妥当なようですね。
今回の場合は、Flashで用意していた四角い枠を
フォームで構築すればできるので、これでいきたいと思います。


No7898 (れい さん) に返信
> 昔なら描画しない窓を上に載せて、メッセージを送ったんですが、
> Vistaではうまく動きません。

あ、そうなんですかぁ。
前に空のフォームを上に重ねる物を作っていたんですが、
VistaとXPでは動作が変わるんですね・・・。


No7917 (mあ さん) に返信

サンプルまで用意して下さって有難う御座いますっ
JavaScriptというアプローチもあるんですねぇ。勉強になります。
ただ今回のFlashは、WebBrowserは通さずに、
ShockwaveFlashObjectコンポネートを直接配置しているので、JavaScriptは使えませんね・・・。
書いていなくて申し訳御座いません。
それでも今後の作品作りに、大変参考になりました。


皆様、アドバイスを有難う御座いました。
今回は、フォームに余白を残してFlashを配置する方法でいきたいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -