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

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
NomalExcel Com オブジェクトの増殖(13) | NomalRichTextBoxのテキストをpictureBOXへ(12) | NomalPictureBoxの画像を連続保存(11) | Nomalリソースデザイナの開き方(10) | NomalGetObjectでExcelファイルを加工するとExcelファイルが壊れる(9) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomal重なったPictureBox同士を透過する方法(7) | Nomalvb.netでExcelファイル操作(7) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalラジオボタンの一括設定(7) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | NomalDataAdapter.Updateで構文エラー(6) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalタッチキーボードでIMEを自動で切替えたい(6) | Nomalftp接続してファイルアップロード後、別フォルダにコピー(5) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalVB.NETからcmdでpingを実行した時の結果(5) | NomalTabPageの背景色(5) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalグリッド表示レコードをJSONに変換(5) | NomalSeleniumで開いているページのTableを編集したい(5) | NomalMP4動画を再生する方法について(5) | NomalLableのカラー色を文字変数から変更したい(5) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | NomalAppActiveが正常に機能しない。(4) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | NomalWebView2によるスクレ―ピング(4) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | Nomalソケット通信入門 ひらがな(4) | Nomal時間変数(文字列)の扱い(4) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | NomalLinqにおける明示的型指定の方法(3) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | NomalWindowsフォームデザイナについて(3) | NomalDrawstringでの透過文字作成(3) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalシステム時計の設定(3) | NomalVisual Basicでエラーが出る(3) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomaltextboxでmultilineでの改行削除について(2) | NomalDataGridViewのイベント中にデータを更新するとエラーが発生(2) | Nomalフォントに登録されていない文字の検出(2) | NomalDataGridViewの複数行選択で歯抜け選択を無効にしたい(2) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | Nomalこういた物を作れますか?(2) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalエクセルのみ監視ができない(2) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | NomalRGB値の所得(2) | NomalVB.net からAccessDBへの接続(2) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalクリックイベントでexeを作成できるか(2) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomaloledbでdatatableを取得するときにエラーになる(1) | Nomal証券会社へのログイン(1) | Nomalツールボックスにtableadapterが表示されない(1) | Nomalアセンブリ情報が載らない(1) | Nomal二次元マップから値の取得(1) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) |



■記事リスト / ▼下のスレッド
■35185 / 親記事)  VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ ゆりりん 一般人(1回)-(2022/10/21(Fri) 11:45:23)
  • アイコン環境/言語:[環境(Windows10 64bit)、使用言語(VB.net2017)、.NET Framework 4.6.1 ] 
    分類:[.NET] 

    いつも参照させていただいています。

    現在、VB6.0で書かれた印刷プログラムをVB.Netに移行しています。
    その中で、VB6.0と全く同じ座標とFont種類・サイズを指定しても、
    VB.Netで印刷すると、少し右にずれてしまうし、Fontのサイズが微妙に違ってしまいます。
    Fontの高さは同じようなのですが、文字と文字の隙間が微妙に違うようで、長い文字列を印刷すると、印刷された文字の長さがVB.Netの方が長くなってしまうのです。
    座標系はどちらも、ミリメートルを指定しています。
    VB.Netで印刷された文字列の前に空白が付くことは、下記のサイトを参照して分かったので、ずれる分を引いた座標を指定したら、右にずれる件は解決したのですが、同じFontを指定しても違ってしまう件が解決できません。
    同じプリンタとプリンタドライバを使用しているのに、どうしてVB6.0とVB.Netで違ってしまうのか、まったくわかりません。

    ・使用しているプリンタ ラベルプリンタ SATO CL4NX-J 609dpi
    ・プリンタ解像度 609dpi 24dot/mm

    ・参考にしたサイト
    VB.netで文字を正確な位置に描く。
    https://penguinlab.jp/blog/post/117

    ※VB6.0のサンプル

    Printer.ScaleMode = 6
    Printer.FontName = "MS ゴシック"
    Printer.FontSize = 9
    Printer.CurrentX = 12.5
    Printer.CurrentY = 30.7
    Printer.Print "IN-OUT<AB>CD EFG-HIJK-LMN A<10>"

    ※VB.Netのサンプル

    e.Graphics.PageUnit = GraphicsUnit.Millimeter
    Dim f As New Font("MS ゴシック", 9, FontStyle.Regular)
    e.Graphics.DrawString("IN-OUT<AB>CD EFG-HIJK-LMN A<10>", f, Brushes.Black, 12.5, 30.7)

    こんな感じです。


    どなたかわかる方、どうかアドバイスをお願いいたします。

違反を報告
引用返信

▽[全レス9件(ResNo.5-9 表示)]
■35202 / ResNo.5)  Re[5]: VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ 魔界の仮面弁士 大御所(1467回)-(2022/10/26(Wed) 18:29:47)
  • アイコンNo35200に返信(ゆりりんさんの記事)
    > 想定していたよりかなり小さく印刷されてしまい、
    物理単位と論理単位の違いでは無いでしょうか。

    恐らく、最初の回答で述べた「TextRenderer.DrawText」を使った場合と
    同じぐらいのサイズで描画されていませんか?

    GDI+ 側の PageUnit プロパティを操作しても、
    GDI 側のデバイスコンテキストには影響を与えないと思います。


    > 座標は合っているようなのですが、想定していたよりかなり小さく印刷されてしまい
    単位系が未設定の場合、初期値として
    GDI+ 側(PageUnit プロパティ)は Display(1) を返し、
    GDI 側(GetMapMode API)は MM_TEXT(1) を返すようです。

    Sub SetFont でフォントを生成する際に、
    MM_TEXT から MM_LOMETRIC あるいは MM_HIMETRIC で
    生成するようにしてみては如何でしょうか。


    > Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    >  Dim mFont As IntPtr
    ここで宣言されたローカル変数の mFont と

    > Private Sub SetFont(ByVal control As IntPtr, ByVal fontFamily As String, ByVal fontSize As Integer)
    >  mFont = CreateFont(fontSize * -1, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, fontFamily)
    ここで利用されているフィールド変数の mFont は
    それぞれ別の変数ですが、大丈夫ですか?
