수색…


소개

WindowsForms 응용 프로그램에 맞춤법 검사 확인란을 추가하는 방법에 대한 예제. 이 예제에서는 Word를 설치하거나 Word를 사용하지 않아도됩니다.

ElementHost 컨트롤을 사용하여 WPF Interop을 사용하여 WPF TextBox에서 WPF UserControl을 만듭니다. WPF TextBox에는 맞춤법 검사 기능이 내장되어 있습니다. 우리는 외부 프로그램에 의존하기보다는 내장 된 기능을 활용하려고합니다.

ElementHost WPF TextBox

이 예제는 인터넷에서 찾은 예제를 모델로했습니다. 링크를 찾을 수 없거나 저자에게 크레딧을 줄 것입니다. 찾은 샘플을 가져 와서 응용 프로그램에서 작동하도록 수정했습니다.

  1. 다음 참조를 추가하십시오.

System.Xaml, PresentationCore, PresentationFramework, WindowsBase 및 WindowsFormsIntegration

  1. 새 클래스를 만들고이 코드를 지나치십시오.

    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
    
  2. 솔루션을 다시 빌드하십시오.

  3. 새 양식을 추가하십시오.

  4. 도구 상자에서 클래스 이름을 검색하십시오. 이 예는 "SpellCheck"입니다. 'YourSoulutionName'구성 요소 아래에 나열되어야합니다.

  5. 새 컨트롤을 양식으로 드래그하십시오.

  6. 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
  1. 마지막으로해야 할 일은 응용 프로그램의 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>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow