Pertanyaan Apa kendali ini? Kotak Grup atau Tidak!


Hanya ingin tahu tentang kontrol yang ditunjukkan di bawah ini, garis lurus dengan label di sampingnya. Saya mencoba mencari kontrol yang serupa untuk itu tetapi tidak ada pengaturan grup grup, jadi saya hanya membuat GroupBox dengan ketinggian 2 yang mereplikasi itu.

Tetapi apakah ada kontrol atau pengaturan yang sebenarnya untuk melakukan ini? Dan apa kontrol sebenarnya yang disebut?

Internet Options property dialog


5
2018-02-04 11:41


asal


Jawaban:


Spy ++ memberitahu kita bahwa keduanya sebenarnya terpisah STATIC kontrol (mirip dengan Label di WinForms).

  • Yang pertama hanyalah kontrol teks statis biasa yang mengatakan "Halaman Beranda".

  • Yang kedua memiliki SS_ETCHEDHORZ gaya set, yang membuatnya menggambar sebagai garis 3D. Sayangnya, kemampuan untuk mengatur gaya ini tidak terpapar pada kita dari dalam WinForms.

Seperti yang Anda cantumkan dalam pertanyaan, ada beberapa hacks / workarounds yang memungkinkan kita untuk mencapai tampilan yang sama, seperti kompresi vertikal GroupBox kontrol, atau menimpa OnPaint metode a Label mengontrol dan menggunakan ControlPaint kelas untuk menggambar perbatasan 3D. Mereka bekerja, tetapi saya tidak pernah menyukai mereka.

Tapi kamu bisa sebenarnya mengatur SS_ETCHEDHORZ rancang sendiri agar Anda dapat meniru UI asli dengan tepat. Inilah kelas kecil yang melakukan hal itu. Tambahkan ke proyek Anda, kompilasi, dan Anda akan melihat kontrol baru muncul di kotak peralatan Anda yang disebut "HorizontalRule". Gunakan saja seperti kontrol lainnya!

public class HorizontalRule : Control
{
    private const int FixedHeight   = 2;

    private const int WS_CHILD      = 0x40000000;
    private const int WS_VISIBLE    = 0x10000000;
    private const int SS_ETCHEDHORZ = 0x00000010;
    private const int SS_ETCHEDVERT = 0x00000011;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ClassName = "STATIC";
            cp.Style = WS_CHILD | SS_ETCHEDHORZ;
            if (this.Visible)
            {
                cp.Style |= WS_VISIBLE;
            }
            return cp;
        }
    }

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
    {
        height = FixedHeight;
        base.SetBoundsCore(x, y, width, height, specified);
    }
}

Anda juga dapat menemukan informasi lebih rinci dan kode sampel tambahan di sini di CodeProject.


10
2018-02-04 11:58



Saya mengalami masalah yang sama beberapa tahun yang lalu dan akhirnya hanya menggambar garis untuk tujuan tersebut.

Bahkan saya bahkan menggunakan satu gambar garis tetap dengan lebar yang cukup panjang sehingga dapat digunakan dalam semua kasus dengan menunjukkan bagian yang diperlukan (lebar) dari gambar.

Solusi ini telah bekerja dengan baik untuk saya sejak itu.


0
2018-02-04 11:43