違反を報告
引用返信
■35207 / ResNo.6)  Re[6]: VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ ゆりりん 一般人(4回)-(2022/10/28(Fri) 10:38:17)
  • アイコンいつもありがとうございます。

    > 物理単位と論理単位の違いでは無いでしょうか。
    >
    > GDI+ 側の PageUnit プロパティを操作しても、
    > GDI 側のデバイスコンテキストには影響を与えないと思います。

     そういうことだったのですね。

    > Sub SetFont でフォントを生成する際に、
    > MM_TEXT から MM_LOMETRIC あるいは MM_HIMETRIC で
    > 生成するようにしてみては如何でしょうか。

     早速、やってみようと思います。
     
    >> Dim mFont As IntPtr
    > ここで宣言されたローカル変数の mFont と
    >
    >> mFont = CreateFont(fontSize * -1, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, fontFamily)
    > ここで利用されているフィールド変数の mFont は
    > それぞれ別の変数ですが、大丈夫ですか?

     すみません。
     ここに載せる時に、間違えました。
     実際には、論理フォントの作成の後に入っています。
     お気づきいただき、ありがとうございました。
違反を報告
引用返信
■35212 / ResNo.7)  Re[6]: VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ ゆりりん 一般人(5回)-(2022/10/28(Fri) 16:49:02)
  • アイコン> Sub SetFont でフォントを生成する際に、
    > MM_TEXT から MM_LOMETRIC あるいは MM_HIMETRIC で
    > 生成するようにしてみては如何でしょうか。


    <System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")>
    Friend Shared Function SetMapMode(ByVal hdc As Integer, ByVal fnMapMode As Integer) As Integer
    End Function

     を追加しまして、

    Private Sub SetFont(ByVal control As IntPtr, ByVal fontFamily As String, ByVal fontSize As Integer)

    Call SetMapMode(control, 2) 'MM_LOMETRIC
    mFont = CreateFont(fontSize * -1, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, fontFamily)
    mFontOld = SelectObject(control, mFont)

    End Sub

     このように書いてみたのですが、
     何も印刷されなくなってしまいました。
     SetMapMode の使い方が、間違っているのでしょうか。

     度々申し訳ございません。
     ご教授いただければと思います。
     どうぞよろしくお願いいたします。


違反を報告
引用返信
■35214 / ResNo.8)  Re[7]: VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ 魔界の仮面弁士 大御所(1473回)-(2022/10/28(Fri) 21:29:20)
  • アイコン
    No35212に返信(ゆりりんさんの記事)
    > 何も印刷されなくなってしまいました。
    
    『フォントサイズ』の指定、および、『描画位置の座標』は正しいですか?
    
    MM_TEXT から MM_LOMETRIC に変更したのであれば、フォントサイズだけでは無く
    描画座標も MM_LOMETRIC 単位系で計算しなおす必要があります。
    
    
    描画位置を変更したくない場合は、GetMapMode と SetMapMode をペアで使うようにして、
    フォント作成後、描画時に座標系を元に戻してみてください。先の私の回答では、フォントを
    「MM_LOMETRIC あるいは MM_HIMETRIC で生成する」とは書きましたが、
    「MM_LOMETRIC あるいは MM_HIMETRIC で描画する」とは書いていません。
    
    
    MapMode は 1〜8 の 8 種類あります。指定するモードによっては、
    単位だけでなく軸の向きも変化していることに注意してください。
    
     (A) X 座標が右に、Y 座標が上に向かって増加していくもの
     (B) X 座標が右に、Y 座標が下に向かって増加していくもの
     (C) SetWindowExtEx() / SetViewportExtEx() で単位、向き、スケーリングを指定するもの
     http://www.kumei.ne.jp/c_lang/sdk/sdk_55.htm
     http://yamatyuu.net/computer/program/sdk/gdi/mapmode/index.html
    
    ---
    
    (A) 右向き、上向きな MapMode
     1 … MM_TEXT。1 デバイスピクセル単位の物理座標系。
     6 … MM_TWIPS。0.05ポイント単位(1/1440インチ単位)の論理座標系。
    
    (B) 右向き、下向きな MapMode
     2 … MM_LOMETRIC。0.1 ミリ単位の論理座標系。
     3 … MM_HIMETRIC。0.01 ミリ単位の論理座標系。
     4 … MM_LOENGLISH。0.01 インチ単位の論理座標系。
     5 … MM_HIENGLISH。0.001 インチ単位の論理座標系。
    
    (C) 単位、向き、スケーリングを任意に指定できる MapMode
     7 … MM_ISOTROPIC。異方性ユーザー定義単位系。任意の単位、向き、スケーリングを持つ。
     8 … MM_ANISOTROPIC。等方性ユーザー定義単位系。X 軸と Y 軸の 1 単位が等しい。

違反を報告
引用返信
■35215 / ResNo.9)  Re[8]: VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ ゆりりん 一般人(6回)-(2022/11/02(Wed) 11:23:32)
  • アイコン> 描画位置を変更したくない場合は、GetMapMode と SetMapMode をペアで使うようにして、
    > フォント作成後、描画時に座標系を元に戻してみてください。先の私の回答では、フォントを
    > 「MM_LOMETRIC あるいは MM_HIMETRIC で生成する」とは書きましたが、
    > 「MM_LOMETRIC あるいは MM_HIMETRIC で描画する」とは書いていません。
    >
    そういうことだったのですね。
    よくわかっていませんでした。

    『描画位置の座標』はピクセルで計算していたので、
    MM_TEXTの指定にしたら、きちんと印刷されるようになりました。

    今までどうもありがとうございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-9]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35281 / 親記事)  作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(1回)-(2022/12/15(Thu) 17:43:42)
  • アイコン環境/言語:[VB2013〜2019] 
    分類:[.NET] 

    開発環境:VB2013〜2019

    こんにちは。
    以下の.NET Tipsを参考に、白黒の画像(二値化)を作成しました。

    2値化して、1bppの白黒画像を作成する
     https://dobon.net/vb/dotnet/graphics/1bpp.html

    PixelFormatはFormat1bppIndexedで、画像ファイルはPng形式で保存しました。
    このファイルのプロパティを見ると、ビットの深さは1になっていて、
    思い通りの白黒画像が出来ました。

    ただ、この画像ファイルをWord2019でWord本文に挿入し、これを
    Wordの右クリックメニュー「図として保存」でpng形式で保存した時、
    保存した画像ファイルをペイントで開くと、色が変になっています。
    具体的には白の部分が何だかグレーっぽい色、黒の部分が透過色になっていました。

    これは画像データの作成方法に問題があるのでしょうか?
    それとも、Word側で1bpp画像をうまく扱えないのでしょうか?
    またはペイントの問題でしょうか?

    ちなみに、「図として保存」でgifやbmp形式を選択して保存するとすれば
    ペイントでも思い通りの白黒になりました。
    (ただしgifは8ビット、bmpは24ビット画像になってしまいました。)

    また、対象のWordファイルを保存して拡張子を.docx→.zipに書き換えて
    このzipファイルの中身を確認すると、Wordに貼り付けた画像がありましたが、
    この画像はきれいな白黒の1bpp画像でした。
