DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■35270 / inTopicNo.1)  RichTextBoxのテキストをpictureBOXへ
  
□投稿者/ ま〜 一般人(28回)-(2022/12/05(Mon) 15:45:30)
  • アイコン環境/言語:[Windows10 VS2022 Basic] 
    分類:[.NET] 

    こんにちは
    以前、
    https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=35233&rev=&no=0
    でLEDモニタの件で画像にすればと提案頂いて格闘していましたが玉砕気味です。
    現状は
    Dim img As Bitmap
    img = New Bitmap(Me.RichTextBox1.Width, Me.RichTextBox1.Height)
    Using g As Graphics = Graphics.FromImage(img)
    g.CopyFromScreen(Me.PointToScreen(Me.RichTextBox1.Location), New Point(0, 0), Me.RichTextBox1.Size)
    End Using
    Me.PictureBox1.Image = img

    です。転送はて来たのですがRichTextBoxの位置情報が上手く取れずに少しずれてしまいます。
    Me.RichTextBox1.Locationの値が連想出来ない数値になってます。
    色々やってみましたが私のコピペ専門の理解度では難しく教えて下さい
    初歩的な質問で申し訳ないですが宜しくお願いします






マルチポストを報告
違反を報告
引用返信 削除キー/
■35271 / inTopicNo.2)  Re[1]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ KOZ 一般人(9回)-(2022/12/06(Tue) 00:29:47)
  • アイコンNo35270に返信(ま〜さんの記事)
    > です。転送はて来たのですがRichTextBoxの位置情報が上手く取れずに少しずれてしまいます。

    RichTextBox を貼り付けているのはフォームですか?
    PointToScreen は RichTextBox が張り付いているコントロールのものを呼び出してください。
違反を報告
引用返信 削除キー/
■35272 / inTopicNo.3)  Re[2]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(29回)-(2022/12/06(Tue) 12:52:03)
  • アイコン回答ありがとうございます

    > RichTextBox を貼り付けているのはフォームですか?
    はい

    > PointToScreen は RichTextBox が張り付いているコントロールのものを呼び出してください。
    これの意味が分からないです。今はそうなって無いって事だと思うのですが。何をすれば宜しいでしょうか?
違反を報告
引用返信 削除キー/
■35273 / inTopicNo.4)  Re[3]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ KOZ 一般人(10回)-(2022/12/06(Tue) 16:20:37)
  • アイコンNo35272に返信(ま〜さんの記事)
    >>RichTextBox を貼り付けているのはフォームですか?
    > はい

    そうなっていたら、ずれないはずです。

    >>PointToScreen は RichTextBox が張り付いているコントロールのものを呼び出してください。
    > これの意味が分からないです。今はそうなって無いって事だと思うのですが。何をすれば宜しいでしょうか?

    Dim p = Me.RichTextBox1.Parent とでもして p が Form になっているか確認してください。

違反を報告
引用返信 削除キー/
■35274 / inTopicNo.5)  Re[4]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ 魔界の仮面弁士 大御所(1499回)-(2022/12/06(Tue) 16:51:23)
  • アイコンNo35273に返信(KOZさんの記事)
    >>> RichTextBox を貼り付けているのはフォームですか?
    >> はい
    > そうなっていたら、ずれないはずです。

    たとえ Form の上に直接貼ってあったとしても、
    高 DPI 環境で実行している場合は、ズレる可能性がありますね。
    https://social.msdn.microsoft.com/Forums/netframework/ja-JP/7c42dcdd-824a-4c93-8ac7-22f3f383ec6d/win8112391posiontoscreen1239122580251521236421512124311239412356?forum=csharpgeneralja


    また、DPI 設定が 100% だったとしても、
    RichTextBox が(Form の上ではなく)
    Panel や TabControl/TabPage などの上に貼ってある場合に備え、
    「Me.PointToScreen(Me.RichTextBox1.Location)」を
    「RichTextBox1.Parent.PointToScreen(RichTextBox1.Location)」に
    変更しておいた方が良いと思います。
