tabcontrol, DrawMode na OwnerDrawFixed i przykład z msdn nie działa.

0

Witam wszystkich.

Przeglądałem to forum ( i nie tylko ) i rozwiązania nie znalazłem.

Problem pojawił się taki, że chciałem ustawić sobie tab control w poziomie z przyciskami po lewej stronie, które miały by być
w poziomie. Z tym ostatnim sprawa wydała się najbardziej skomplikowana, bo okazała się że trzeba napisać własną metodę, obsługującą zdarzenie DrawItem, bo przyciski można "ustawić" jako "poziome" manipulując ich rozmiarami, ale sam tekst wyświetla się pionowo zamiast poziomo...
grzebałem pytałem wujka google i oto co znalazłem:

https://social.msdn.microsoft.com/Forums/windows/en-US/890e9c5d-dade-423f-b208-478b1825e48a/how-to-change-tab-control-tab-label-orientation-from-vertical-to-horizontal?forum=winforms

czyli, żeby ustawić:
Alignment na left
SizeMode na fixed
jeśli dobrze zrozumiałem punkt czwarty, to że za pomocą wielkości przycisków mogę je ustawić "poziomo"
DrawMode na OwnerDrawFixed i
gotowy kod na obsługę zdarzenia i.... nie działa... oto fragment moich wypcin


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//...
//...
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
         
        public Form1()
        {
            
            InitializeComponent();
            label4.Text = nazwa_roboczej_bazy;
           
         }
       
     //....... 
     //.......
     //.......
     // przyciski, okna i moje funkcje i wklejona żywcem metoda z msdna ( link macie wyżej ):
     //.......
     //.......  
  
     private void tabControl1_DrawItem(object sender,  System.Windows.Forms.DrawItemEventArgs e)
       {
           Graphics g = e.Graphics;
           Brush _textBrush;

           // Get the item from the collection.
           TabPage _tabPage = tabControl1.TabPages[e.Index];

           // Get the real bounds for the tab rectangle.
           Rectangle _tabBounds = tabControl1.GetTabRect(e.Index);

           if (e.State == DrawItemState.Selected)
           {

               // Draw a different background color, and don't paint a focus rectangle.
               _textBrush = new SolidBrush(Color.Red);
               g.FillRectangle(Brushes.Gray, e.Bounds);
           }
           else
           {
               _textBrush = new System.Drawing.SolidBrush(e.ForeColor);
               e.DrawBackground();
           }

           // Use our own font.
           Font _tabFont = new Font("Arial", (float)10.0, FontStyle.Bold, GraphicsUnit.Pixel);

           // Draw string. Center the text.
           StringFormat _stringFlags = new StringFormat();
           _stringFlags.Alignment = StringAlignment.Center;
           _stringFlags.LineAlignment = StringAlignment.Center;
           g.DrawString(_tabPage.Text, _tabFont, _textBrush, _tabBounds, new StringFormat(_stringFlags));
           MessageBox.Show("dlaczego nie ");

           e.DrawBackground();
       

       }
    
    
    }

 
}
 

no i nie działa... sprawdzałem w tabControl1 wartość name się zgadza ( bo mam dwie tabcontrol ).
Dla pewności założyłem inny projekt i znów ze stron msdna chciałem wrzucić gotowe przykłady "przerabianych" kontrolek i nic.
Wiem, że kod metody tabControl1_DrawItem też nie stanowi problemu, bo w momencie kiedy cały ustawiłem jako komentarz i wstawiłem message boxa z komunikatem i pojawiał się mój tabcontrol żaden komunikat się nie pojawiał.... czyli o ile dobrze rozumiem metoda tabControl1_DrawItem po prostu nie została ani razu wywołana ... czego tam nie wpisze i tak program po nią nie sięga...

Nie czytałem na ten temat, ale po nazwie wnioskuje że zdarzenie DrawItem ma miejsce kiedy tabcontrol jest rysowana...

Na koniec przepraszam za niefachowy język, mam niewielkie amatorskie doświadczenie z programowaniem. Liczę na wyrozumiałość i pomoc.

0

Mi działa bez zarzutu. A przypisałeś funkcje tabControl1_DrawItem do zdarzenia DrawItem?

0

Tak jak napisałem wyżej z problemem ( jestem żółtodziobem ) zetknąłem się pierwszy raz i zrobiłem jedynie to co było w/w opisie - instrukcji.
Ogromnie będę wdzięczny jak powiesz jak to zrobić.

1

W oknie Properties kontrolki TabControl znajdź ikonę pioruna i wciśnij ją. Następnie w zakładce Behavior znajdź pole DrawItem i wpisz do niego nazwę funkcji w tym wypadku tabControl1_DrawItem i tyle.

0

Ogromne dzięki :) przemek_p
... O to właśnie chodziło....
Wiem, że pytanie mogło się wydawać banalnie proste, ale czytam i polsku i po angielsku kiedy mam czasu i wszystkiego na raz nie opanuje....
myślę że temat można by zamknąć....

1 użytkowników online, w tym zalogowanych: 0, gości: 1