違反を報告
引用返信

▽[全レス8件(ResNo.4-8 表示)]
■35286 / ResNo.4)  Re[4]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(2回)-(2022/12/16(Fri) 11:28:15)
  • アイコン皆様、ありがとうございます。
    色々調べると、Wordの「図として保存」は色々と問題があるようで、
    Word側の問題なのかも知れません。

    とりあえずは、別の1bpp形式の画像を作って試してみたいと思いますが、
    System.Drawing.BitmapのSaveでは、gif形式(ImageFormat.Gif)を指定すると
    8ビット画像になってしまうようです。

    System.Drawing.Bitmapクラスを使う以外の方法で1bpp形式の画像を生成するには
    どうすればよいでしょうか?
違反を報告
引用返信
■35287 / ResNo.5)  Re[5]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ 魔界の仮面弁士 大御所(1503回)-(2022/12/16(Fri) 11:51:46)
  • アイコン2022/12/16(Fri) 16:50:52 編集(投稿者)

    No35281に返信(x-boyさんの記事)
    > 以下の.NET Tipsを参考に、白黒の画像(二値化)を作成しました。
    > https://dobon.net/vb/dotnet/graphics/1bpp.html

    ImageCodecInfo + EncoderParameters を指定可能な
    Save メソッドのオーバーロードを指定しても、
    Png フォーマットの細かいパラメーターは指定できないらしいです。(ただし当方未検証)
    https://social.msdn.microsoft.com/Forums/ja-JP/cbae4e4d-be5f-4a8d-a476-cf3dee6c4a49/c45png?forum=netfxgeneralja


    ということで、ImageFormat を指定する方の Save を読んで保存していますが、
    こちらで検証してみても、どうにも Word 側に問題があるっぽい感じがしますね。

    'img0.png はこれです → https://dobon.net/s/img/logo-bt1-108x24.png
    Using src As New Bitmap("E:\img0.png") _
      , dst = Create1bppImage(src)
      dst.Save("E:\img1.png", ImageFormat.Png)
      dst.Save("E:\img2.bmp", ImageFormat.Bmp)
    End Using


    (0) img0.png … 155 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    (1) img1.png … 193 バイト Chunk=[IHDR, sRGB, gAMA, PLTE, pHYs, IDAT, IEND]
    (2) img2.bmp … 446 バイト

    --> 上記を AzConvPNG で圧縮したもの -->
    (3) img3.png … 148 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    (4) img4.png … 135 バイト Chunk=[IHDR, PLTE, IDAT, IEND]
    (5) img5.png … 135 バイト Chunk=[IHDR, PLTE, IDAT, IEND]

    --> それらを Word に貼って「図として保存」したもの -->
    (6) img0_wd.png … 207 バイト 正常画 Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (7) img1_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (8) img2_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (9) img3_wd.png … 207 バイト 正常画 Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (10)img4_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (11)img5_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]


    正常だった (6) と、化けてしまった (7) を比較してみると、
    ヘッダー, IHDR, sRGB, gAMA, tRNS, pHYs, IEND は同一ですが、
    PLTE(パレット情報) と IDAT(イメージデータ) が変質していました。
違反を報告
引用返信
■35288 / ResNo.6)  Re[6]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(1回)-(2022/12/16(Fri) 14:29:48)
  • アイコン2022/12/16(Fri) 14:33:22 編集(投稿者)

    魔界の仮面弁士様、ありがとうございます。
    ちなみに、

    > (0) img0.png … 155 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    > (1) img1.png … 193 バイト Chunk=[IHDR, sRGB, gAMA, PLTE, pHYs, IDAT, IEND]

    の「Chunk=〜」は、Pngファイルのヘッダ情報でしょうか?

    これを見ると、シロートながら、#Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]になっているものが色化けしていないように見えますが、さっぱり分かりません。
    (sRGBがRGB、gAMAがガンマ値かな、っていう感じですが、良く分かっていません)

    せっかくの機会ですので、ここら辺を勉強したいので、なにか解説サイトがあれば教えて頂けるとありがたいです。


違反を報告
引用返信
■35290 / ResNo.7)  Re[7]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ 魔界の仮面弁士 大御所(1504回)-(2022/12/16(Fri) 16:39:13)
  • アイコンNo35288に返信( x-boyさんの記事)
    > の「Chunk=〜」は、Pngファイルのヘッダ情報でしょうか?

    PNG ヘッダーの後に続く構造体のことです。

    すべてのチャンクは、4 文字の case-sensitive な識別子(type)を持ち、
    それぞれ下記の構造になっています。

     ・4 バイト: "length" (チャンクの data 部のバイト数)
     ・4 バイト: "type" (4 文字でチャンクの種類を表す)
     ・可変長: "data" (チャンクのデータ本体)
     ・4 バイト: "CRC-32" (type と data の誤り検出符号)

    より詳しいレイアウトは、 No35284 で紹介したサイトをご覧ください。
    https://www.setsuki.com/hsp/ext/png.htm


    > これを見ると、シロートながら、#Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]になっているものが色化けしていないように見えますが、さっぱり分かりません。
    こちらに投げてみるとわかりやすいかも。
    https://www.nayuki.io/page/png-file-chunk-inspector


    > (sRGBがRGB、gAMAがガンマ値かな、っていう感じですが、良く分かっていません)
    tRNS チャンクは 0 個 or 1 個存在し、透明度情報を保持しています。
    チャンクデータは可変長で、その構造は IHDR のカラータイプによって異なります。

    gAMA チャンクは 0 個 or 1 個存在し、内包する RGB データのリニア輝度からの
    ガンマ補正値を 4 バイトの値で保持しています。
    https://qiita.com/yoya/items/ce8dffc8a8a19746d87c

    sRGB チャンクは 0 個 or 1 個存在し、画像色が「sRGB 色空間」であることを示します。
    https://www.setsuki.com/hsp/ext/chunk/sRGB.htm
