C#仿QQ皮肤-Label与ListBox 控件实现----寻求滚动条的解决方案

C#仿QQ皮肤-实现原理系列文章导航
http://www.cnblogs.com/sufei/archive/2010/03/10/1682847.html

大家还是先来看看效果吧

这次之所以一次写两个控件,其实主要是因为Label控件实在是太简单了没有必要放放一个文章里写,所以就一次性来了。

Label控件我就不再多说了,我直接把代码贴一下吧因为就几行代码,相信大家一眼就能看明白了。

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> using System;
using System.Collections.Generic;

using System.Text;

namespace CRD.WinUI.Misc
{
public class Label:System.Windows.Forms.Label
{
public Label()
:
base ()
{
this .BackColor = System.Drawing.Color.Transparent;
}
}
}

ListBox实现


咱们从第一行代码就要吧看出来是继承自系统控件而来的。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public class ListBox:System.Windows.Forms.ListBox

所以本身就具备了系统的ListBox的一些特性。老方法我们先来看看WndProc方法的实现

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> protected override void WndProc( ref System.Windows.Forms.Messagem)
{
IntPtrhDC
= IntPtr.Zero;
Graphicsgdc
= null ;

switch (m.Msg)
{
case 133 :
hDC
= Win32.GetWindowDC(m.HWnd);
gdc
= Graphics.FromHdc(hDC);
Win32.SendMessage(
this .Handle,WM_ERASEBKGND,hDC.ToInt32(), 0 );
SendPrintClientMsg();
Win32.SendMessage(
this .Handle,WM_PAINT, 0 , 0 );
OverrideControlBorder(gdc);
m.Result
= (IntPtr) 1 ;
Win32.ReleaseDC(m.HWnd,hDC);
gdc.Dispose();
break ;
case WM_PAINT:
base .WndProc( ref m);
hDC
= Win32.GetWindowDC(m.HWnd);
gdc
= Graphics.FromHdc(hDC);
OverrideControlBorder(gdc);
Win32.ReleaseDC(m.HWnd,hDC);
gdc.Dispose();
break ;
default :
base .WndProc( ref m);
break ;
}
}

这边的实现方法基本上和之前的控件一个样,所以我就不再多说原理了,大家随便看一下前几次的文章就明白了。

下面我们来看一下怎么样换皮肤的事件

也就是说在换皮肤的时候我们应该做那些工作

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> protected override void OnDrawItem(DrawItemEventArgse)
{
Graphicsg
= e.Graphics;
// 绘制区域
Rectangler = e.Bounds;

Fontfn
= null ;
if (e.Index >= 0 )
{
if (e.State == DrawItemState.None)
{
// 设置字体、字符串格式、对齐方式
fn = e.Font;
string s = ( string ) this .Items[e.Index];
StringFormatsf
= new StringFormat();
sf.Alignment
= StringAlignment.Near;
// 根据不同的状态用不同的颜色表示
if (e.State == (DrawItemState.NoAccelerator | DrawItemState.NoFocusRect))
{
e.Graphics.FillRectangle(
new SolidBrush(Color.Red),r);
e.Graphics.DrawString(s,fn,
new SolidBrush(Color.Black),r,sf);
e.DrawFocusRectangle();
}
else
{
e.Graphics.FillRectangle(
new SolidBrush(Color.White),r);
e.Graphics.DrawString(s,fn,
new SolidBrush(Shared.FontColor),r,sf);
e.DrawFocusRectangle();
}
}
else
{
fn
= e.Font;
StringFormatsf
= new StringFormat();
sf.Alignment
= StringAlignment.Near;
string s = ( string ) this .Items[e.Index];
e.Graphics.FillRectangle(
new SolidBrush(Shared.ControlBackColor),r);
e.Graphics.DrawString(s,fn,
new SolidBrush(Shared.FontColor),r,sf);
}
}
}

其实这些都不是今天要说的重点,这个控件的实现基础跟之前的一些控件基本上是一样的,像Textbox就和这个差不多,

