VB C# .NET Freamworkの備忘録

C#, VB.NET Freamworkの備忘録を掲載しています。 コントロール、WPF、スレッド、共通関数と実用的なコードを掲載してきます。

2014年03月

マウスホイールした際に指定のコントロール内でマウスホイールが
行われたかを判定します。

 
    ''' <summary>
    ''' コントロール上にマウスカーソルが含まれるかどうかを判断する。
    ''' </summary>
    ''' <param name="control">コントロール。</param>
    ''' <returns>コントロール上にマウスカーソルが含まれるかどうか。</returns>
    ''' <remarks></remarks>
    Private Function ContainsMouseCursor(control As Control) As Boolean
‌ 
        Return control.ClientRectangle.Contains(control.PointToClient(Cursor.Position))
‌ 
    End Function
    ''' <summary>
    ''' マウスホイール動作処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Detail_MouseWheel(ByVal sender As ObjectByVal e As MouseEventArgs) Handles Me.MouseWheel
‌ 
        If Not Me.ContainsMouseCursor(Me.panel1) Then
            '
            ' 範囲外でマウスホイールが行われた場合
            '
            Exit Sub
        End If
‌ 
    End Sub

EXEのアイコンを
画面Form左上のアイコンとして自動的に設定するクラスです。
 
画面ロードじに以下を呼び出す。
Me.Icon = IconCLS.GetAppSmallIcon()


以下がクラスになります。
 
‌ 
Imports System.Runtime.InteropServices
Imports System.Drawing.Icon
‌ 
''' <summary>
''' アイコンの取得クラスです。
''' </summary>
''' <remarks></remarks>
Public Class IconCLS
‌ 
‌ 
#Region "アイコン"
‌ 
‌ 
    ''' <summary>
    ''' SHGetFileInfo関数で使用する構造体
    ''' </summary>
    ''' <remarks></remarks>
    Private Structure SHFILEINFO
        Public hIcon As IntPtr
        Public iIcon As IntPtr
        Public dwAttributes As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
        Public szDisplayName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
        Public szTypeName As String
    End Structure
‌ 
    ' SHGetFileInfo関数で使用するフラグ
    Private Const SHGFI_ICON As Integer = &H100 ' アイコン・リソースの取得
    Private Const SHGFI_LARGEICON As Integer = &H0 ' 大きいアイコン
    Private Const SHGFI_SMALLICON As Integer = &H1 ' 小さいアイコン
‌ 
‌ 
    ''' <summary>
    '''  SHGetFileInfo関数
    ''' </summary>
    ''' <param name="pszPath"></param>
    ''' <param name="dwFileAttributes"></param>
    ''' <param name="psfi"></param>
    ''' <param name="cbFileInfo"></param>
    ''' <param name="uFlags"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Declare Ansi Function SHGetFileInfo Lib "shell32.dll" (ByVal pszPath As StringByVal dwFileAttributes As IntegerByRef psfi As SHFILEINFO, ByVal cbFileInfo As IntegerByVal uFlags As IntegerAs IntPtr
‌ 
    ''' <summary>
    ''' アイコン
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared _smallIcon As Icon = Nothing
‌ 
    ''' <summary>
    ''' 現在のアセンブリのロケーションを取得します。
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function GetAssemblyLocation() As String
        Dim mainAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetEntryAssembly()
        Return mainAssembly.Location()
    End Function
‌ 
    ''' <summary>
    ''' アイコンの取得を行います。
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>
    ''' 
    ''' 親フォームのクラスに以下の設定を行うと自動的にEXEのアイコンが
    ''' フォーム左上のアイコンになります。
    ''' また、アイコンが設定されていない場合は、WIndowsアプリデフォルトの
    ''' アイコンが設定されます。
    ''' 
    ''' Protected Overrides Sub OnLoad(ByVal e As EventArgs)
    '''     Me.Icon = IconCLS.GetAppSmallIcon()
    '''     MyBase.OnLoad(e)
    ''' End Sub
    ''' </remarks>
    Public Shared Function GetAppSmallIcon() As Drawing.Icon
        If (_smallIcon IsNot NothingThen
            Return _smallIcon
        End If
‌ 
        Dim shInfo As New SHFILEINFO()
        Dim hSuccess As IntPtr = SHGetFileInfo( _
            GetAssemblyLocation(), _
            0, _
            shInfo, _
            Marshal.SizeOf(shInfo), _
            SHGFI_ICON Or SHGFI_LARGEICON)
‌ 
        If hSuccess.Equals(IntPtr.Zero) Then
            '// アイコン取得に失敗したとき
            Return SystemIcons.Application
        End If
‌ 
        _smallIcon = Icon.FromHandle(shInfo.hIcon)
        Return _smallIcon
    End Function
‌ 
#End Region
‌ 
End Class
‌ 


ソースコードをHTMLに変換するツール
http://lightz.info/index.cgi?no=28&continue=on

言語を問わないハイライト機能とプレビュー機能などがあります 

KeyValuePairのリストを使用して、コンボボックスの設定を行います。

Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
    Dim dataList As New List(Of KeyValuePair(Of StringString))()
    dataList.Add(New KeyValuePair(Of StringString)("A", "1"))
    dataList.Add(New KeyValuePair(Of StringString)("B", "2"))
    dataList.Add(New KeyValuePair(Of StringString)("C", "3"))
‌ 
    ComboBoxEx1.SetData(dataList, TrueTrue)
End Sub
‌ 
Private Sub ComboBoxEx1_SelectedIndexChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles ComboBoxEx1.SelectedIndexChanged
    MessageBox.Show(ComboBoxEx1.SelectedValue.ToString())
End Sub
Public Class ComboBoxEx
    Inherits ComboBox
‌ 
    ''' <summary>
    ''' データを設定する。
    ''' </summary>
    ''' <param name="items">表示テキストと値の組み合わせ項目リスト。</param>
    ''' <param name="addEmpty">先頭に空白を追加するかどうか。</param>
    ''' <param name="autoSize">内容に合わせて幅を自動調整するかどうか。</param>
    Public Sub SetData(ByVal items As IEnumerable(Of KeyValuePair(Of StringString)), _
                       ByVal addEmpty As Boolean, _
                       ByVal autoSize As Boolean)
        ' 設定データクリア
        ClearData()
‌ 
        Dim itemList As List(Of KeyValuePair(Of StringString)) = items.ToList()
‌ 
        ' 空アイテムの追加
        If addEmpty Then
            itemList.Insert(0New KeyValuePair(Of StringString)("", ""))
        End If
‌ 
        ' バインド
        MyBase.DisplayMember = "Key"
        MyBase.ValueMember = "Value"
        MyBase.DataSource = itemList
‌ 
        ' 幅の自動調整
        If autoSize Then
            If itemList.Count = 0 Then
                Return
            End If
‌ 
            Dim maxWidth As Integer = 0
            Dim g As Graphics = MyBase.CreateGraphics()
‌ 
            ' 表示テキストの最大長+余白分の幅
            MyBase.Width = CInt(items.Select(Function(item) g.MeasureString(Convert.ToString(item.Key), MyBase.Font).Width).Max()) + 20
        End If
    End Sub
‌ 
    ''' <summary>
    ''' 設定データをクリアする。
    ''' </summary>
    Public Sub ClearData()
        If MyBase.DataSource Is Nothing Then
            ' アイテムクリア
            MyBase.Items.Clear()
        Else
            ' データソースクリア
            MyBase.DataSource = Nothing
        End If
    End Sub
‌ 
End Class

↑このページのトップヘ