違反を報告
引用返信 削除キー/
■35275 / inTopicNo.6)  Re[5]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(30回)-(2022/12/08(Thu) 14:56:26)
  • アイコンいつも適切なアドバイスありがとうございます

    > 高 DPI 環境で実行している場合は、ズレる可能性がありますね。
    まさにこれが原因でした。凄いです感激です。

    目がきついので125%にしてましたプロジェクト作成時に出てましたが意味が分からず気にも留めてませんでした。

    > Panel や TabControl/TabPage などの上に貼ってある場合に備え、
    はい、Tabに張る予定でした。問題の切り分けの為に今は貼ってませんが


    > 「Me.PointToScreen(Me.RichTextBox1.Location)」を
    > 「RichTextBox1.Parent.PointToScreen(RichTextBox1.Location)」に
    > 変更しておいた方が良いと思います。

    100%だと問題はないのですが125%にするとやはりずれてしまいます
    125%の時にX、Yの値を確認してみたのですが
    XY両方ともずれてるのですが
    Y方向の位置は1.25倍するとマッチするのですがX方向がどこの数値?って感じです

    ちなみに100%環境でTabControlに貼って試したみました所いい感じでした。

    作ったソフトが100%で使われるとは限らないのでDPI事を調べてみたのですが理解しきれてない所もあって良い方法見つかっていません

    お手数ですがアドバイスお願いします。



違反を報告
引用返信 削除キー/
■35276 / inTopicNo.7)  Re[6]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ 魔界の仮面弁士 大御所(1500回)-(2022/12/08(Thu) 15:22:43)
  • アイコンNo35275に返信(ま〜さんの記事)
    >> 高 DPI 環境で実行している場合は、ズレる可能性がありますね。
    > まさにこれが原因でした。凄いです感激です。

    No35233 の時にモニター解像度の変更について話していたので、
    DPI 設定を弄っているんじゃないかな…という予感がありました。(^_^;


    > Y方向の位置は1.25倍するとマッチするのですがX方向がどこの数値?って感じです
    フォームの左枠にマウスカーソルを当てると、カーソル形状が「←→」に
    変化する位置って、ウィンドウよりも若干外側から始まりますよね。
    このあたりの座標ズレも影響しているのかも。


    > DPI事を調べてみたのですが理解しきれてない所もあって良い方法見つかっていません
    dpiAwareness あるいは dpiAware の設定はどうしていますか?
    https://learn.microsoft.com/ja-jp/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process


    ちなみに先に貼った URL で言及されていた
    >> 田中達彦さんのBlog「アプリの高DPI(High DPI)対応について」 を
    は現在、下記の場所にあります。

    https://learn.microsoft.com/ja-jp/archive/blogs/ttanaka/dpihigh-dpi-1-dpi
    https://learn.microsoft.com/ja-jp/archive/blogs/ttanaka/dpihigh-dpi-2-12398
    https://learn.microsoft.com/ja-jp/archive/blogs/ttanaka/dpihigh-dpi-3-12503
    https://learn.microsoft.com/ja-jp/archive/blogs/ttanaka/dpihigh-dpi-4-dpi-windows
違反を報告
引用返信 削除キー/
■35277 / inTopicNo.8)  Re[7]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ 魔界の仮面弁士 大御所(1501回)-(2022/12/08(Thu) 15:25:40)
  • アイコンNo35276に追記(魔界の仮面弁士の記事)
    >> DPI事を調べてみたのですが理解しきれてない所もあって良い方法見つかっていません
    > dpiAwareness あるいは dpiAware の設定はどうしていますか?
    > https://learn.microsoft.com/ja-jp/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process

    マルチモニター環境の場合は、主画面の DPI に引っ張られることがある点にも注意。
    複数の異なる解像度、異なる拡大率のディスプレイを使っている場合には
    下記が参考になるかもしれません。C# ですけれども。
    https://angelpinpoint.seesaa.net/article/488129908.html