違反を報告
引用返信
■35291 / ResNo.8)  Re[8]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(2回)-(2022/12/16(Fri) 16:49:58)
  • アイコン魔界の仮面弁士様、ありがとうございます。
    ご教示頂いた情報を元に、自分なりに勉強してみます。

違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-8]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35510 / 親記事)  重なったPictureBox同士を透過する方法
□投稿者/ 本体は眼鏡 一般人(4回)-(2023/09/05(Tue) 08:53:37)
  • アイコン環境/言語:[Windows 10 Pro 64bit/VB.net] 
    分類:[.NET] 

    VB.net(Microsoft Visual Studio Community 2022 (64 ビット) )を使用しています。

    お世話になります。
    またまたお尋ねしたい事があり、ご教示いただけますと幸いです。

    重なっているPictureBoxにフォームの背景色ではなくて、画像の重なっている部分を表示させたいのですが、実現出来ずに困っております。

    添付画像の様に、Windowsフォームデザイナ上にPictureBox同士を隣合せで配置しており、
    Imageプロパティに、背景を透過処理したGIF画像を設定しています。

    https://teratail.com/questions/163912
    を参考にし、どちらのPictureBoxもBackgroundColorプロパティにはTransparentを設定済みです。

129×118
イメージ
1693871617.jpg
/9KB
違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35513 / ResNo.3)  Re[2]: 重なったPictureBox同士を透過する方法
□投稿者/ KOZ 一般人(26回)-(2023/09/05(Tue) 12:10:16)
  • アイコンNo35512に返信(KOZの記事)
    補足です。
    Controls コレクションは Z オーダー順に並んでいるので、後ろから列挙して自分が出てきたら終了です。
    ただ、SetWindowPos で並びを変えてしまうと合わなくなるかもしれないので、API で列挙したほうがいいかもしれません。
違反を報告
引用返信
■35514 / ResNo.4)  Re[2]: 重なったPictureBox同士を透過する方法
□投稿者/ 本体は眼鏡 一般人(5回)-(2023/09/06(Wed) 08:38:37)
  • アイコンNo35511に返信(魔界の仮面弁士さんの記事)
    す。

    魔界の仮面弁士 様 お返事ありがとうございます。
    返信遅くなり申し訳ありません。

    > そのため、透過(あるいは半透明の)画像を複数重ね合わせて描画したい場合は、
    > PictureBox を複数枚使うのではなく、単一の PictureBox 上に
    > 自前で複数の画像を Graphics.DrawImage することで実現します。
    一つ一つのPictureBoxが機器の死活監視状態を表しており、
    300個以上あるため、私一人で実装するのは納期的にもちょっと難しそうです…
    プロパティの変更で出来る物かと安易に考えていました。
    今回はPictureBoxのサイズを小さくし、重ならないギリギリで配置することで回避しようと思います。
    せっかく教えて頂いたのに申し訳ありません…

    > https://dobon.net/vb/dotnet/graphics/index.html
    こちら折れ線グラフ作成等の際にとても助かりました。
    ありがとうございます。

    > 要件によっては、BackgroundImage と Image と Paint イベントの 3 つを
    > 組み合わせて使うこともありますね。
    今のプログラムが完成したら、頂いたページを参照しながらサンプルプログラムを作成し、今後の参考資料にしたいと思います。
解決み!
違反を報告
引用返信
■35515 / ResNo.5)  Re[3]: 重なったPictureBox同士を透過する方法
□投稿者/ 本体は眼鏡 一般人(6回)-(2023/09/06(Wed) 08:40:23)
  • アイコン2023/09/06(Wed) 14:17:22 編集(投稿者)
    2023/09/06(Wed) 14:17:13 編集(投稿者)

    No35513に返信(KOZさんの記事)
    > ■No35512に返信(KOZの記事)

    KOZ 様 お返事・サンプルソースのご提供ありがとうございます。

    プロパティ設定程度で実現出来るかと安易に考えていました。
    頂いたソースを理解して、私一人で実装するには納期的にもちょっと難しそうです…

    これまで何度かカスタムコントロールの作成に挫折してきましたが、
    今のプログラムが完成したら、頂いたソースを基にカスタムコントロールに挑戦してみたいと思います。
解決み!
違反を報告
引用返信
■35516 / ResNo.6)  Re[4]: 重なったPictureBox同士を透過する方法
□投稿者/ KOZ 一般人(27回)-(2023/09/06(Wed) 18:19:00)
  • アイコンNo35515に返信(本体は眼鏡さんの記事)
    > 頂いたソースを理解して、私一人で実装するには納期的にもちょっと難しそうです…
    >
    > これまで何度かカスタムコントロールの作成に挫折してきましたが、
    > 今のプログラムが完成したら、頂いたソースを基にカスタムコントロールに挑戦してみたいと思います。

    VisualStyle が無効でも透過できるよう作りましたが、VisualStyle が有効で BackColor = Color.Transparent のときのみ透過するのであれば、親の描画は PictureBox に任せて不要になるので、コードはかなり短くなります。
    挑戦するときは考慮してみてください。