唯一我想说的是滚动条的实现,不多说了下面开始吧

滚动条的实现


如上面的图片大家已经看到了,图片在我的源代码里都有,我在这里就不多说了,一起来看是怎么实现 的吧,先说说思路,

第一步,先制做一个自己的滚动条,随便做只要自己感觉漂亮就可以,第二步就是,利用Api把Listbox现有的滚动条用现在的滚动条代替,第三步,让现有的滚动条和系统的滚动条实现同步即可。

我实现滚动条的代码,大家也可以自己写这里只是一个参考吧

看一下效果

看一下代码吧,具体的素材大家到我源代码里面找吧,呵呵

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;

using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Diagnostics;

namespace CRD.WinUI.Misc
{
[Designer(
typeof (ScrollbarControlDesigner))]
public partial class CustomScrollbar:UserControl
{

protected ColormoChannelColor = Color.Empty;
protected ImagemoUpArrowImage = null ; // 上箭头
// protectedImagemoUpArrowImage_Over=null;
// protectedImagemoUpArrowImage_Down=null;
protected ImagemoDownArrowImage = null ; // 下箭头
// protectedImagemoDownArrowImage_Over=null;
// protectedImagemoDownArrowImage_Down=null;
protected ImagemoThumbArrowImage = null ;

protected ImagemoThumbTopImage = null ;
protected ImagemoThumbTopSpanImage = null ;
protected ImagemoThumbBottomImage = null ;
protected ImagemoThumbBottomSpanImage = null ;
protected ImagemoThumbMiddleImage = null ;

protected int moLargeChange = 10 ;
protected int moSmallChange = 1 ;
protected int moMinimum = 0 ;
protected int moMaximum = 100 ;
protected int moValue = 0 ;
private int nClickPoint;

protected int moThumbTop = 0 ;

protected bool moAutoSize = false ;

private bool moThumbDown = false ;
private bool moThumbDragging = false ;

public new event EventHandlerScroll = null ;
public event EventHandlerValueChanged = null ;

private int GetThumbHeight()
{
int nTrackHeight = ( this .Height - (UpArrowImage.Height + DownArrowImage.Height));
float fThumbHeight = (( float )LargeChange / ( float )Maximum) * nTrackHeight;
int nThumbHeight = ( int )fThumbHeight;

if (nThumbHeight > nTrackHeight)
{
nThumbHeight
= nTrackHeight;
fThumbHeight
= nTrackHeight;
}
if (nThumbHeight < 56 )
{
nThumbHeight
= 56 ;
fThumbHeight
= 56 ;
}

return nThumbHeight;
}

public CustomScrollbar()
{

InitializeComponent();
SetStyle(ControlStyles.ResizeRedraw,
true );
SetStyle(ControlStyles.AllPaintingInWmPaint,
true );
SetStyle(ControlStyles.DoubleBuffer,
true );

moChannelColor
= Color.FromArgb( 51 , 166 , 3 );
UpArrowImage
= Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream( " CRD.WinUI.Resources.Common.scroll.uparrow.png " ), true , false ); // BASSSkin.uparrow; // 上箭头
DownArrowImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream( " CRD.WinUI.Resources.Common.scroll.downarrow.png " ), true , false ); // BASSSkin.downarrow; // 下肩头
ThumbBottomImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream( " CRD.WinUI.Resources.Common.scroll.ThumbBottom.png " ), true , false ); // BASSSkin.ThumbBottom;
ThumbMiddleImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream( " CRD.WinUI.Resources.Common.scroll.ThumbMiddle.png " ), true , false ); // BASSSkin.ThumbMiddle;

