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 load 이벤트에 매핑 된 속성을 설정하십시오.
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가되도록 강제하는 것입니다. 이를 수행하는 방법은 두 가지가 있습니다. 첫 번째는 매니페스트 파일을 통한 것이고 두 번째는 프로그램에 하드 코딩하는 것입니다. OneClick을 사용하여 응용 프로그램을 배포하는 경우에는 하드 코딩해야하며 매니페스트 파일을 사용하지 않아야합니다. 그렇지 않으면 오류가 발생합니다.
다음 예제는 모두 다음에서 찾을 수 있습니다. WinForms 대형 DPI 설정에서의 확장 - 가능한가요? DPI에 대한 훌륭한 설명은 Telerik.com에 감사드립니다.
하드 코딩 된 DPI 인식 코드 예. 이것은 반드시 첫 번째 폼이 초기화되기 전에 실행되어야한다. 나는 항상 이것을 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>