반응형
반응형

클립보드를 사용한 다양한 프로그램 제어는 다양한 기능 지원으로 점점 간소화되고 있습니다. 오늘은 MFC 환경에서 자동으로 클립보드 상태 변경을 확인할 수 있는 OnClipboardUpdate 이벤트 설정에 대해서 알아보겠습니다. 클립보드를 사용하기 위해서는 Clipboard 함수를 사용해서 확인이 가능합니다. MFC에서는 이런 클립보드 상태 변경을 이벤트를 이용해서 확인 할 수 있습니다.

MFC 애플리케이션에서 대화상자기반  프로젝트를 생성합니다.

이벤트 창에서 WM_CLIPBOARDUPDATE 이벤트를 클릭해서 이벤트 함수를 생성합니다.

자동으로 생성된 이벤트를 확인할 수 있습니다. 빌드 후 실행하면 대화상자가 출력됩니다. 클립보드 이벤트를 발생하면 아무 반응이 없습니다. 아직 시스템 이벤트 리스너에 등록이 안되어 있어 이벤트를 확인할 수 없는 겁니다.

OnInitDialog() 함수로 이동해서 AddClipboardFormatListener()를 등록합니다.

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-addclipboardformatlistener

 

AddClipboardFormatListener function (winuser.h) - Win32 apps

Places the given window in the system-maintained clipboard format listener list.

learn.microsoft.com

정상적으로 시스템 클립보드 리스너에 등록되면 자동으로 클립보드 이벤트 감지를 확인할 수 있습니다. 감사합니다.

 

반응형
반응형

오늘은 MFC Dialog Class Name 변경 방법을 알아보겠습니다.













프로젝트 생성 후  리소스 뷰로 이동합니다.
프로젝트.rc를 선택하고 속성을 클릭하면 MFC Mode 필드를 False로 변경합니다.














변경하고 싶은 Dialog를 선택 후 속성을 클릭합니다.

상단에 보이는 Class Name를 변경합니다.




다시 프로젝트.rc를 선택 후 MFC Mode를 True로 변경합니다.






프로젝트.rc파일을 텍스트로 확인하면 CLASS 명이 변경된 것을 확인할 수 있습니다.









Dialog App InitInstance로 이동합니다.
Dialog가 생성되기 전에 아래 코드를 추가합니다.

WNDCLASS wc; ::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc); wc.lpszClassName = _T("@CLASSNAME"); AfxRegisterClass(&wc);




컴파일 후 Spy++로 확인하면 Class Name이 변경된 것을 확인할 수 있습니다.
Class Name 변경 후 App에 코드를 추가 안 할 경우 Class Name을 확인할 수 없어 Dialog가 안 보이게 됩니다.
이상입니다.
감사합니다.


반응형

'IT 나라 > 프로그램 이야기' 카테고리의 다른 글

Visual Studio code에서 Go 실행하기  (0) 2018.02.02
Go 언어 설치 방법  (0) 2018.02.01
C# TOPMOST MessageBox 사용하기  (0) 2017.07.31
XmlSerializer 사용법  (0) 2017.03.17
COM 래퍼 클래스 만들기  (0) 2017.01.20
반응형

안녕하세요. 오늘은 COM 래퍼 크래스 만드는 방법을 배워보겠습니다.

OCX를 만들게 되면 일반적으로 웹에서 사용하지만,

간혹 OCX를 프로그램에서 사용해야 하는 경우가 있습니다.

이럴때 자동으로 UI에서 래퍼 클래스가 생성되지만

안될 경우 혼란에 빠지게 됩니다. ㅠㅠ




OCX를 직접 사용하기 위해서는 래퍼 클래스를 이용해서 노출된 인터페이스에 접근하게됩니다.

래퍼 클래스는 OCX를 개발할 때 생성된 GUID를 이용해서 접근합니다.



1
2
3
#include "StdAfx.h"
#include "Activex_TESTCtrl.h"
IMPLEMENT_DYNCREATE(Activex_TESTCtrl, CWnd)
cs


Activex_TESTCtrl.cpp 파일 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#pragma once
 
// 컴퓨터에서 Microsoft Visual C++를 사용하여 생성한 IDispatch 래퍼 클래스입니다.
 
// 참고: 이 파일의 내용을 수정하지 마십시오. Microsoft Visual C++에서
//  이 클래스를 다시 생성할 때 수정한 내용을 덮어씁니다.
 
/////////////////////////////////////////////////////////////////////////////
// CActivex_test01ctrl1 래퍼 클래스입니다.
 
class Activex_TESTCtrl : public CWnd
{
protected:
    DECLARE_DYNCREATE(Activex_TESTCtrl)
public:
    CLSID const& GetClsid()
    {
        static CLSID const clsid                        
            = { 0x2d12f2e40x1c6f0x475a, { 0x180x320x190xef0xef0x9a0x170x58} };
        return clsid;
    }
    virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
        const RECT& rect, CWnd* pParentWnd, UINT nID, 
        CCreateContext* pContext = NULL)
    { 
        return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); 
    }
 
    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, 
        UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
        BSTR bstrLicKey = NULL)
    { 
        return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
            pPersist, bStorage, bstrLicKey); 
    }
 
    // 특성입니다.
public:
 
 
    // 작업입니다.
public:
 
    // _DActiveX_Test01
 
    // Functions
    //
 
    void Fun()
    {
        InvokeHelper(0x01, DISPATCH_METHOD, VT_EMPTY, NULLNULL);
    }
 
    
    // Properties
    BSTR GetFunIP()
    {
        BSTR site;
        InvokeHelper(0x02, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&site, NULL);
        return site;
    }
 
    void SetFunIP(LPCTSTR newVal)
    {
        static BYTE parms[] = VTS_BSTR;
        InvokeHelper(0x02, DISPATCH_PROPERTYPUT, VT_BSTR, NULL, parms, newVal);
    }
 
    
 
};
 
cs


Activex_TESTCtrl.h 파일 입니다.


CSLID는 OCX에 등록된 GUID를 복사하면 됩니다.


생성된 래퍼 클래스는 DDX_Control 함수를 사용해서 직접 연결하면 사용 가능합니다.


OCX에 설정된 메서드 또는 속성에 접근하기 위해서는 InvokeHelper 함수를 사용해야 합니다.


InvokeHelper함수는 wFlags를 통해 지정된 컨텍스트에서 dwDispID를 통해 지정된 개체 메서드 또는 속성을 호출합니다.



InvokeHelper 함수 구문입니다.


5개 이상 매개 변수를 사용하고 있으며 가장 중요한 메서드는 dwDispID입니다.

dwDispID를 OCX개발 시 설정 된 ID이며 ID가 다를 경우 "형식 오류" 를 리턴 합니다.



vtRet인수의 가능한 VARENUM 열거형입니다.

설정 된 값을 설정 후 접근하면 됩니다.


이렇게 래퍼 클래스를 만들면 쉽게 COM을 접근해서 사용 가능합니다.


자동 생성이 안된다고 당황하지 마시고 안되면 그냥 위 내용을 복사해서 사용하시면 됩니다.


그럼 즐거운 주말 보내십시오.


감사합니다.


반응형

+ Recent posts