解決み!
違反を報告
引用返信
■35517 / ResNo.7)  Re[5]: 重なったPictureBox同士を透過する方法
□投稿者/ KOZ 一般人(28回)-(2023/09/09(Sat) 11:50:05)
  • アイコン
    2023/09/09(Sat) 11:50:38 編集(投稿者)
    
    Windows 8 から子ウインドウがレイヤードウインドウになれるので、アプリケーションマニュフェストを追加して
    
          <!-- Windows 8 -->
          <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
    
    のコメントアウトを解除すると、簡単に透過できますね。
    
    # GetWindowLong/SetWindowLong を使っているのは手抜きです。(長くなるので)
    # プロセスが 64bit なら GetWindowLongPtr,SetWindowLongPtr を使うのが正式なやり方。
    # 64bit で SetWindowLong を使うと成功しても戻り値がゼロになってしまいます。
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Private Const WS_EX_LAYERED = &H80000
        Private Const GWL_EXSTYLE = -20
        Private Enum LWA
            COLORKEY = &H1
            ALPHA = &H2
        End Enum
    
        Private Sub PictureBox_HandleCreated(sender As Object, e As EventArgs) _
                    Handles PictureBox1.HandleCreated,
                            PictureBox2.HandleCreated
            Dim pic = DirectCast(sender, PictureBox)
            pic.Image = My.Resources.megane_hikaru_woman
            pic.SizeMode = PictureBoxSizeMode.Zoom
            pic.BackColor = Color.Gray
            Dim dwStyle = GetWindowLong(pic.Handle, GWL_EXSTYLE)
            dwStyle = dwStyle Or WS_EX_LAYERED
            SetWindowLong(pic.Handle, GWL_EXSTYLE, dwStyle)
            SetLayeredWindowAttributes(
                    pic.Handle, ColorTranslator.ToWin32(pic.BackColor),
                    0, LWA.COLORKEY)
        End Sub
    
        <DllImport("user32.dll")>
        Private Shared Function GetWindowLong(
                    hWnd As IntPtr, nIndex As Integer) As Integer
        End Function
    
        <DllImport("user32.dll")>
        Private Shared Function SetWindowLong(
                    hWnd As IntPtr, nIndex As Integer,
                    dwNewLong As Integer) As Integer
        End Function
    
        <DllImport("user32.dll")>
        Private Shared Function SetLayeredWindowAttributes(
                    hWnd As IntPtr, crKey As Integer,
                    bAlpha As Byte, dwFlags As LWA) As Boolean
        End Function
    
    End Class
    
    透過画像のまわりに BackColor が残ってしまいますが、目立たない色を設定しておくといいです。
    
    
    

解決み!
268×285 => 235×250
イメージ
layeredWindow.jpg
/15KB
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35490 / 親記事)  vb.netでExcelファイル操作
□投稿者/ Excel難しい 一般人(1回)-(2023/08/22(Tue) 14:55:20)
  • アイコン環境/言語:[vb.net .NET Franework 4.7.2] 
    分類:[.NET] 

    どうしてもタスクマネージャーのバックグラウンドプロセスにExcelが残ってしまいます。
    何か変な所ありますでしょうか?

    Dim ex As New Microsoft.Office.Interop.Excel.Application
    Dim wb As Microsoft.Office.Interop.Excel.Workbook = ex.Workbooks.Open(txtpath.Text)

    wb.Close(False)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
    wb = Nothing

    ex.Quit()
    System.Runtime.InteropServices.Marshal.ReleaseComObject(ex)
    ex = Nothing

    MsgBox(“作成完了”)
違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35493 / ResNo.3)  Re[1]: vb.netでExcelファイル操作
□投稿者/ 魔界の仮面弁士 大御所(1559回)-(2023/08/22(Tue) 15:37:00)
  • アイコンNo35490に返信(Excel難しいさんの記事)
    No35487 の 独学学生さんとは別の方ですか?

    > Dim ex As New Microsoft.Office.Interop.Excel.Application
    これは良いとして

    > Dim wb As Microsoft.Office.Interop.Excel.Workbook = ex.Workbooks.Open(txtpath.Text)
    ここが違いますね。 No35488 で Hongliang さんも書かれているように:

    Dim books As Microsoft.Office.Interop.Excel.Workbooks = ex.Workbooks
    Dim wb As Microsoft.Office.Interop.Excel.Workbook = books.Open(txtpath.Text)

    のように、COM オブジェクトごとに別々の変数に保持してください。

    > wb.Close(False)
    > System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)

    なので、Workbooks も解放せねばなりません。
    System.Runtime.InteropServices.Marshal.ReleaseComObject(books)

    > wb = Nothing
    > ex.Quit()
    > System.Runtime.InteropServices.Marshal.ReleaseComObject(ex)
    > ex = Nothing
違反を報告
引用返信
■35499 / ResNo.4)  Re[2]: vb.netでExcelファイル操作
□投稿者/ Excel難しい 一般人(6回)-(2023/08/23(Wed) 07:03:10)
  • アイコン独学学生と同じです!!

    では、シートを指定したい場所は

    Dim sheet As Microsoft.Office.Interop.Excel.Worksheets= ex.Worksheets

    Dim sh As Microsoft.Office.Interop.Excel.Worksheet =sheet(“発注”)

    になるって事でしょうか??