this .Width = UpArrowImage.Width; // 18px
base .MinimumSize = new Size(UpArrowImage.Width,UpArrowImage.Height + DownArrowImage.Height + GetThumbHeight());
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Behavior " ),Description( " LargeChange " )]
public int LargeChange
{
get { return moLargeChange;}
set
{
moLargeChange
= value;
Invalidate();
}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Behavior " ),Description( " SmallChange " )]
public int SmallChange
{
get { return moSmallChange;}
set
{
moSmallChange
= value;
Invalidate();
}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Behavior " ),Description( " Minimum " )]
public int Minimum
{
get { return moMinimum;}
set
{
moMinimum
= value;
Invalidate();
}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Behavior " ),Description( " Maximum " )]
public int Maximum
{
get { return moMaximum;}
set
{
moMaximum
= value;
Invalidate();
}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Behavior " ),Description( " Value " )]
public int Value
{
get { return moValue;}
set
{
moValue
= value;

int nTrackHeight = ( this .Height - (UpArrowImage.Height + DownArrowImage.Height));
float fThumbHeight = (( float )LargeChange / ( float )Maximum) * nTrackHeight;
int nThumbHeight = ( int )fThumbHeight;

if (nThumbHeight > nTrackHeight)
{
nThumbHeight
= nTrackHeight;
fThumbHeight
= nTrackHeight;
}
if (nThumbHeight < 56 )
{
nThumbHeight
= 56 ;
fThumbHeight
= 56 ;
}

// figureoutvalue
int nPixelRange = nTrackHeight - nThumbHeight;
int nRealRange = (Maximum - Minimum) - LargeChange;
float fPerc = 0.0f ;
if (nRealRange != 0 )
{
fPerc
= ( float )moValue / ( float )nRealRange;

}

float fTop = fPerc * nPixelRange;
moThumbTop
= ( int )fTop;


Invalidate();
}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Skin " ),Description( " ChannelColor " )]
public ColorChannelColor
{
get { return moChannelColor;}
set {moChannelColor = value;}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Skin " ),Description( " UpArrowGraphic " )]
public ImageUpArrowImage
{
get { return moUpArrowImage;}
set {moUpArrowImage = value;}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Skin " ),Description( " UpArrowGraphic " )]
public ImageDownArrowImage
{
get { return moDownArrowImage;}
set {moDownArrowImage = value;}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Skin " ),Description( " UpArrowGraphic " )]
public ImageThumbBottomImage
{
get { return moThumbBottomImage;}
set {moThumbBottomImage = value;}
}

[EditorBrowsable(EditorBrowsableState.Always),Browsable(
true ),DefaultValue( false ),Category( " Skin " ),Description( " UpArrowGraphic " )]
public ImageThumbMiddleImage
{
get { return moThumbMiddleImage;}
set {moThumbMiddleImage = value;}
}

protected override void OnPaint(PaintEventArgse)
{

e.Graphics.InterpolationMode
= System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;

if (UpArrowImage != null )
{
e.Graphics.DrawImage(UpArrowImage,
new Rectangle( new Point( 0 , 0 ), new Size( this .Width,UpArrowImage.Height)));
}

BrushoBrush
= new SolidBrush(moChannelColor);
BrushoWhiteBrush
= new SolidBrush(Color.FromArgb( 255 , 255 , 255 ));
// 函数名:rectangle
// 功能:画一个矩形
// 用法:voidfarrectangle(intleft,inttop,intright,intbottom);

// drawchannelleftandrightbordercolors
e.Graphics.FillRectangle(oWhiteBrush, new Rectangle( 0 ,UpArrowImage.Height, 1 ,( this .Height - DownArrowImage.Height)));
e.Graphics.FillRectangle(oWhiteBrush,
new Rectangle( this .Width - 1 ,UpArrowImage.Height, 1 ,( this .Height - DownArrowImage.Height)));

// drawchannel
// e.Graphics.FillRectangle(oBrush,newRectangle(1,UpArrowImage.Height,this.Width-2,(this.Height-DownArrowImage.Height)));
e.Graphics.DrawImage(ThumbBottomImage, new Rectangle( 0 ,UpArrowImage.Height, this .Width,( this .Height - DownArrowImage.Height)));
// drawthumb
int nTrackHeight = ( this .Height - (UpArrowImage.Height + DownArrowImage.Height));
float fThumbHeight = (( float )LargeChange / ( float )Maximum) * nTrackHeight;
int nThumbHeight = ( int )fThumbHeight;

if (nThumbHeight > nTrackHeight)
{
nThumbHeight
= nTrackHeight;
fThumbHeight
= nTrackHeight;
}
// MessageBox.Show(nThumbHeight.ToString());
if (nThumbHeight < 56 )
{
nThumbHeight
= 56 ;
fThumbHeight
= 56 ;
}

// Debug.WriteLine(nThumbHeight.ToString());

// floatfSpanHeight=(fThumbHeight-(ThumbMiddleImage.Height+ThumbTopImage.Height+ThumbBottomImage.Height))/2.0f;
// intnSpanHeight=(int)fSpanHeight;

int nTop = moThumbTop; // 0
nTop += UpArrowImage.Height; // 9px

// drawtop画上面的按钮
// e.Graphics.DrawImage(ThumbTopImage,newRectangle(0,nTop,this.Width,ThumbTopImage.Height));

// nTop+=ThumbTopImage.Height; // 10px
// drawtopspan
// Rectanglerect=newRectangle(1,nTop,this.Width-2,nSpanHeight);


// e.Graphics.DrawImage(ThumbTopSpanImage,1.0f,(float)nTop,(float)this.Width-2.0f,(float)fSpanHeight*2);

// nTop+=nSpanHeight; // 11px
// drawmiddle
e.Graphics.DrawImage(ThumbMiddleImage, new Rectangle( 0 ,nTop, this .Width,ThumbMiddleImage.Height));


// nTop+=ThumbMiddleImage.Height;
// drawtopspan
// rect=newRectangle(1,nTop,this.Width-2,nSpanHeight*2);
// e.Graphics.DrawImage(ThumbBottomSpanImage,rect);

// nTop+=nSpanHeight;
// drawbottom
// e.Graphics.DrawImage(ThumbBottomImage,newRectangle(1,nTop,this.Width-2,nSpanHeight));

if (DownArrowImage != null )
{
e.Graphics.DrawImage(DownArrowImage,
new Rectangle( new Point( 0 ,( this .Height - DownArrowImage.Height)), new Size( this .Width,DownArrowImage.Height)));
}

}

public override bool AutoSize
{
get
{
return base .AutoSize;
}
set
{
base .AutoSize = value;
if ( base .AutoSize)
{
this .Width = moUpArrowImage.Width;
}
}
}

private void InitializeComponent()
{
this .SuspendLayout();
//
// CustomScrollbar
//
this .Name = " CustomScrollbar " ;
this .MouseDown += new System.Windows.Forms.MouseEventHandler( this .CustomScrollbar_MouseDown);
this .MouseMove += new System.Windows.Forms.MouseEventHandler( this .CustomScrollbar_MouseMove);
this .MouseUp += new System.Windows.Forms.MouseEventHandler( this .CustomScrollbar_MouseUp);
this .ResumeLayout( false );

}

private void CustomScrollbar_MouseDown( object sender,MouseEventArgse)
{
PointptPoint
= this .PointToClient(Cursor.Position);
int nTrackHeight = ( this .Height - (UpArrowImage.Height + DownArrowImage.Height));
float fThumbHeight = (( float )LargeChange / ( float )Maximum) * nTrackHeight;
int nThumbHeight = ( int )fThumbHeight;

if (nThumbHeight > nTrackHeight)
{
nThumbHeight
= nTrackHeight;
fThumbHeight
= nTrackHeight;
}
if (nThumbHeight < 56 )
{
nThumbHeight
= 56 ;
fThumbHeight
= 56 ;
}

int nTop = moThumbTop;
nTop
+= UpArrowImage.Height;


Rectanglethumbrect
= new Rectangle( new Point( 1 ,nTop), new Size(ThumbMiddleImage.Width,nThumbHeight));
if (thumbrect.Contains(ptPoint))
{

// hitthethumb
nClickPoint = (ptPoint.Y - nTop);
// MessageBox.Show(Convert.ToString((ptPoint.Y-nTop)));
this .moThumbDown = true ;
}

Rectangleuparrowrect
= new Rectangle( new Point( 1 , 0 ), new Size(UpArrowImage.Width,UpArrowImage.Height));
if (uparrowrect.Contains(ptPoint))
{

int nRealRange = (Maximum - Minimum) - LargeChange;
int nPixelRange = (nTrackHeight - nThumbHeight);
if (nRealRange > 0 )
{
if (nPixelRange > 0 )
{
if ((moThumbTop - SmallChange) < 0 )
moThumbTop
= 0 ;
else
moThumbTop
-= SmallChange;

// figureoutvalue
float fPerc = ( float )moThumbTop / ( float )nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);

moValue
= ( int )fValue;
Debug.WriteLine(moValue.ToString());

if (ValueChanged != null )
ValueChanged(
this , new EventArgs());

if (Scroll != null )
Scroll(
this , new EventArgs());

Invalidate();
}
}
}

Rectangledownarrowrect
= new Rectangle( new Point( 1 ,UpArrowImage.Height + nTrackHeight), new Size(UpArrowImage.Width,UpArrowImage.Height));
if (downarrowrect.Contains(ptPoint))
{
int nRealRange = (Maximum - Minimum) - LargeChange;
int nPixelRange = (nTrackHeight - nThumbHeight);
if (nRealRange > 0 )
{
if (nPixelRange > 0 )
{
if ((moThumbTop + SmallChange) > nPixelRange)
moThumbTop
= nPixelRange;
else
moThumbTop
+= SmallChange;

// figureoutvalue
float fPerc = ( float )moThumbTop / ( float )nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);

moValue
= ( int )fValue;
Debug.WriteLine(moValue.ToString());

if (ValueChanged != null )
ValueChanged(
this , new EventArgs());

if (Scroll != null )
Scroll(
this , new EventArgs());

Invalidate();
}
}
}
}

private void CustomScrollbar_MouseUp( object sender,MouseEventArgse)
{
this .moThumbDown = false ;
this .moThumbDragging = false ;
}

private void MoveThumb( int y)
{
int nRealRange = Maximum - Minimum;
int nTrackHeight = ( this .Height - (UpArrowImage.Height + DownArrowImage.Height));
float fThumbHeight = (( float )LargeChange / ( float )Maximum) * nTrackHeight;
int nThumbHeight = ( int )fThumbHeight;

if (nThumbHeight > nTrackHeight)
{
nThumbHeight
= nTrackHeight;
fThumbHeight
= nTrackHeight;
}
if (nThumbHeight < 56 )
{
nThumbHeight
= 56 ;
fThumbHeight
= 56 ;
}

int nSpot = nClickPoint;

int nPixelRange = (nTrackHeight - nThumbHeight);
if (moThumbDown && nRealRange > 0 )
{
if (nPixelRange > 0 )
{
int nNewThumbTop = y - (UpArrowImage.Height + nSpot);

if (nNewThumbTop < 0 )
{
moThumbTop
= nNewThumbTop = 0 ;
}
else if (nNewThumbTop > nPixelRange)
{
moThumbTop
= nNewThumbTop = nPixelRange;
}
else
{
moThumbTop
= y - (UpArrowImage.Height + nSpot);
}

// figureoutvalue
float fPerc = ( float )moThumbTop / ( float )nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);
moValue
= ( int )fValue;
Debug.WriteLine(moValue.ToString());

Application.DoEvents();

Invalidate();
}
}
}

private void CustomScrollbar_MouseMove( object sender,MouseEventArgse)
{
if (moThumbDown == true )
{
this .moThumbDragging = true ;
}

if ( this .moThumbDragging)
{

MoveThumb(e.Y);
}

if (ValueChanged != null )
ValueChanged(
this , new EventArgs());

if (Scroll != null )
Scroll(
this , new EventArgs());
}

}

internal class ScrollbarControlDesigner:System.Windows.Forms.Design.ControlDesigner
{
public override SelectionRulesSelectionRules
{
get
{
SelectionRulesselectionRules
= base .SelectionRules;
PropertyDescriptorpropDescriptor
= TypeDescriptor.GetProperties( this .Component)[ " AutoSize " ];
if (propDescriptor != null )
{
bool autoSize = ( bool )propDescriptor.GetValue( this .Component);
if (autoSize)
{
selectionRules
= SelectionRules.Visible | SelectionRules.Moveable | SelectionRules.BottomSizeable | SelectionRules.TopSizeable;
}
else
{
selectionRules
= SelectionRules.Visible | SelectionRules.AllSizeable | SelectionRules.Moveable;
}
}
return selectionRules;
}
}
}
}


关于一些Api的方法吧,我都定义出来了直接用就行了

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public class Win32API
{
[StructLayout(LayoutKind.Sequential)]
public struct tagSCROLLINFO
{
public uint cbSize;
public uint fMask;
public int nMin;
public int nMax;
public uint nPage;
public int nPos;
public int nTrackPos;
}

public enum fnBar
{
SB_HORZ
= 0 ,
SB_VERT
= 1 ,
SB_CTL
= 2
}
public enum fMask
{
SIF_ALL,
SIF_DISABLENOSCROLL
= 0X0010 ,
SIF_PAGE
= 0X0002 ,
SIF_POS
= 0X0004 ,
SIF_RANGE
= 0X0001 ,
SIF_TRACKPOS
= 0X0008
}

public static int MakeLong( short lowPart, short highPart)
{
return ( int )((( ushort )lowPart) | ( uint )(highPart << 16 ));
}
public const int SB_THUMBTRACK = 5 ;
public const int WM_HSCROLL = 0x114 ;
public const int WM_VSCROLL = 0x115 ;
[DllImport(
" user32.dll " ,EntryPoint = " GetScrollInfo " )]
public static extern bool GetScrollInfo(IntPtrhwnd, int fnBar, ref SCROLLINFOlpsi);
[DllImport(
" user32.dll " ,EntryPoint = " SetScrollInfo " )]
public static extern int SetScrollInfo(IntPtrhwnd, int fnBar,[In] ref SCROLLINFOlpsi, bool fRedraw);

[DllImport(
" User32.dll " ,CharSet = CharSet.Auto,EntryPoint = " SendMessage " )]
static extern IntPtrSendMessage(IntPtrhWnd, uint Msg,IntPtrwParam,IntPtrlParam);
[DllImport(
" user32.dll " ,SetLastError = true )]
public static extern bool PostMessage(IntPtrhWnd, uint Msg, long wParam, int lParam);
}

最后一步控件同步效果

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> SCROLLINFOinfo = tvImageListScrollInfo;
info.nPos
= customScrollbar1.Value;
Win32API.SetScrollInfo(listBox1.Handle,(
int )ScrollBarDirection.SB_VERT, ref info, true );
Win32API.PostMessage(listBox1.Handle,Win32API.WM_VSCROLL,Win32API.MakeLong((
short )Win32API.SB_THUMBTRACK,( short )(info.nPos) ), 0 );

好了,现在我们拉一个控件到窗体上,就是我图1中的效果了。中间还有一些不好的地方,我争取改正,

也希望大家多多提建议,

我个人感觉这种方法不是什么很好的方法,如果是用C++来写的话会方便很多,但不知道c#是怎么写的,小弟确实不知道,还希望能得大家的帮助,一起来解决这个问题

其实我在网上也找了不少的资料,有些方法清空是抄别别人的,不过效果是实现 的,但总是感觉 不理想,不是自己想要的,也希望能通过这篇文章收集到一些好的解决方案,欢迎大家提供资源和解决方法,小弟在些谢过。

欢迎大家转载,如有转载请注明文章来自:http://sufei.cnblogs.com/

签名:做一番一生引以为豪的事业;在有生之年报答帮过我的人;并有能力帮助需要帮助的人;

QQ:361983679 Email:sufei.1013@163.com MSN:sufei.1013@163.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值