개발 환경 : Microsoft Visual Studio 2015
기본적인 키움증권 OpenAPI 개발환경이 이미 갖추어져 있다고 가정하고 진행합니다. (OpenAPI 모듈 설치, 번개 설치 등)
본 글은 WinForm 프로젝트에서 사용 가능한 키움증권 OpenAPI Control을 WPF 프로젝트에서 사용하기 위한 방법을 간단히 소개합니다.
먼저 [WPF 응용 프로젝트]를 생성합니다. 프로젝트 이름은 간단히 기본값인 WpfApplication1 을 사용합니다.
좌측 솔루션 탐색기에서 솔루션에 우측 마우스를 클릭하여 새 프로젝트를 추가합니다.
이때 추가하는 프로젝트는 [Windows Form 컨트롤 라이브러리] 프로젝트 입니다.
프로젝트의 이름은 [KHAxLib] 라고 지정하도록 하겠습니다.
두 개의 프로젝트를 생성하고 나면 좌측 솔루션 탐색기의 모습은 다음과 같이 됩니다.
[KHAxLib] 프로젝트를 선택한 상태에서 상단 메뉴 [도구] > [도구 상자 항목 선택] 을 클릭합니다.
이후 뜨는 [도구 상자 항목 선택] 팝업 창에서 [COM 구성 요소] 탭을 클릭하고,
키움증권 OpenAPI Contorl 인 [KHOpenAPI Contorl]에 체크 합니다.
이제 UserContorl1.cs 디자인 파일 선택 상태에서 좌측 [도구 상자] > [일반] 을 보면 다음과 같이 [KHOpenAPI Control] 이 생겨있는 것을 볼 수 있습니다.
이를 우측 창에 배치합니다.
[KHOpenAPI Control]의 [Dock] 값을 [Fill]로 지정합니다.
[UserContorl1] 파일을 편집합니다.
외부에 UserControl 이 가지고 있는 KHOpenAPI의 인터페이스를 사용할 수 있도록 아래와 같이 퍼사드 패턴(Facade Pattern)을 사용해 인터페이스를 제공합니다.
[UserContorl1.cs] 파일명을 [KHAxControl] 로 변경합니다.
아래 창과 같이 팝업 창이 뜨면 [예]를 누릅니다.
이제 [WpfApplication1] 프로젝트로 넘어와서, 우측마우스 -> [추가] > [참조] 를 클릭합니다.
[참조 관리자]에서 [프로젝트] > [KHAxLib] 프로젝트를 참조 추가합니다.
[어셈블리] > [프레임워크] 란에서는 [System.Windows.Forms]와 [WindowsFormsIntegration]를 참조 추가해줍니다.
[MainWindow]에서 [Gird]에 [grid1] 이름을 지정하고, [Window] 에 대해서는 [Loaded] 이벤트를 추가합니다.
[MainWindows.xaml.cs] 파일에서 앞서 추가한 [Loaded] 이벤트에 대한 내용을 아래와 같이 작성합니다.
아래는 KHOpenAPI를 이용해 서버에 접속하는 코드 입니다.
private void Window_Loaded(object sender, RoutedEventArgs e) { System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost(); KHAxLib.KHAxControl khAxCtr = new KHAxLib.KHAxControl(); host.Child = khAxCtr; this.grid1.Children.Add(host); if(khAxCtr.CommConnect() == 0) { // Connection success } else { // Connection fail } }
만약 위와 같이 Warpper를 사용하고 싶지 않다면 바로 프로젝트에 WinForm Control 객체를 적용하셔도 됩니다.
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:fi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:kh="clr-namespace:KHAxLib;assembly=KHAxLib" xmlns:local="clr-namespace:WpfApplication1" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> <Grid> <fi:WindowsFormsHost> <kh:KHOpenAPIWrap x:Name="khAxCtr" /> </fi:WindowsFormsHost> </Grid> </Window>
올바르게 동작하면 MainWindow가 뜨면서 다음과 같이 키움 OpenAPI의 로그인 창이 같이 뜨게 됩니다.
만약 코드로 생성하지 않고 XAML로 작성하여 컨트롤을 생성하고 싶을 경우 XAML 파일에 다음과 같이 작성하면 됩니다.
이 경우 [KHAxLib] 프로젝트를 생성하실 필요 없으며,
[KHAxLib] 프로젝트에 적용한 참조 방식을 바로 [WpfApplication1] 프로젝트에 적용하시면 됩니다.
그럴 경우 XAML 파일은 아래와 같이 작성하시면 됩니다.
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:fi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:axkh="clr-namespace:AxKHOpenAPILib;assembly=AxInterop.KHOpenAPILib" xmlns:local="clr-namespace:WpfApplication1" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> <Grid> <fi:WindowsFormsHost> <axkh:AxKHOpenAPI x:Name="axKHOpenAPI" /> </fi:WindowsFormsHost> </Grid> </Window>