違反を報告
引用返信
■35500 / ResNo.5)  Re[3]: vb.netでExcelファイル操作
□投稿者/ 魔界の仮面弁士 大御所(1560回)-(2023/08/23(Wed) 15:12:12)
  • アイコン2023/08/24(Thu) 14:05:02 編集(投稿者)

    No35499に返信(Excel難しいさんの記事)
    > 独学学生と同じです!!
    ここの掲示板の利用ルールには
     「一貫した名前を使用し、投稿によって名前を変えないでください」
     「投稿者名を変えて投稿できないことになっています」
    と明記されています。無暗に変更しないようにしましょう。
    https://dobon.net/vb/bbs/index.html#manners


    COM オブジェクトの Excel を直接参照設定して使うのは、バージョン不一致時の互換性問題や、
    オブジェクトの解放手順の煩雑さの点や、現状ではあまりおすすめできません。
    利用者がストアアプリ版の Office を利用していると呼び出せませんし。

    要件次第では ClosedXml / NetOffice / SpreadSheetLight / などを用いることも検討してみてください。
    「実行環境に Excel 本体が無くても呼び出せる」というメリットもあります。



    > では、シートを指定したい場所は
    毎回 Microsoft.Office.Interop.Excel を書くのは煩わしいので、
    通常は、ファイル先頭に Imports ステートメントを書いて省略します。
    (もしくは、プロジェクト単位のユーザーインポートを使う手法もある)
    実際には案2を使っている事例が多いですね。


    <案1>
    Imports Microsoft.Office.Interop
    Public Class Form1
     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim ex As New Excel.Application() With { .Visible = True }


    <案2>
    Imports Excel = Microsoft.Office.Interop.Excel
    Public Class Form1
     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim ex As New Excel.Application() With { .Visible = True }


    > Dim sheet As Microsoft.Office.Interop.Excel.Worksheets= ex.Worksheets
    Sheets や Worksheets といったコレクション オブジェクトは、「複数形」の型名なので
    sheet といった「単数形」の変数名にすると、後で読むときにややこしくないですか…?

    それはさておき、外部からアクセスする場合は、Application の Worksheets プロパティを使用しないでください。
    Worksheets にアクセスする前に、Workbooks に対して Add か Open を呼び出して
    Workbook オブジェクトを取得し、そのあとで Worksheets プロパティにアクセスします。

    > Dim sh As Microsoft.Office.Interop.Excel.Worksheet =sheet(“発注”)
    Worksheets プロパティはその戻り値として
    実は Worksheets 型ではなく Sheets 型のオブジェクトを返します。
    型が異なるため、Worksheets 型には代入できません。

    そのため .NET から扱う場合は
     Dim sheet As Excel.Sheets = book.Worksheets
    のように書くことになります。

    とはいえ、VB2008 以降なら型推論が使えるので、単に
     Dim sheets = book.Worksheets
    と書くのが簡単でしょう。

    Worksheet に関しては、そこから
     Dim sheet1 = DirectCast(sheets("Sheet1"), Excel.Worksheet)
    とします。単に
     Dim sheet1 = sheets("Sheet1")
    にしてしまうと、As Object になってしまうため、DirectCast で本来の型に戻します。


    そのほか、間違えやすいのが Cells プロパティ。

    VBA においては
     sheet1.Cells(1, 1).Value = 123
    などと書けますが、Cells プロパティは実は「引数を持たないプロパティ」であり、
    内部的には、既定のプロパティを通じて
     sheet1.sheet1.Cells.[_Default](1,1).Value = 123
    に相当する VBA コードになります。

    さらに、Range オブジェクトもまた、COM のオブジェクトであるため、
    上記の VBA コードを .NET の世界で扱うときには、
     Dim cells As Excel.Range = sheet1.Cells
     Dim cell1 As Excel.Range = cells(1, 1)
     cell1.Value = 100
     Marshal.ReleaseComObject(cell1)
     Marshal.ReleaseComObject(cells)
    という手続きを踏まねばなりません。


    もう一つ厄介なのかが「暗黙の型変換」。
    Excel の幾つかのメソッドやプロパティには、COM オブジェクトを引数に持つメンバーがありますが、
    この時に、明示的な型ではなく、汎用型の As Object な引数で受けわたしてしまうと、
    その時点で COM の参照カウントが増大し、Marshal.ReleaseComObject を呼んでも
    即時に解放されにくくなってしまうことがあります。
    (Object 型ではなく、本来の型の変数を引数に渡すのであればセーフ)

    参照カウントが増大していた場合、Marshal.ReleaseComObject の呼び出し後、
    戻り値が 0 にならないため、そこで判断することができます。
    (要件次第では、FinalReleaseComObject に切り替えることも検討)
違反を報告
引用返信
■35502 / ResNo.6)  Re[4]: vb.netでExcelファイル操作
□投稿者/ Excel難しい 一般人(7回)-(2023/08/24(Thu) 11:13:46)
  • アイコン度々申し訳ありません。
    ワークブックとワークシートはおそらく解放できていると思うのですがまだプロセスが残ってしまいます。

    Dim lastRow As Integer = sh.Cells(sh.Rows.Count, "B").End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).row
    とrange.ClearContents()をコメントにし、
    range = Cells.Range("B5:I" & lastRow)をrange = Cells.Range("B5:I5")に変更するとプロセスが残らず終了できるので、lastRowかrange.ClearContents()のどちらかが解放漏れしていてプロセスが残ってしまっていると考えて居るのですが、解放の仕方が分からない状態です。
    お力を貸してください。

    Private Sub btn作成_Click(sender As Object, e As EventArgs) Handles btn作成.Click
    If txtPath.Text = "" Then
    Exit Sub
    End If

    Dim str As String = ""
    Dim strCount = 0

    Dim ex As New Microsoft.Office.Interop.Excel.Application
    Dim books As Microsoft.Office.Interop.Excel.Workbooks = ex.Workbooks
    Dim wb As Microsoft.Office.Interop.Excel.Workbook
    Dim sheets As Microsoft.Office.Interop.Excel.Sheets
    Dim sh As Microsoft.Office.Interop.Excel.Worksheet

    Dim Cells As Microsoft.Office.Interop.Excel.Range
    Dim range As Microsoft.Office.Interop.Excel.Range

    Try
    For rw As Integer = 0 To dgv.RowCount - 1
    If strCount = 0 Then
    wb = books.Open(txtPath.Text)
    sheets = wb.Worksheets
    sh = sheets("発注一覧")
    Cells = sh.Cells
    strCount = strCount + 1

            'ファイル内のセル初期化
    Dim lastRow As Integer = sh.Cells(sh.Rows.Count, "B").End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).row
    If lastRow >= 5 Then
    range = Cells.Range("B5:I" & lastRow)
    range.ClearContents()
    End If

    End If

    strCount = strCount + 1
    End If
    Next

    wb.Save()
    wb.Close(False)
    ex.Quit()


    Catch exc As Exception
    Finally
    If Cells IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(Cells)
    End If
    If range IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(range)
    End If
    If sheets IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets)
    End If
    If sh IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(sh)
    End If
    If books IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(books)
    End If
    If wb IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
    End If
    If ex IsNot Nothing Then
    System.Runtime.InteropServices.Marshal.ReleaseComObject(ex)
    End If

    Cells = Nothing
    range = Nothing
    sheets = Nothing
    sh = Nothing
    books = Nothing
    wb = Nothing
    ex = Nothing

    GC.Collect()
    GC.WaitForPendingFinalizers()

    btn作成.Enabled = True

    If strCount <> 0 Then
    MsgBox(“作成完了”)
    End If
    End Try

    End Sub