違反を報告
引用返信 削除キー/
■35279 / inTopicNo.9)  Re[6]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ KOZ 一般人(11回)-(2022/12/08(Thu) 18:38:13)
  • アイコン
    2022/12/09(Fri) 04:27:45 編集(投稿者)
    
    ■No35275に返信(ま〜さんの記事)
    >>高 DPI 環境で実行している場合は、ズレる可能性がありますね。
    > まさにこれが原因でした。凄いです感激です。
    
    これ動きますか?
    ちょっと問題があって、画像を縮小するせいか、少しぼやけた感じになります。
    ,NET Framework 4.7 以上なら RichTextBox の DrawToBitmap を使ったほうがいいかもしれません。
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        <DllImport("User32.dll")>
        Public Shared Function LogicalToPhysicalPointForPerMonitorDPI(ByVal hwnd As IntPtr, ByRef point As Point) As Boolean
        End Function
    
        Private Shared Function LogicalToPhysicalRectangleForPerMonitorDPI(ByVal hwnd As IntPtr, ByVal r As Rectangle) As Rectangle
            Dim p1 As Point = r.Location
            Dim p2 As Point = New Point(r.Right, r.Bottom)
            LogicalToPhysicalPointForPerMonitorDPI(hwnd, p1)
            LogicalToPhysicalPointForPerMonitorDPI(hwnd, p2)
            Return Rectangle.FromLTRB(p1.X, p1.Y, p2.X, p2.Y)
        End Function
    
        Private Function LogicalToPhysicalRectangleForPerMonitorDPI(ByVal r As Rectangle) As Rectangle
            Return LogicalToPhysicalRectangleForPerMonitorDPI(Handle, r)
        End Function
    
        Public Sub New()
            InitializeComponent()
            PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            PictureBox1.Size = RichTextBox1.Size
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim rectangle1 = RectangleToScreen(RichTextBox1.Bounds)
            Dim rectangle2 = LogicalToPhysicalRectangleForPerMonitorDPI(rectangle1)
            Dim bmp = New Bitmap(rectangle2.Width, rectangle2.Height)
            Using g = Graphics.FromImage(bmp)
                g.CopyFromScreen(rectangle2.Location, Point.Empty, rectangle2.Size)
            End Using
            If PictureBox1.Image IsNot Nothing Then
                PictureBox1.Image.Dispose()
            End If
            PictureBox1.Image = bmp
        End Sub
    
    End Class
    

違反を報告
引用返信 削除キー/
■35280 / inTopicNo.10)  Re[7]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(31回)-(2022/12/15(Thu) 13:11:41)
  • アイコンこんにちは、体調を崩して回答が遅れました。すみません。
    ご指導の様にやってみました。DPI環境でもバッチリでした。
    ありがとうございます

    ですがTabPage環境化ではズレました。
    Parentをと思って色々やってみましたが中々上手くいかずTabPage下の座標知る方法はないのでしょうか?
    以上、宜しくお願いします

違反を報告
引用返信 削除キー/
■35282 / inTopicNo.11)  Re[8]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ KOZ 一般人(12回)-(2022/12/15(Thu) 18:00:28)
  • アイコン
    No35280に返信(ま〜さんの記事)
    > こんにちは、体調を崩して回答が遅れました。すみません。
    
    お大事に。
    
    > ですがTabPage環境化ではズレました。
    > Parentをと思って色々やってみましたが中々上手くいかずTabPage下の座標知る方法はないのでしょうか?
    
    むむむ、やっかいですね高DPI。
    スクリーン座標を取るのが目的でないなら、以下のコードでキャプチャはできると思います。
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Public Sub New()
            InitializeComponent()
            PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            PictureBox1.Size = RichTextBox1.Size
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim bmp = CreateBitmapFromControl(RichTextBox1)
            If PictureBox1.Image IsNot Nothing Then
                PictureBox1.Image.Dispose()
            End If
            PictureBox1.Image = bmp
        End Sub
    
        Private Const SRCCOPY As Integer = &HCC0020
    
        <DllImport("User32.dll")>
        Private Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr
        End Function
    
        <DllImport("user32.dll")>
        Private Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Boolean
        End Function
    
        <DllImport("gdi32.dll")>
        Private Shared Function BitBlt(hdcDest As IntPtr,
                                       nXDest As Integer, nYDest As Integer,
                                       nWidth As Integer, nHeight As Integer,
                                       hdcSrc As IntPtr,
                                       nXSrc As Integer, nYSrc As Integer,
                                       dwRop As Integer) As Boolean
        End Function
    
        Private Shared Function CreateBitmapFromControl(con As Control) As Bitmap
            Dim cs = con.Size
            Dim bmp As New Bitmap(cs.Width, cs.Height)
            Using g = Graphics.FromImage(bmp)
                Dim hdcDest = g.GetHdc()
                Dim hdcSrc = GetWindowDC(con.Handle)
                BitBlt(hdcDest, 0, 0, cs.Width, cs.Height, hdcSrc, 0, 0, SRCCOPY)
                ReleaseDC(con.Handle, hdcSrc)
                g.ReleaseHdc()
            End Using
            Return bmp
        End Function
    
    End Class
    

違反を報告
引用返信 削除キー/
■35295 / inTopicNo.12)  Re[9]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(32回)-(2022/12/19(Mon) 13:37:36)
  • アイコンPCを変えたりし確認しました。
    バッチリです。
    沢山勉強になりました。
    ありがとうございます。
違反を報告
引用返信 削除キー/
■35296 / inTopicNo.13)  Re[10]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(33回)-(2022/12/19(Mon) 13:45:34)
  • アイコンクローズ忘れてました。
解決み!
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/


- Child Tree -