Visual Basic .NET Language
WinForms SpellCheckBox
サーチ…
前書き
WindowsFormsアプリケーションにスペルチェックボックスを追加する方法の例。この例では、Wordをインストールする必要はありませんし、Wordを使用することもありません。
ElementHostコントロールを使用してWPF Interopを使用して、WPF TextBoxからWPF UserControlを作成します。 WPF TextBoxにはスペルチェック機能が組み込まれています。外部プログラムに頼るのではなく、この組み込み関数を活用しようとしています。
ElementHost WPF TextBox
この例は、私がインターネット上で見つけた例をモデルにしています。私はリンクを見つけることができない、または私は著者のクレジットを与えるだろう。見つけたサンプルを取り出し、自分のアプリケーションで動作するように修正しました。
- 次の参照を追加します。
System.Xaml、PresentationCore、PresentationFramework、WindowsBase、およびWindowsFormsIntegration
新しいクラスを作成し、このコードを通過する
Imports System Imports System.ComponentModel Imports System.ComponentModel.Design.Serialization Imports System.Windows Imports System.Windows.Controls Imports System.Windows.Forms.Integration Imports System.Windows.Forms.Design <Designer(GetType(ControlDesigner))> _ Class SpellCheckBox Inherits ElementHost Private box As TextBox Public Sub New() box = New TextBox() MyBase.Child = box AddHandler box.TextChanged, AddressOf box_TextChanged box.SpellCheck.IsEnabled = True box.VerticalScrollBarVisibility = ScrollBarVisibility.Auto Me.Size = New System.Drawing.Size(100, 20) End Sub Private Sub box_TextChanged(ByVal sender As Object, ByVal e As EventArgs) OnTextChanged(EventArgs.Empty) End Sub <DefaultValue("")> _ Public Overrides Property Text() As String Get Return box.Text End Get Set(ByVal value As String) box.Text = value End Set End Property <DefaultValue(True)> _ Public Property MultiLine() As Boolean Get Return box.AcceptsReturn End Get Set(ByVal value As Boolean) box.AcceptsReturn = value End Set End Property <DefaultValue(True)> _ Public Property WordWrap() As Boolean Get Return box.TextWrapping <> TextWrapping.Wrap End Get Set(ByVal value As Boolean) If value Then box.TextWrapping = TextWrapping.Wrap Else box.TextWrapping = TextWrapping.NoWrap End If End Set End Property <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _ Public Shadows Property Child() As System.Windows.UIElement Get Return MyBase.Child End Get Set(ByVal value As System.Windows.UIElement) '' Do nothing to solve a problem with the serializer !! End Set End Property End Class
解決策を再構築します。
新しいフォームを追加します。
ツールボックスでクラス名を検索します。この例は "SpellCheck"です。 「YourSoulutionName」コンポーネントの下に表示されます。
新しいコントロールをフォームにドラッグします
formsロードイベントにマップされたプロパティのいずれかを設定します。
Private Sub form1_Load(sender As Object, e As EventArgs) Handles Me.Load
spellcheckbox.WordWrap = True
spellcheckbox.MultiLin = True
'Add any other property modifiers here...
End Sub
- 最後に行う必要があるのは、アプリケーションのDPI認識を変更することです。これは、WinFormsアプリケーションを使用しているためです。デフォルトでは、すべてのWinFormsアプリケーションはDPI UNAWAREです。要素ホスト(WPF Interop)を持つコントロールを実行すると、アプリケーションはDPI AWAREになります。これはあなたのUI要素を混乱させるかもしれません。これに対する解決策は、アプリケーションをDPI UNAWAREにすることです。これを行うには2つの方法があります。最初はマニフェストファイルを使用し、2番目はマニフェストファイルにハードコードします。 OneClickを使用してアプリケーションをデプロイする場合は、アプリケーションをハードコードする必要があります。マニフェストファイルを使用しないと、エラーが発生します。
以下の両方の例は、次のとおりです。WinForms大規模DPI設定でのスケーリング - それは可能ですか? Telerik.comのおかげで、DPIについての素晴らしい説明があります。
ハードコーディングされたDPI認識コードの例これは最初のフォームが初期化される前に実行されなくてはなりません(MUST)。私は常にこれをApplicationEvents.vbファイルに置きます。ソリューションエクスプローラでプロジェクト名を右クリックし、[開く]を選択すると、このファイルにアクセスできます。次に、左側のアプリケーションタブを選択し、スプラッシュ画面のドロップダウンの右下にある「アプリケーションイベントの表示」をクリックします。
Namespace My
' The following events are available for MyApplication:
'
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Enum PROCESS_DPI_AWARENESS
Process_DPI_Unaware = 0
Process_System_DPI_Aware = 1
Process_Per_Monitor_DPI_Aware = 2
End Enum
Private Declare Function SetProcessDpiAwareness Lib "shcore.dll" (ByVal Value As PROCESS_DPI_AWARENESS) As Long
Private Sub SetDPI()
'Results from SetProcessDPIAwareness
'Const S_OK = &H0&
'Const E_INVALIDARG = &H80070057
'Const E_ACCESSDENIED = &H80070005
Dim lngResult As Long
lngResult = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware)
End Sub
Private Sub MyApplication_Startup(sender As Object, e As ApplicationServices.StartupEventArgs) Handles Me.Startup
SetDPI()
End Sub
End Namespace
マニフェストの例
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>