違反を報告
引用返信
■35503 / ResNo.7)  Re[5]: vb.netでExcelファイル操作
□投稿者/ 魔界の仮面弁士 大御所(1561回)-(2023/08/24(Thu) 14:16:09)
  • アイコン2023/08/24(Thu) 17:37:12 編集(投稿者)

    No35502に返信(Excel難しいさんの記事)
    > Dim lastRow As Integer = sh.Cells(sh.Rows.Count, "B").End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).row

    先の回答がまるで反映されていないですよね…?
    Range オブジェクトすべてを変数にとり、使用後に廃棄しましょう。

    'Dim lastRow As Integer = sh.Cells(sh.Rows.Count, "B").End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).row
    Dim cells = sh.Cells
    Dim rows = sh.Rows
    Dim rng = cells(rows.Count, "B")
    Dim rngEnd = rng.End(Microsoft.Office.Interop.Excel.XlDirection.xlUp)

    Dim lastRow As Integer = rngEnd.Row

    Marshal.RelaseComObject(rngEnd)
    Marshal.RelaseComObject(rng)
    Marshal.RelaseComObject(rows)
    Marshal.RelaseComObject(cells)

    正直なところ、生の Excel ライブラリを直接扱うのは、COM リソースの管理が面倒なので、
    先に紹介したような、Managed リソースで管理できるライブラリを使った方が楽だと思いますよ。


    > range = Cells.Range("B5:I" & lastRow)を
    この処理自体には何の問題もありません。
    実際のところ、
     Dim lastRow As Integer = 5
     range = Cells.Range("B5:I" & lastRow)
    であれば、問題は出ないですよね?

    問題があったのは、lastRow を求めるための先の手続きです。


    > Private Sub btn作成_Click(sender As Object, e As EventArgs) Handles btn作成.Click
    strCount が何をカウントしているのかの意図が不明瞭ですが、
    提示されたコードでは「If 〜 Then」よりも「End If」の方が多く、文法的に意味が通りません。
    正しいコードを提示しましょう。


    それと、COM オブジェクトの扱いに根本的な誤解があるようです。
     Dim o1 = sheet1.Cells
     Dim o2 = sheet1.Cells
    この場合、o1 と o2 は同一のオブジェクトを指しているように見えますが、
    実際は別物であり、 If o1 Is o2 Then は False となります。

    なのでこのケースでは、
     Marshal.ReleaseComObject(o2)
     Marshal.ReleaseComObject(o1)
    のように、それぞれを解放せねばなりません。

    それゆえに
     Dim o As Excel.Range = Nothing
     For n = 1 To 2
      o = sheet1.Cells
      :
     Next
     Marshal.ReleaseComObject(o)
    のような再代入処理が行われると、Range オブジェクトの解放漏れに繋がります。
    ※Range 以外の COM オブジェクト(Workbooks とか Workbook とか Sheets とか Worksheet とか)も同様です。

    ただし、
     For n = 1 To 2
      Dim o As Excel.Range = sheet1.Cells
      :
      Marshal.ReleaseComObject(o)
     Next
    のように、取得 → 解放の手続きをその都度行うのであれば、問題ありません。
    (とはいえ、何度も取得しなおす方法では、実行コストが高くなってしまいますが)


    > For rw As Integer = 0 To dgv.RowCount - 1
    >  If strCount = 0 Then
    >   wb = books.Open(txtPath.Text)
    >   sheets = wb.Worksheets
    >   sh = sheets("発注一覧")
    ということで、この書き方は NG 。

    そもそも、COM オブジェクトの問題が無かったとしても、
    このコードもあまりに不自然というものです。

    ループ内で、txtPath.Text が変化するわけでは無いのですから、
    毎回、COM オブジェクトを再取得する意味は無いはずです。
    ループの外で処理すれば済む話でしょう。

    Dim wb = books.Open(txtPath.Text)
    Dim sheets = wb.Worksheets
    Dim sh = sheets("発注一覧")
    For rw = 0 To dgv.RowCount - 1
      :
    Next
    Marshal.ReleaseComObject(sh)
    Marshal.ReleaseComObject(sheets)
    wb.Save()
    wb.Close(False)
    Marshal.ReleaseComObject(wb)
    ex.Quit()
    Marshal.ReleaseComObject(ex)


    それにしても、『For rw As Integer = 0 To dgv.RowCount - 1』って何の意味があるのでしょうか?
    dgv が DataGridView であるというのは想像がつきますが、
    ループ内で変数 rw が一度も使われていませんし、ループさせる意味が皆無に見えるのですが。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]



■記事リスト / ▲上のスレッド
■35341 / 親記事)  TreeViewの現在位置とDataGridViewの現在位置を合わせたい
□投稿者/ 炎の妖精さん 一般人(19回)-(2023/01/24(Tue) 15:07:37)
  • アイコン環境/言語:[Win10(64bit)_VB.NET(Framework 3.5)_VS2010] 
    分類:[.NET] 

    お世話になります。
    本サイト様にはいつも助けられており感謝いたします!
    開発中に困った場面が出てまいりましたのでご助言いただければ幸いです!

    内容ですが、
    左側に"TreeView"、右側に"DataGridView"を表示させており、
    TreeViewの現在位置が変われば、DataGridViewの現在位置も変えたい所存です。

    TreeViewには行という概念が存在しない為、
    どのようにすればいいのか分からない次第です。
994×120 => 250×30
イメージ
TREEVIEW_DATAGRIDVIEW.png
/9KB
違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35344 / ResNo.3)  Re[1]: TreeViewの現在位置とDataGridViewの現在位置を合わせたい
□投稿者/ 魔界の仮面弁士 大御所(1523回)-(2023/01/24(Tue) 16:51:42)
  • アイコンNo35341に返信(炎の妖精さんさんの記事)
    > 左側に"TreeView"、右側に"DataGridView"を表示させており、
    > TreeViewの現在位置が変われば、DataGridViewの現在位置も変えたい所存です。
    アイテムの高さの調整や、スクロールや折り畳みへの追従は
    すでに実装済みであり、あくまでも「現在行」の
    調整さえ行えれば良い、ということでしょうか。

    > TreeViewには行という概念が存在しない為、
    > どのようにすればいいのか分からない次第です。

    TreeNode.EnsureVisible メソッド … 指定ノードを表示させる(展開やスクロールも行われる)
    TreeNode.Bounds プロパティ … ノード位置を示す Recangle を取得する
    TreeView.SelectedNode … 現在選択されているノードを示す
    TreeView.TopNode プロパティ … 表示されている中で一番上のノードを取得・設定する
    TreeView.HitTest メソッド … 指定座標にある要素を調査する
    TreeView.BeforeSelect イベント … ノードが選択される直前に発生する(キャンセル可能)
    TreeView.AfterSelect イベント … ノードが選択された後で発生する
    TreeView.BeforeCollapse/BeforeExpand/AfterCollapse/AfterExpand イベント … ノードが折り畳み/展開される直前/直後にそれぞれ発生する
    TreeView.WndProc メソッド … オーバーライドして WM_VSCROLL/WM_HSCROLL を捉えることで、TreeView のスクロールを検知することができる

    DataGridView.FirstDisplayedScrollingRowIndex プロパティ … 指定行までスクロールさせる
    DataGridView.FirstDisplayedScrollingColumnIndex プロパティ … 指定列までスクロールさせる
    DataGridView.SelectedRows プロパティ … 現在選択されているプロパティを返す
    DataGridView.Scroll イベント … DataGridView のスクロールを検知することができる
    DataGridView.SelectionChanged イベント … 別のセル範囲が選択されると発生する
