HToggleButton increase width of focus rectangle
Hi, can anyone tell me how to increase the width of focus rectangle when any component like HToggleButton is focused
Hi, can anyone tell me how to increase the width of focus rectangle when any component like HToggleButton is focused
Similar Messages
-
How to increase width but maintain x, y coords.
I'm trying to increase the width of a rectangle, but don't
want to scale the rectangle or change the x,y base. How show I go
about this."SiHoop" <[email protected]> wrote in
message
news:gl5jq2$imk$[email protected]..
> I'm trying to increase the width of a rectangle, but
don't want to scale
> the
> rectangle or change the x,y base. How show I go about
this.
>
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml"
> creationComplete="init()"
> layout="absolute">
> <mx:UIComponent id="mainDisplay"/>
> <mx:Script>
> <![CDATA[
> private var goalBox:Shape = new Shape();
> public function init():void{
> goalBox.graphics.lineStyle(1, 0xff0000);
> goalBox.graphics.beginFill(0xff0000);
> goalBox.graphics.drawRect(115, 90, 200, 1);
> mainDisplay.addChild(goalBox)
> }
> public function clicked():void{
> goalBox.width+=300
> }
> ]]>
> </mx:Script>
> <mx:Button click="clicked()"/>
> </mx:Application>
You'd call graphics.clear() and then draw it again at the new
size, but the
same x and y coordinates. -
Custom focus rectangle in JTextField
I'm trying to change my theme/look & feel to show a focus rectangle for JTextField, somewhat like this: [http://www.macvswindows.com/index.php?title=GUI_Customization|http://www.macvswindows.com/index.php?title=GUI_Customization] (second image down, or direct [http://www.macvswindows.com/images/thumb/f/f2/osx_aqua_colors.png/500px-osx_aqua_colors.png|http://www.macvswindows.com/images/thumb/f/f2/osx_aqua_colors.png/500px-osx_aqua_colors.png] ) I don't want to make it exactly like MacOS, but a similar idea.
For now I'm just trying to do it on the inner part of the field. I can get it to paint with the code below, but then the caret painting messes things up as I tab through the fields or move the caret around inside the fields.
So it seems I'm headed down the wrong path, what should I be doing? Extending DefaultHighlighter or DefaultCaret, or something else?
Thanks,
Jim
package testui;
import javax.swing.*;
import javax.swing.plaf.metal.DefaultMetalTheme;
import javax.swing.plaf.metal.MetalLookAndFeel;
public class ThemeTest extends JFrame {
public class TestMetalTheme extends DefaultMetalTheme {
public void addCustomEntriesToTable(UIDefaults table) {
UIManager.put("TextFieldUI", "customui.CustomTextFieldUI");
public String getName() {
return "TestMetalTheme";
public static void main(String[] args) {
ThemeTest testFrame = new ThemeTest();
testFrame.setVisible(true);
public ThemeTest() {
try {
MetalLookAndFeel.setCurrentTheme(new TestMetalTheme());
UIManager.setLookAndFeel(new MetalLookAndFeel());
} catch (Exception e) {
e.printStackTrace();
setSize(500, 500);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel panel = new JPanel();
add(panel);
panel.add(new JTextField("test"));
panel.add(new JTextField("test"));
panel.add(new JTextField("test"));
panel.add(new JButton("button"));
package testui;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalTextFieldUI;
import java.awt.*;
public class CustomTextFieldUI extends MetalTextFieldUI {
private Color focusColor = Color.cyan;
private JComponent component;
public CustomTextFieldUI(JComponent c) {
if (c == null) {
throw new IllegalArgumentException("component must be specified");
this.component = c;
public static ComponentUI createUI(JComponent c) {
return new CustomTextFieldUI(c);
protected void paintSafely(Graphics g) {
super.paintSafely(g);
if (component.hasFocus()) {
Dimension size = component.getSize();
Graphics2D g2d = (Graphics2D) g;
System.out.println(g2d.getClip());
System.out.println(g2d.getClipBounds());
g2d.setColor(focusColor);
g2d.setStroke(new BasicStroke(2f));
g2d.drawRect(1, 1, size.width - 3, size.height - 3);
}Why not just combine the two approaches?
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalTextFieldUI;
public class CustomTextFieldUI extends MetalTextFieldUI {
private Color focusColor = Color.cyan;
private JComponent component;
private Border normalBorder;
private Border focusedBorder;
private FocusListener focusListener;
public CustomTextFieldUI( JComponent c ) {
if ( c == null ) {
throw new IllegalArgumentException( "component must be specified" );
this.component = c;
focusListener = new FocusListener() {
public void focusGained( FocusEvent fe ) {
if ( normalBorder == null ) {
normalBorder = component.getBorder();
focusedBorder = new BevelBorder( BevelBorder.LOWERED ) {
@Override
public Color getHighlightInnerColor() { return focusColor; }
@Override
public Color getHighlightOuterColor() { return focusColor; }
@Override
public Color getShadowInnerColor() { return focusColor; }
@Override
public Color getShadowOuterColor() { return focusColor; }
component.setBorder( focusedBorder );
public void focusLost( FocusEvent fe ) {
component.setBorder( normalBorder );
public static ComponentUI createUI( JComponent c ) {
return new CustomTextFieldUI ( c );
@Override
protected void installListeners() {
super.installListeners();
component.addFocusListener( focusListener );
@Override
protected void uninstallListeners() {
super.uninstallListeners();
component.removeFocusListener( focusListener );
} -
Focus rectangle around jCheckBox
Hi all,
I have a JCheckBox with no label text with it. Usually when the JCheckBox has focus, theres a dotted focus rectangle around the label text, so in this case there never is.
Since theres a few checkboxes in the same panel, it gets very confusing as you can't see what component is in focus. Is there any way about this? I was trying to create my own checkbox with a dotted border when the component gets focus, but theres no dotted border in swing.
So my question is this:
1) Is there any way to change the focus rectangle to go about the whole component and not just the text label?
or
2) Is there any dotted border in swing that I've missed?
thanks,
Justinwhat about having blank spaces as the text (the # of spaces determines the rectangle width)
something like this
import java.awt.*;
import javax.swing.*;
class Testing extends JFrame
JCheckBox cbx1 = new JCheckBox(" ");
JCheckBox cbx2 = new JCheckBox(" ");
public Testing()
setLocation(400,300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel p = new JPanel();
p.add(cbx1);
p.add(cbx2);
getContentPane().add(p);
pack();
public static void main(String[] args){new Testing().setVisible(true);}
} -
Does not allow to increase width of the filed
hi all,
well i have report that is designed by someone else in report 6i, now i want to change the width of one filed , that is i want to increase width but it does not allow me to change it
how to change it??
thanks
abhi.There can be two reasons...
1. Check the outer frame(s) for that field. I mean if that field exists in repeating frame or main frame then increase the frame size first then you can increase the field side.
2. There is one button in the LAYOUT SECTION at top called FREEZE PANES. If it is pressed mean if you will resize the field size then frame side will be automatically adjust. So, suppose you replay LAYOUT section's size is not allowing you yo increase the frames out of the LAYOUT section. If it is then increase the layout section size and try..
-Ammad -
JButton & Win XP Look and Feel focus rectangle bug??
I searched the bug database but was unable to find any matches...
I have received a bug report from our users relating to mistakenly thinking a button has focus. In the XP LAF, when a button is a 'default' button, it has a blue rectancle drawn around it (which is correct). When you tab to that button however, there is no additional 'focus' rectangle to indicate that the button has focus. I tested this in native XP components and an additional rectancle IS drawn when the button gets focus (in addition to the blue rectangle). Shouldn't there be some sort of focus indicator in addition to the blue rectangle? I'm using JRE version 1.4.2_02.
Thanks,
AndyHello Andy!
If the behavior of Win XP LAF is different from the native this is definitely a bug. It would be greate if you file a bug here
http://java.sun.com/webapps/bugreport.
Thank you.
Anton -
How to increase width of canvas in xcelsius?
How to increase width of canvas in xcelsius?
Hi
The simplest way is to go to File > Document Properties> Document and check Custome Size. You will then be able to set the width and height in pixels.
Alternatively if you want to widen the canvas as your components already go over the edge you can use the Fit Canvas to Components icon on the toolbar along the top.
Hope this helps.
Paul -
How to increase width of LOV popup
I would like to increase width of LOV popup in my ui. I found one suggestion to use skin to change the LOV display property and would like to know if there is any other default framework support to increase LOV size declaritively. Appreciate your responses.
BTW I am using ADF version 11.1.1.6
thanks.Thanks Timo. Yes I would like to increase the size of af:inputListOfValues popup displayed when clicked on the torch icon. But since I have all the LOVs already coded I would like to find a way to increase just the display width as the LOV popup doesn't expand completely and the user has to scroll to view the details displayed in the LOV popup.
-
I m using Combobox and when I activated accesability by Tab,
The focus rectangles apears in a grean color, how do I change the
color of that rectangle.. (I want it to Yellow, like it comes for
Buttons etc..)
Regards
Sidharthnobody replied
-
Can someone tell me how to make a focus rectangle visible
without tabbing. i.e. via code something like that below:
I know its possible because I've done it before and can't
remember how I did it.
Thanks in advance.I read through my post and thought it wasn't very clear what
I was asking. Basically I've created code before that would show a
focus rectangle if a user clicked in that field with the mouse. Now
I'm trying to do that again and can't remember how I did it. -
Get length and width of a rectangle
I am using sdo_sam.tiiled_bins to breakup rectangles into different sections. I need to divide the rectangle along the x or y axis depending on if is longer or wider. I checked the documentation and I could not find a way to get the length and width of a minimum bounding rectangle. Is there any built in functionality to get the length and width of a rectangle or do i have to create my own? Database is 11gr2.
Thanks
RobRob,
You can use SDO_GEOM.SDO_MIN_MBR_ORDINATE and SDO_GEOM.SDO_MAX_MBR_ORDINATE to compute the length and width of an mbr.
References:
[ SDO_GEOM.SDO_MIN_MBR_ORDINATE | http://docs.oracle.com/cd/E11882_01/appdev.112/e11830/sdo_objgeom.htm#i866250 ]
[ SDO_GEOM.SDO_MAX_MBR_ORDINATE | http://docs.oracle.com/cd/E11882_01/appdev.112/e11830/sdo_objgeom.htm#i866249 ]
Regards,
Noel -
When navigating around my table the focus recatangle is not shown - but the correct cell is selected.
A single click selects a cell, but I need to double click to see the focus triangle.
I would like the focus rectangle to appear when the cell is selected.
Any ideas?Actually I was't thinking clearly when you asked about a "focus rectangle (which is why I always recommend a simple demo program that shows your problem). I thought you where asking about the "dotted line focus rectangle" that appears on components like JButton.
Anyway here is a simple table and not that the "focus rectangle" appears on all cells except the column with boolean values.
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class TableBasic extends JFrame
public TableBasic()
String[] columnNames = {"Date", "String", "Integer", "Boolean"};
Object[][] data =
{new Date(), "A", new Integer(1), Boolean.TRUE },
{new Date(), "B", new Integer(2), Boolean.FALSE},
{new Date(), "C", new Integer(9), Boolean.TRUE },
{new Date(), "D", new Integer(4), Boolean.FALSE}
JTable table = new JTable(data, columnNames)
// Returning the Class of each column will allow different
// renderers to be used based on Class
public Class getColumnClass(int column)
return getValueAt(0, column).getClass();
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
public static void main(String[] args)
TableBasic frame = new TableBasic();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}The default renderer for boolean values uses a JCheckBox to render the value. the check box uses setBorderPainted(false), which is why "focus rectangle" is not painted. Personally, I think this is a bug.
Anyway, if you want the "focus rectangle" then you would need to create your own Boolean renderer, setBorderPainted(true) and provide a default EmptyBorder for the check box:
Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); -
Cropped focus rectangle on Spark VideoPlayer's Play/Pause button
Can anyone help with an issue I am having with a cropped focus rectangle?
The video player is cropping the focus rectangle on the bottom and left of the component. One of my components is audio-only, and that is being cropped at the top too. Images attached.
Maybe I could rectify this by setting the focus rectangle direction inwards, instead of outwards? How would I do that just for this particular component (I definitely wouldn't wan't to change the focus rectangle globally)
Or is there some other fix perhaps?
Should I register this as a bug? If so, where should I do that?This looks like a bug. You can file bug reports here: http://bugs.adobe.com/flex/
-Darrell -
I am working on an application.I have one main screen and three subscreens.Overall i am facing difficulty with subscreens.
My present problems are many.But this forum is intended for below one.
1) How can i increase width of a subscreen ?.I find three of my subscreen though well visible leave reasonable space
twoards right which i feel can be utilized in better way.But i dont know how to increase the width .There is a bug in the forum software that results in multiple threads being posted. It's annoying, but, hey, at least you don't have to tidy it all up. I've just deleted the duplicates.
Now, regarding your complaint on the speed of getting an answer. You do understand that this website is run by people just like yourself. Any answer you get is voluntary, by people wishing to help. You can't demand an answer. You can't expect a fast answer. Sometimes you might be lucky, sometimes you just have to wait until the right person comes along. ( And I did notice that on some of the duplicates at least, you did get answers). You found the answer yourself, within an hour - that's how long it might take for an expert to pick up your question.
Also note that when you mark a question as answered, it's not obligatory to leave a comment.
But thank-you for posting the answer. Not everyone does that. -
Adding Icon and increasing width of tabpages to show the close button in a tabcontrol
I have this code right now,
Public Class FSMTabControl
Inherits TabControl
#Region "Declarations"
Private _TextColour As Color = Color.FromArgb(255, 255, 255)
Private _BackTabColour As Color = Color.FromArgb(54, 54, 54)
Private _BaseColour As Color = Color.FromArgb(35, 35, 35)
Private _ActiveColour As Color = Color.FromArgb(47, 47, 47)
Private _BorderColour As Color = Color.FromArgb(30, 30, 30)
Private _UpLineColour As Color = Color.FromArgb(0, 160, 199)
Private _HorizLineColour As Color = Color.FromArgb(23, 119, 151)
Private CenterSF As New StringFormat With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}
#End Region
#Region "Properties"
<Category("Colours")> _
Public Property BorderColour As Color
Get
Return _BorderColour
End Get
Set(value As Color)
_BorderColour = value
End Set
End Property
<Category("Colours")> _
Public Property UpLineColour As Color
Get
Return _UpLineColour
End Get
Set(value As Color)
_UpLineColour = value
End Set
End Property
<Category("Colours")> _
Public Property HorizontalLineColour As Color
Get
Return _HorizLineColour
End Get
Set(value As Color)
_HorizLineColour = value
End Set
End Property
<Category("Colours")> _
Public Property TextColour As Color
Get
Return _TextColour
End Get
Set(value As Color)
_TextColour = value
End Set
End Property
<Category("Colours")> _
Public Property BackTabColour As Color
Get
Return _BackTabColour
End Get
Set(value As Color)
_BackTabColour = value
End Set
End Property
<Category("Colours")> _
Public Property BaseColour As Color
Get
Return _BaseColour
End Get
Set(value As Color)
_BaseColour = value
End Set
End Property
<Category("Colours")> _
Public Property ActiveColour As Color
Get
Return _ActiveColour
End Get
Set(value As Color)
_ActiveColour = value
End Set
End Property
Protected Overrides Sub CreateHandle()
MyBase.CreateHandle()
Alignment = TabAlignment.Bottom
End Sub
#End Region
#Region "Draw Control"
Sub New()
SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or _
ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer, True)
DoubleBuffered = True
Font = New Font("Segoe UI", 10)
SizeMode = TabSizeMode.FillToRight
ItemSize = New Size(240, 32)
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim g = e.Graphics
With G
.SmoothingMode = SmoothingMode.HighQuality
.PixelOffsetMode = PixelOffsetMode.HighQuality
.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
.Clear(_BaseColour)
Try : SelectedTab.BackColor = _BackTabColour : Catch : End Try
Try : SelectedTab.BorderStyle = BorderStyle.FixedSingle : Catch : End Try
.DrawRectangle(New Pen(_BorderColour, 2), New Rectangle(0, 0, Width, Height))
For i = 0 To TabCount - 1
Dim Base As New Rectangle(New Point(GetTabRect(i).Location.X, GetTabRect(i).Location.Y), New Size(GetTabRect(i).Width, GetTabRect(i).Height))
Dim BaseSize As New Rectangle(Base.Location, New Size(Base.Width, Base.Height))
If i = SelectedIndex Then
.FillRectangle(New SolidBrush(_BaseColour), BaseSize)
.FillRectangle(New SolidBrush(_ActiveColour), New Rectangle(Base.X + 1, Base.Y - 3, Base.Width, Base.Height + 5))
.DrawString(TabPages(i).Text, Font, New SolidBrush(_TextColour), New Rectangle(Base.X + 7, Base.Y, Base.Width - 3, Base.Height), CenterSF)
.DrawLine(New Pen(_HorizLineColour, 2), New Point(Base.X + 3, CInt(Base.Height / 2 + 2)), New Point(Base.X + 9, CInt(Base.Height / 2 + 2)))
.DrawLine(New Pen(_UpLineColour, 2), New Point(Base.X + 3, Base.Y - 3), New Point(Base.X + 3, Base.Height + 5))
Else
.DrawString(TabPages(i).Text, Font, New SolidBrush(_TextColour), BaseSize, CenterSF)
End If
Next
.InterpolationMode = InterpolationMode.HighQualityBicubic
End With
End Sub
Private Declare Auto Function SetParent Lib "user32" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
Protected CloseButtonCollection As New Dictionary(Of Button, TabPage)
Private _ShowCloseButtonOnTabs As Boolean = True
<Browsable(True), DefaultValue(True), Category("Behavior"), Description("Indicates whether a close button should be shown on each TabPage")> _
Public Property ShowCloseButtonOnTabs() As Boolean
Get
Return _ShowCloseButtonOnTabs
End Get
Set(ByVal value As Boolean)
_ShowCloseButtonOnTabs = value
For Each btn In CloseButtonCollection.Keys
btn.Visible = _ShowCloseButtonOnTabs
Next
RePositionCloseButtons()
End Set
End Property
Protected Overrides Sub OnCreateControl()
MyBase.OnCreateControl()
RePositionCloseButtons()
End Sub
Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
MyBase.OnControlAdded(e)
Dim tp As TabPage = DirectCast(e.Control, TabPage)
Dim rect As Rectangle = Me.GetTabRect(Me.TabPages.IndexOf(tp))
Dim btn As Button = AddCloseButton(tp)
btn.Size = New Size(CInt(rect.Height / 2), CInt(rect.Height / 2))
btn.Location = New Point(rect.X + rect.Width - rect.Height + 11, CInt(rect.Y + 7))
SetParent(btn.Handle, Me.Handle)
AddHandler btn.Click, AddressOf OnCloseButtonClick
CloseButtonCollection.Add(btn, tp)
End Sub
Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs)
Dim btn As Button = CloseButtonOfTabPage(DirectCast(e.Control, TabPage))
RemoveHandler btn.Click, AddressOf OnCloseButtonClick
CloseButtonCollection.Remove(btn)
SetParent(btn.Handle, Nothing)
btn.Dispose()
MyBase.OnControlRemoved(e)
End Sub
Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)
MyBase.OnLayout(levent)
RePositionCloseButtons()
End Sub
Public Event CloseButtonClick As CancelEventHandler
Protected Overridable Sub OnCloseButtonClick(ByVal sender As Object, ByVal e As EventArgs)
If Not DesignMode Then
Dim btn As Button = DirectCast(sender, Button)
Dim tp As TabPage = CloseButtonCollection(btn)
Dim ee As New CancelEventArgs
RaiseEvent CloseButtonClick(sender, ee)
If Not ee.Cancel Then
Me.TabPages.Remove(tp)
RePositionCloseButtons()
End If
End If
End Sub
Protected Overridable Function AddCloseButton(ByVal tp As TabPage) As Button
Dim closeButton As New Button
With closeButton
'' TODO: Give a good visual appearance to the Close button, maybe by assigning images etc.
'' Here I have not used images to keep things simple.
.Text = "X"
.FlatStyle = FlatStyle.Flat
.BackColor = _BaseColour
.ForeColor = Color.White
.Font = New Font("Microsoft Sans Serif", 6, FontStyle.Bold)
End With
Return closeButton
End Function
Public Sub RePositionCloseButtons()
For Each item In CloseButtonCollection
RePositionCloseButtons(item.Value)
Next
End Sub
Public Sub RePositionCloseButtons(ByVal tp As TabPage)
Dim btn As Button = CloseButtonOfTabPage(tp)
If btn IsNot Nothing Then
Dim tpIndex As Integer = Me.TabPages.IndexOf(tp)
If tpIndex >= 0 Then
Dim rect As Rectangle = Me.GetTabRect(tpIndex)
If Me.SelectedTab Is tp Then
btn.BackColor = Color.Red
btn.Size = New Size(CInt(rect.Height / 2), CInt(rect.Height / 2))
btn.Location = New Point(rect.X + rect.Width - rect.Height + 11, CInt(rect.Y + 7))
Else
btn.BackColor = _BaseColour
btn.Size = New Size(CInt(rect.Height / 2), CInt(rect.Height / 2))
btn.Location = New Point(rect.X + rect.Width - rect.Height + 11, CInt(rect.Y + 7))
End If
btn.Visible = ShowCloseButtonOnTabs
btn.BringToFront()
End If
End If
End Sub
Protected Function CloseButtonOfTabPage(ByVal tp As TabPage) As Button
Return (From item In CloseButtonCollection Where item.Value Is tp Select item.Key).FirstOrDefault
End Function
#End Region
End Class
This code shows a perfect tabcontrol as in the picture below,
I managed to get this code working by combining three other VB themes I found. Right now, I just want to increase the width of the tab so the close button doesn't hides the text. And I want to add a icon to the left of the tab and be able to change it on
runtime.
The icons name will be on, off, 1, 2, plus .ico
Is it possible ? and is it possible to make the tabs curved at the corner like in chrome.Hi,
I have went through your TabControl class and changed it around a little bit to get something similar to what i think you want. I made it so that the Tabs are resized with the TabControl itself so that they always fill the width of the TabControl.
I also, made the Text of the tabs have its own rectangle which will automatically adjust it`s width according to weather or not the close buttons are shown so the text will never be under the buttons.
As for the Icons, you could create another small class that inherits from the TabPage base class and add a public property to it for the Icon image. You would have to use that class to add TabPages and set the Icon property. Then in the
TabControl class`s OnPaint overrides sub you would check if the Icon property of the TabPage is set and draw the image if it is.
I didn`t go that far but, i used the TabPage`s Tag property for the Icon image. Actually it is just an Image, not an Icon. So, in the TabControl`s OnPaint overrides sub i check if the TabPage`s Tag property is set to an Image and if it
is i adjust the Text rectangle to avoid the Image and draw the image.
I moved the StringFormat to the OnPaint sub and set it to keep the text left aligned so it stayed next to the Image. You can change it back to the Center if you want. I also set the StringFormat trimming to EllipsisCharacter so it will
cut the text off if it is to long to fit between the Image and the Close button.
You can test it in a new form project first and to check out how it works and what i changed.
Imports System.ComponentModel
Imports System.Drawing.Drawing2D
Imports System.Drawing.Text
Public Class FSMTabControl
Inherits TabControl
#Region "Declarations"
Private _TextColour As Color = Color.FromArgb(255, 255, 255)
Private _BackTabColour As Color = Color.FromArgb(54, 54, 54)
Private _BaseColour As Color = Color.FromArgb(35, 35, 35)
Private _ActiveColour As Color = Color.FromArgb(47, 47, 47)
Private _BorderColour As Color = Color.FromArgb(30, 30, 30)
Private _UpLineColour As Color = Color.FromArgb(0, 160, 199)
Private _HorizLineColour As Color = Color.FromArgb(23, 119, 151)
#End Region
#Region "Properties"
<Category("Colours")> _
Public Property BorderColour() As Color
Get
Return _BorderColour
End Get
Set(ByVal value As Color)
_BorderColour = value
End Set
End Property
<Category("Colours")> _
Public Property UpLineColour() As Color
Get
Return _UpLineColour
End Get
Set(ByVal value As Color)
_UpLineColour = value
End Set
End Property
<Category("Colours")> _
Public Property HorizontalLineColour() As Color
Get
Return _HorizLineColour
End Get
Set(ByVal value As Color)
_HorizLineColour = value
End Set
End Property
<Category("Colours")> _
Public Property TextColour() As Color
Get
Return _TextColour
End Get
Set(ByVal value As Color)
_TextColour = value
End Set
End Property
<Category("Colours")> _
Public Property BackTabColour() As Color
Get
Return _BackTabColour
End Get
Set(ByVal value As Color)
_BackTabColour = value
End Set
End Property
<Category("Colours")> _
Public Property BaseColour() As Color
Get
Return _BaseColour
End Get
Set(ByVal value As Color)
_BaseColour = value
End Set
End Property
<Category("Colours")> _
Public Property ActiveColour() As Color
Get
Return _ActiveColour
End Get
Set(ByVal value As Color)
_ActiveColour = value
End Set
End Property
Protected Overrides Sub CreateHandle()
MyBase.CreateHandle()
Alignment = TabAlignment.Bottom
End Sub
#End Region
#Region "Draw Control"
Sub New()
SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer, True)
DoubleBuffered = True
Font = New Font("Segoe UI", 10)
SizeMode = TabSizeMode.Fixed
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
With e.Graphics
.SmoothingMode = SmoothingMode.HighQuality
.PixelOffsetMode = PixelOffsetMode.HighQuality
.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
.Clear(_BaseColour)
Try : SelectedTab.BackColor = _BackTabColour : Catch : End Try
Try : SelectedTab.BorderStyle = BorderStyle.FixedSingle : Catch : End Try
.DrawRectangle(New Pen(_BorderColour, 2), New Rectangle(0, 0, Width, Height))
If Me.Created AndAlso Me.TabCount > 0 Then
Dim tw As Integer = CInt(Me.ClientSize.Width / Me.TabCount)
Dim offset As Integer = Me.TabCount
If Me.ItemSize.Width <> tw - offset Then Me.ItemSize = New Size(tw - offset, 32)
End If
Using CenterSF As New StringFormat With {.Alignment = StringAlignment.Near, .LineAlignment = StringAlignment.Center, .Trimming = StringTrimming.EllipsisCharacter, .FormatFlags = StringFormatFlags.NoWrap}
For i As Integer = 0 To TabCount - 1
Dim Base As Rectangle = Me.GetTabRect(i)
Dim txtrect As New Rectangle(Base.Left, Base.Top, Base.Width, Base.Height)
Dim img As Image = Nothing
If Me.TabPages(i).Tag IsNot Nothing Then
txtrect.X += Base.Height
txtrect.Width -= Base.Height
img = DirectCast(Me.TabPages(i).Tag, Image)
End If
If ShowCloseButtonOnTabs Then
txtrect.Width -= Base.Height
End If
If i = SelectedIndex Then
.FillRectangle(New SolidBrush(_BaseColour), Base)
.FillRectangle(New SolidBrush(_ActiveColour), New Rectangle(Base.X + 1, Base.Y - 3, Base.Width, Base.Height + 4))
.DrawString(TabPages(i).Text, Font, New SolidBrush(_TextColour), txtrect, CenterSF)
.DrawLine(New Pen(_HorizLineColour, 2), New Point(Base.X + 3, CInt(Base.Height / 2 + 2)), New Point(Base.X + 9, CInt(Base.Height / 2 + 2)))
.DrawLine(New Pen(_UpLineColour, 2), New Point(Base.X + 3, Base.Y - 3), New Point(Base.X + 3, Base.Height + 5))
Else
.DrawString(TabPages(i).Text, Font, New SolidBrush(_TextColour), txtrect, CenterSF)
End If
If img IsNot Nothing Then
.DrawImage(img, Base.Left + 2, Base.Top + 2, Base.Height - 4, Base.Height - 4)
End If
Next
End Using
.InterpolationMode = InterpolationMode.HighQualityBicubic
End With
End Sub
Private Declare Auto Function SetParent Lib "user32" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
Protected CloseButtonCollection As New Dictionary(Of Button, TabPage)
Private _ShowCloseButtonOnTabs As Boolean = True
<Browsable(True), DefaultValue(True), Category("Behavior"), Description("Indicates whether a close button should be shown on each TabPage")> _
Public Property ShowCloseButtonOnTabs() As Boolean
Get
Return _ShowCloseButtonOnTabs
End Get
Set(ByVal value As Boolean)
_ShowCloseButtonOnTabs = value
For Each btn As Button In CloseButtonCollection.Keys
btn.Visible = _ShowCloseButtonOnTabs
Next
RePositionCloseButtons()
Me.Refresh()
End Set
End Property
Protected Overrides Sub OnCreateControl()
MyBase.OnCreateControl()
RePositionCloseButtons()
End Sub
Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)
MyBase.OnControlAdded(e)
Dim tp As TabPage = DirectCast(e.Control, TabPage)
Dim rect As Rectangle = Me.GetTabRect(Me.TabPages.IndexOf(tp))
Dim btn As Button = AddCloseButton(tp)
btn.Size = New Size(CInt(rect.Height / 2), CInt(rect.Height / 2))
btn.Location = New Point(rect.X + rect.Width - rect.Height + 11, CInt(rect.Y + 7))
SetParent(btn.Handle, Me.Handle)
AddHandler btn.Click, AddressOf OnCloseButtonClick
'ResizeTabs()
CloseButtonCollection.Add(btn, tp)
End Sub
Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs)
Dim btn As Button = CloseButtonOfTabPage(DirectCast(e.Control, TabPage))
RemoveHandler btn.Click, AddressOf OnCloseButtonClick
CloseButtonCollection.Remove(btn)
SetParent(btn.Handle, Nothing)
btn.Dispose()
MyBase.OnControlRemoved(e)
'ResizeTabs()
End Sub
Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)
MyBase.OnLayout(levent)
RePositionCloseButtons()
End Sub
Public Event CloseButtonClick As CancelEventHandler
Protected Overridable Sub OnCloseButtonClick(ByVal sender As Object, ByVal e As EventArgs)
If Not DesignMode Then
Dim btn As Button = DirectCast(sender, Button)
Dim tp As TabPage = CloseButtonCollection(btn)
Dim ee As New CancelEventArgs
RaiseEvent CloseButtonClick(sender, ee)
If Not ee.Cancel Then
Me.TabPages.Remove(tp)
RePositionCloseButtons()
End If
End If
End Sub
Protected Overridable Function AddCloseButton(ByVal tp As TabPage) As Button
Dim closeButton As New Button
With closeButton
'' TODO: Give a good visual appearance to the Close button, maybe by assigning images etc.
'' Here I have not used images to keep things simple.
.Text = "X"
.FlatStyle = FlatStyle.Flat
.BackColor = _BaseColour
.ForeColor = Color.White
.Font = New Font("Microsoft Sans Serif", 6, FontStyle.Bold)
End With
Return closeButton
End Function
Public Sub RePositionCloseButtons()
For Each item As KeyValuePair(Of Button, TabPage) In CloseButtonCollection
RePositionCloseButtons(item.Value)
Next
End Sub
Public Sub RePositionCloseButtons(ByVal tp As TabPage)
Dim btn As Button = CloseButtonOfTabPage(tp)
If btn IsNot Nothing Then
Dim tpIndex As Integer = Me.TabPages.IndexOf(tp)
If tpIndex >= 0 Then
Dim rect As Rectangle = Me.GetTabRect(tpIndex)
If Me.SelectedTab Is tp Then
btn.BackColor = Color.Red
btn.Size = New Size(CInt(rect.Height / 2), CInt(rect.Height / 2))
btn.Location = New Point(rect.Right - rect.Height + 11, CInt(rect.Y + 7))
Else
btn.BackColor = _BaseColour
btn.Size = New Size(CInt(rect.Height / 2), CInt(rect.Height / 2))
btn.Location = New Point(rect.Right - rect.Height + 11, CInt(rect.Y + 7))
End If
btn.Visible = ShowCloseButtonOnTabs
btn.BringToFront()
End If
End If
End Sub
Protected Function CloseButtonOfTabPage(ByVal tp As TabPage) As Button
Return (From item In CloseButtonCollection Where item.Value Is tp Select item.Key).FirstOrDefault
End Function
#End Region
End Class
In the Form`s code you can set the images for the TabPage icons like this.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.TabPage1.Tag = Image.FromFile("C:\testfolder\img1.png")
Me.TabPage2.Tag = Image.FromFile("C:\testfolder\img2.png")
End Sub
End Class
Here is an example of what it looks like.
If you say it can`t be done then i`ll try it
Thanks :)) I tried you code and it works perfectly.
Though i don't want the tabs have their width's by the size of form, so i fixed a width,
If Me.Created AndAlso Me.TabCount > 0 Then
'Dim tw As Integer = CInt(Me.ClientSize.Width / Me.TabCount)
'Dim offset As Integer = Me.TabCount
'If Me.ItemSize.Width <> tw - offset Then Me.ItemSize = New Size(tw - offset, 32)
Me.ItemSize = New Size(200, 32)
End If
Here is the screenshot,
I just don't know why the arrows (left and right) aren't full. here is a gif,
Why is that :O Should I paint the arrows as well ?
Maybe you are looking for
-
How to consume a ABAP webservice in a webdynpro app?
Hi, I have a BAPI in ABAP that is exposed as a webservice. I want to use this to build a webdynpro app so that i can consume this webservice. This BAPI returns the Employee data. As soon as the person logs into the portal i am going to pass his login
-
Using an external hard drive with an airport extreme and HP computer
- I recently bought the airport extreme, and also bought a Seagate external hard drive for my music files. I can see the hard drive on the airport utility but cannot access it or find where to access it. I am using an HP computer with windows 7. He
-
I need two different access rights to a same user. One when he signs on to the application using forms and another when he sign on using SQL*PLUS. Is there a way to do this??
-
Since updating to iOS 8, My phone doesn't appear in My Computer in Windows (7) as before. This used to be the quick way to get photos off an iphone...has iOS 8 taken away this capability? Is itunes the only way to get photos off the iphone now (unles
-
Query Creation directly in Production
RSA1-->Transport Connection Choose the 'Bex Changeability' icon at the top right screen; in the popup set 'Everything changeable' for query elements.