違反を報告
引用返信
■35345 / ResNo.4)  Re[3]: TreeViewの現在位置とDataGridViewの現在位置を合わせたい
□投稿者/ 炎の妖精さん 一般人(21回)-(2023/01/24(Tue) 16:57:34)
  • アイコン魔界の仮面弁士様
    回答ありがとうございます!

    > 方向性が異なってきますが、この構成のために
    >   「ツリー表示可能な DataGridView」
    > を使うという選択肢は如何でしょうか。
    「ツリー表示可能なDataGridView」が
    VS2010にも取り入れることが出来れば選択肢は有りです!


    > ノードの折りたたみにも対応できるようです。
    > オリジナルコード(C#)のダウンロードはこちら。
    サイトにアクセスしましたが、ページが見つかりませんとエラーが出ました。
    「Oops! That page can’t be found.」


    > 元記事はこちら。
    > [Mark Rideout's Blog] - [Customizing the DataGridView to support expanding/collapsing (ala TreeGridView)]
    此度のようなツリー表示可能なDataGridViewで表現したい場合は
    大変素晴らしいコントロールだと思いました。
    採用するかどうかは検討させていただきます。
違反を報告
引用返信
■35346 / ResNo.5)  Re[4]: TreeViewの現在位置とDataGridViewの現在位置を合わせたい
□投稿者/ 魔界の仮面弁士 大御所(1524回)-(2023/01/24(Tue) 17:07:25)
  • アイコン2023/01/24(Tue) 17:08:16 編集(投稿者)

    No35345に返信(炎の妖精さんさんの記事)
    > VS2010にも取り入れることが出来れば選択肢は有りです!
    Visual Studio 2005 向けの古いソースコードなので、
    移植性に関しては問題ないと思います。


    >>ノードの折りたたみにも対応できるようです。
    >>オリジナルコード(C#)のダウンロードはこちら。
    > サイトにアクセスしましたが、ページが見つかりませんとエラーが出ました。

    あぁ、失礼しました。
    >>元記事はこちら。
    からリンクされている記事を読んでいただくと、その冒頭に
    >>> Original Code:
    >>> https://www.windowsforms.net/blogs/markrideout/treegridview.zip
    とあります。この URL を踏むと、実際には
    下記(OneDrive) の移転先からダウンロードされる仕組みです。

    https://skydrive.live.com/redir?resid=3A5CA8204EC61147!47897&authkey=!AEyPC_P9956qy2E
違反を報告
引用返信
■35347 / ResNo.6)  Re[2]: TreeViewの現在位置とDataGridViewの現在位置を合わせたい
□投稿者/ 炎の妖精さん 一般人(22回)-(2023/01/24(Tue) 17:09:14)
  • アイコン魔界の仮面弁士様
    回答ありがとうございます!

    >> 左側に"TreeView"、右側に"DataGridView"を表示させており、
    >> TreeViewの現在位置が変われば、DataGridViewの現在位置も変えたい所存です。
    > アイテムの高さの調整や、スクロールや折り畳みへの追従は
    > すでに実装済みであり、あくまでも「現在行」の
    > 調整さえ行えれば良い、ということでしょうか。
    実はスクロールについても悩んでおりまして・・・
    TreeViewとDataGridViewのスクロールは同期(シンクロ)させたいのですが、
    TreeViewにはScrollに関するイベント関数が用意されていないようでした。
    TreeViewをマウスホイールでスクロールするとDataGridViewも同方向にスクロールしたいです。
    ※TreeViewとDataGridViewに表示されるデータ件数は同じです


    > TreeNode.EnsureVisible メソッド … 指定ノードを表示させる(展開やスクロールも行われる)
    > TreeNode.Bounds プロパティ … ノード位置を示す Recangle を取得する
    > TreeView.SelectedNode … 現在選択されているノードを示す
    > TreeView.TopNode プロパティ … 表示されている中で一番上のノードを取得・設定する
    > TreeView.HitTest メソッド … 指定座標にある要素を調査する
    > TreeView.BeforeSelect イベント … ノードが選択される直前に発生する(キャンセル可能)
    > TreeView.AfterSelect イベント … ノードが選択された後で発生する
    > TreeView.BeforeCollapse/BeforeExpand/AfterCollapse/AfterExpand イベント … ノードが折り畳み/展開される直前/直後にそれぞれ発生する
    > TreeView.WndProc メソッド … オーバーライドして WM_VSCROLL/WM_HSCROLL を捉えることで、TreeView のスクロールを検知することができる

    > DataGridView.FirstDisplayedScrollingRowIndex プロパティ … 指定行までスクロールさせる
    > DataGridView.FirstDisplayedScrollingColumnIndex プロパティ … 指定列までスクロールさせる
    > DataGridView.SelectedRows プロパティ … 現在選択されているプロパティを返す
    > DataGridView.Scroll イベント … DataGridView のスクロールを検知することができる
    > DataGridView.SelectionChanged イベント … 別のセル範囲が選択されると発生する
    各コントロールのイベントの説明、ありがとうございます!
    やりたいこと、出来そうなことを整理して
    実装できるか検証したいと思います。
違反を報告
引用返信
■35348 / ResNo.7)  Re[3]: TreeViewの現在位置とDataGridViewの現在位置を合わせたい
□投稿者/ 炎の妖精さん 一般人(23回)-(2023/01/25(Wed) 13:43:18)
  • アイコン魔界の仮面弁士様

    なんとか現在位置を取得することが出来ました。

    スクロールの同期(シンクロ)については新たに質問します。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]






Mode/  Pass/


- Child Tree -