본문 바로가기

Application Programming Interface

macOS Application에서 OpenGL 사용 예제 macOS Desktop Application에서 OpenGL 사용 예제 View.h /* MainView.h : View 영역에 발생하는 각종 호출과 이벤트 처리 */ #import #import @interface MainView : NSOpenGLView @end View.m /* MainView.m : 위 클래스의 구현 부분 */ #import "MainView.h" @implementation MainView /* OpenGLView 파생 클래스들은 defaultPixelFormat이 내부적으로 호출된다. Pixel Format을 가져올 때 호출된다. */ + (NSOpenGLPixelFormat *) defaultPixelFormat { static NSOpenGLPixelFormatAttri.. 더보기
Win32에서 IDispatch 인터페이스를 활용한 객체 사용 방법 Win32에서 IDispatch 인터페이스를 활용한 객체 사용 방법 본 포스팅에서는 Win32 C++에서 IDispatch Interface를 사용하여 Component Object Model 객체를 생성하고 그 객체의 메서드와 프로퍼티에 접근하는 방법에 대해 알아보겠습니다. 1. IDispatch 인터페이스 IDispatch 인터페이스interface는 COM(Component Object Model) 기반 프로그래밍을 할 때 COM 서버에 등록된 각종 개체들을 연동하는 과정에서 개체들이 제공하는 각종 인스턴스instance, 프로퍼티property, 메서드method 등을 현재 작성중인 코드와 연계시켜주는 역할을 하는 인터페이스입니다. 1-1. COM/OLE의 사용 시작과 종료 IDispatch 인터.. 더보기
Win32 C++에서 Microsoft Excel 파일 다루는 방법 Win32 C++에서 Microsoft Excel 파일 다루는 방법 본 포스팅에서는 C#에서 Microsoft Excel 파일 다루는 방법(http://tapito.tistory.com/582)을 참고하여 Win32 C++ 개발 환경에서 MFC를 사용하지 않고 OLE/Automation으로 Microsoft Excel 파일을 읽고 쓰는 방법에 대해 설명합니다. 프로젝트 생성 및 초기 코드에 대해서는 설명하지 않습니다. 1단계. Microsoft Excel Application 로드하기 및 종료하기 1-1. Microsoft Excel Application 실행하기 Excel.Application형 인스턴스를 생성하는 것으로써 Microsoft Excel Application이 내부적으로 실행됩니다. Ex.. 더보기
Windows API로 콘솔(터미널) 입/출력하기 Windows API로 콘솔(터미널) 입/출력하기 본 포스팅에서는 Windows API로 콘솔(터미널)을 띄운 후 이 콘솔로부터 입력 및 출력을 수행하는 과정에 대해 다룹니다. Windows API 콘솔 입출력은 디버그를 위한 문자열 출력 및 GUI에 영향을 주지 않는 각종 테스트 등에 활용될 수 있습니다. 1 단계. 창 띄우기 콘솔 창을 띄우기에 앞서 우선, Windows API로 다음과 같이 빈 창을 띄우겠습니다. /* winmain.c */ #include TCHAR g_szClassName[] = TEXT("ConsoleWindow"); TCHAR g_szWindowName[] = TEXT("Console Window Example"); HINSTANCE g_hInstance = NULL; LRE.. 더보기
MFC 기본 컨트롤 - ListBox의 사용법 MFC 기본 컨트롤 ListBox의 사용법 MFC에서 제공하는 기본 컨트롤에는, 1. CButton 계열의 버튼 컨트롤(BS_PUSHBUTTON: 일반적인 버튼, BS_CHECKBOX: 체크 박스, BS_RADIOBUTTON: 라디오 버튼, BS_GROUPBOX: 그룹 박스)과 2. CStatic 계열의 정적 컨트롤(SS_SIMPLE: 일반적인 텍스트 표시, SS_BITMAP: 비트맵을 표시) 3. CEdit계열의 입력 컨트롤(ES_MULTILINE: 여러 줄 편집 가능, ES_PASSWORD: 비밀번호 입력, ES_NUMBER: 숫자만 입력) 4. CListBox 계열의 리스트 박스 컨트롤 5. CTreeCtrl 계열의 트리 뷰 컨트롤 6. CComboBox 계열의 콤보 박스 컨트롤 7. CScroll.. 더보기
MFC 기본 컨트롤 - CComboBox 사용법 MFC 기본 컨트롤 CComboBox의 사용법 MFC에서 제공하는 기본 컨트롤에는, 1. CButton 계열의 버튼 컨트롤(BS_PUSHBUTTON: 일반적인 버튼, BS_CHECKBOX: 체크 박스, BS_RADIOBUTTON: 라디오 버튼, BS_GROUPBOX: 그룹 박스)과 2. CStatic 계열의 정적 컨트롤(SS_SIMPLE: 일반적인 텍스트 표시, SS_BITMAP: 비트맵을 표시) 3. CEdit계열의 입력 컨트롤(ES_MULTILINE: 여러 줄 편집 가능, ES_PASSWORD: 비밀번호 입력, ES_NUMBER: 숫자만 입력) 4. CListBox 계열의 리스트 박스 컨트롤 5. CTreeCtrl 계열의 트리 뷰 컨트롤 6. CComboBox 계열의 콤보 박스 컨트롤 7. CScro.. 더보기
RAW형 데이터의 프린터 출력을 위한 Windows API 호출 과정 프린터로 문서를 출력하기 위한 Windows API 호출 과정은 다음과 같다. 컴퓨터에 장착된 프린터를 찾아 그 중 하나를 선택한다. (EnumPrinters) 선택한 프린터를 열어 그 핸들을 얻는다. (OpenPrinter) 1. EnumPrinters 함수를 사용하여 프린터 정보 얻기 EnumPrinters 함수는 다음과 같이 선언되어 있다. BOOL EnumPrinters( _In_ DWORD Flags, _In_ LPTSTR Name, _In_ DWORD Level, _Out_ LPBYTE pPrinterEnum, _In_ DWORD cbBuf, _Out_ LPDWORD pcbNeeded, _Out_ LPDWORD pcReturned); (참조: https://msdn.microsoft.com/k.. 더보기
Universal Windows Platform (UWP)에서 SQLCipher 사용하기 NuGet Package에서 요구하는 버전 때문에 Visual Studio 2017 이상에서만 가능하다. 즉, Visual Studio 2015 이하에서는 안 됨. #1 ~ #3의 과정은 Visual Studio에 확장 기능을 적용하는 것이므로 처음 1회만 하면 이후 새 프로젝트를 생성할 때 또 다시 할 필요가 없음. 1. [도구(T)] - [확장 및 업데이트(U)...]를 클릭한다. 2. "확장 및 업데이트" 창에서 [온라인] 메뉴 클릭 후 검색창에 "SQLite"를 검색한다. "SQLite for Universal Windows Platform"를 다운로드한다. 3. 테스트해 본 결과 별 문제가 없었다. 안심하고 [예(Y)]를 누른다. 4. "솔루션 탐색기"에서 원하는 프로젝트에 참조 추가를 한다. .. 더보기
Android Studio에서 SQLCipher 라이브러리 추가 방법 1. Application의 Gradle Script [build.gradle (Module: app)]를 연다. 2. dependencies의 하위 항목으로 아래의 코드를 넣는다. compile 'net.zetetic:android-database-sqlcipher:3.5.4@aar' 3.5.4은 버전 이므로 최신 버전이나 적절한 값으로 교체 가능함. 추가 후 편집기 화면 상단의 "Sync Now"를 클릭 추가 후 재빌드. 끝. 더보기
Universal Windows Platform (UWP)에서 SQLite 사용하기 Windows 10 기반의 장치(PC, Phone, Table 등)에서 Local DB(SQLite)를 사용하는 방법입니다. 참고: 이 글을 작성하는 현재 Univerasal Windows Platform(UWP)에서 SQLite는 3rd Party 확장을 통해 지원하지만 암호화 도구인 SQLCipher는 상용 라이브러리(USD 899)를 구입하여 이식하는 수 밖에 없습니다. 이 글에서는 암호화를 하지 않고 순수 SQLite를 사용하는 방법에 대해서만 적어 둡니다. 1. Visual Studio에 SQLite 확장기능을 설치하기 위해 [도구(T)] - [확장 및 업데이트(U)]를 클릭합니다. 2. 팝업창 좌측의 [온라인] 메뉴를 클릭 후 화면 우측 검색창에서 "SQLite"를 검색합니다. 검색 결과에서 .. 더보기
인텐트를 통한 액티비티간 결과값 전달하기 MainActivity에서 SubActivity로 대화상자를 띄우고 그 결과를 MainActivity가 받고자 하는 경우... 1. MainActivity에서 SubActivity를 호출하는 부분 public class MainActivity extends Activity implements View.OnClickListener { // SubActivity를 모달 다이얼로그로 띄우는 동작을 ACTIVITY_CODE_DEFAULT (0)으로 정의합니다. public static final int ACTIVITY_CODE_DEFAULT = 0; // ... 중략 ... @Override public void onClick(View v) { // MainActivity 내 어떤 버튼을 클릭하여 SubActi.. 더보기
UITableView에 CustomTableViewCell 적용하기 UITableView에 CustomTableViewCell 적용하기 - by Tapito 아래와 같이 TableViewCell이 표시되는 모양을 직접 만들어 UITableView에 띄워보도록 하겠습니다. 1. 데이터 구조체 작성하기 먼저 사용자 구조체(여기서는 TapitoBusinessCard)를 작성합니다. 인명부 컨셉으로 간단하게 이름과 직장, 현재 재직 여부만을 저장하는 구조체입니다. Xcode를 열고 프로젝트를 하나 생성한 후 아래와 같이 구조체의 헤더 파일과 구현 파일을 작성합니다. TapitoBusinessCard.h #import @interface TapitoBusinessCard : NSObject // 이름, 직장, 재직 여부를 지정하여 TapitoBusinessCard 클래스 인스턴스.. 더보기
코딩으로 Nib 첫 화면 불러오기 UI 파일을 MyView.xib, 헤더 파일을 MyViewController.h, 컨트롤러 파일을 MyViewController.m이라 할 때, AppDelegate.m에서는 아래와 같이 작성 #import "AppDelegate.h" #import "MyViewController.h" @implementation AppDelegate - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { MyViewController * myViewController = nil; // 화면의 물리적인 크기만큼 윈도우를 생성하기 self.window = [[UIWindow al.. 더보기
키보드 보이기/숨김에 따른 UITextView 및 UITextField의 가려짐 현상 해결법 키보드 보이기/숨김에 따른 UITextView 및 UITextField의 가려짐 현상 해결법 - by Tapito iOS 어플 제작 시 화면에 나타나는 소프트 키보드에 의해 TextView 또는 TextField의 가려짐 현상에 대한 해결방법입니다. 아래와 같은 화면이 있습니다. 가운데 표시한 부분이 UITextView입니다. 좀 더 과장된 현상을 위해 Lanscape 모드로 보겠습니다. Interface Builder에 View들만 배치하였고 ViewController에는 아직 아무 코드도 추가한 것이 없습니다. 이 화면에서 표시한 UITextView를 클릭합니다. 키보드가 나타나서 원래 편집하고자 했던 UITextView의 텍스트를 가려버립니다. 또한 코드에 아무 작업도 적지 않았으므로 일단 Focu.. 더보기
위젯 업데이트 주기 빠르게 하기 widget_provider.xml에서 조정할 수 있는 android:updatePeriodMillis 속성은 최소 30분이므로 이보다 작은 값 (30 * 60 * 1000)보다 작은 수 입력해도 30분마다 업데이트 메시지를 받게 된다. 이보다 짧은 주기로 업데이트를 수행하기 위한 방법 중 하나는 AlarmManager가 있다. // WidgetProvider.java public class WidgetProvider extends AppWidgetProvider { /** 5000 msec 간격으로 알람을 발생합니다. */ private static final int WIDGET_ALARM_INTERVAL = 5000; private static PendingIntent pendingIntent; pr.. 더보기
MediaRecorder 클래스 사용법 (소리 편) MediaRecorder 클래스 사용법 (소리 편) - by Tapito Java Class 작성 package com.example.mediarecordertest; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActi.. 더보기
MediaPlayer 클래스 사용법 MediaPlayer 클래스 사용법 -by Tapito 1. 레이아웃 설정 (activity_main.xml) 간단하게 재생, 중지, 일시중지의 3가지 버튼을 삽입합니다. 2. 레이아웃에 따른 Java 클래스 작성 (MainActivity.java) 3개의 버튼을 Java 클래스의 Button 형 인스턴스에 연결하고 클릭할 때 곧이어 정의 할 updateActivity 함수가 호출되도록 합니다. Java 클래스에는 재생 상태와 관련된 4가지 상수를 정의하고 있습니다. PLAYER_INIT: 앱이 실행되고 재생 관련 함수에서는 아직 아무것도 수행하지 않은 상태입니다. PLAYER_STOP: 소리 재생이 중지된 상태입니다. PLAYER_PLAY: 소리가 재생중인 상태입니다. PLAYER_PAUSE: 소리 재.. 더보기
위젯 구현하기 Android Widget 구현하기 - by Tapito Widget은 안드로이드의 홈 화면에서 보여질 수 있는 일종의 작은 어플리케이션입니다. iOS에서는 Today Extension에 해당합니다. 이를 구현하기 위해서는 3가지의 파일(Layout, WidgetProvider XML, WidgetProvicer Class)을 새로 작성하고 AndroidManifest.xml을 수정합니다. 위젯 레이아웃 XML 파일 (widget.xml) 위젯이 홈 화면에서 보여줄 View 들을 배치하는 파일입니다. Widget에서 사용할 수 있는 요소는 아래와 같이 제한되어 있습니다. Layout 요소들 FrameLayout LinearLayout RelativeLayout View 요소들 AnalogClock But.. 더보기
위젯과 액티비티간의 데이터 교환 예제 Activity 측의 코드 // MainActivity.java package com.example.widgettest; import android.app.*; import android.appwidget.*; import android.content.*; import android.os.*; import android.view.*; import android.widget.*; public class MainActivity extends Activity { private TextView textView1 = null; private EditText editText1 = null; private Button button1 = null; @Override protected void onCreate(Bundl.. 더보기
Today Extension 사용 예제 Today Extension 사용 예제 - by Tapito iOS 8부터 새로 도입된 Today Extension을 구현하는 예제입니다. 1. 프로젝트 및 어플리케이션 확장 생성 Xcode를 열고 새 프로젝트를 생성합니다. 여기에서는 [iOS] - [Application] - [Single View Application]을 선택하고 Next를 누르겠습니다. 앱의 이름을 지정하고 Next를 누르면 빈 화면의 iOS 어플리케이션 프로젝트가 생성됩니다. Today Extension은 본래의 앱과 따로 작동되는 또 하나의 작은 앱입니다. 이 프로젝트에서 Today Extension을 추가하기 위해 [File] - [New] - [Target...]을 클릭합니다. [iOS] - [Application Exten.. 더보기
Xcode Interface Builder를 사용하여 사용자 정의 컨트롤 만들기 Interface Builder를 사용하여 사용자 정의 컨트롤 만들기 - by Tapito Visual Studio에서 C#, Basic, C++/CLI 등의 닷넷 언어로 어플리케이션을 작성할 때는 Panel에 원하는 컨트롤 들을 배치하여 사용자 정의 컨트롤 클래스를 만들 수 있습니다. Xcode에서도 이와 유사하게 각종 View 들을 배치하여 사용자 정의 View를 만들수 있습니다. 1. 프로젝트 생성 편의상 iPhone용 앱을 만드는 프로젝트를 기준으로 합니다. OS X용 프로그램 개발 프로젝트에서도 동일한 과정이 적용됩니다. 아래와 같이 Single View Application 프로젝트를 하나 생성하도록 하겠습니다. (Xcode 6.1.1 기준) 2. 사용자 정의 컨트롤을 작성할 레이아웃 파일 생.. 더보기
Windows NT 4.0 DDK 문서 - IMEAPPS.DOC [Part 2] Windows 95 / Windows NT 어플리케이션을 위한 다국어 IME 규격 Version 1.18 마지막 수정일: 1996년 5월 21일, 번역: Luciano Jeong ImmSetCompositionString 함수에 대하여 5.1 구성요소 5.1.1 절(Clause) 절은 하나 또는 그 이상의 문자로 구성되어 있습니다. 그리고 절은 변환의 기본 단위입니다. 기본적으로 IME는 한번에 하나의 절을 변환합니다. 한 절에 있는 모든 문자는 같은 속성을 가져야 합니다. 5.1.2 대상 절(Target Clause) 대상 절은 하나의 절입니다. 그리고 이 절은 사용자가 변환합니다.(And it is the clause that the end user is converting.) 속성은 0x01 또는 .. 더보기
Windows NT 4.0 DDK 문서 - IMEAPPS.DOC [Part 1] Windows 95 / Windows NT 어플리케이션을 위한 다국어 IME 규격 Version 1.18 마지막 수정일: 1996년 5월 21일, 번역: Luciano Jeong 1 개요 극동지역 버전의 윈도우를 위해 어플리케이션이 더블바이트 문자를 생성할 수 있도록 입력 방식 편집기(Input Method Editor, 이하 IME)가 특별 프로세스로서 도입되었습니다. IME를 인식하는 어플리케이션은 IME에 특성화괸 메시지를 처리하고 IME API를 호출해야 합니다. 그러나 인터페이스를 사용해 IME와 상호작용하는 프로그램을 개발하는 프로그래머에게는 몇 가지 어려움이 있습니다. API와 메시지의 설계가 다른 윈도우 API와 너무 다릅니다. 이는 인터페이스를 이해하고 사용하는데 어려움을 야기합니다. I.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #5 (완결) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong CANDIDATEFORM CANDIDATEFORM 구조체는 IMC_GETCANDIDATEPOS and IMC_SETCANDIDATEPOS 메시지에서 사용됩니다. /* CANDIDATEFORM */ typedef tagCANDIDATEFORM { DWORD dwIndex; DWORD dwStyle; POINT ptCurrentPos; REC rcArea; } CANDIDATEFORM; CANDIDATEFORM 구조체의 멤버 dwIndex 후보 목록의 ID를 지정합니다. 0부터 시작하는 후보목록의 인덱스입니다. dwStyle CFS_CANDIDATEPOS 또는 CFS_EXCL.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #4 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 통신을 위해 사용되는 구조체 다음은 IME 통신을 위해 사용되는 구조체에 대한 설명입니다. CANDIDATELIST CANDIDATELIST 구조체는 변환할 수 있는 후보 문자열에 대한 정보를 포함하고 있습니다. /* CANDIDATELIST */ typedef struct tagCANDIDATELIST { DWORD dwSize; // 이 구조체의 크기 DWORD dwStyle; // 후보 문자열들의 스타일 DWORD dwCount; // 변환 후보 문자열의 수 DWORD dwSelection; // 현재 선택된 후보 문자열의 순번 DWORD dwPageStart.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #3 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 관리 구조체 아래는 IME를 관리하기 위해 사용되는 구조체들에 대해 설명하고 있습니다. IMEINFO IMEINFO 구조체는 내부적으로 IMM과 IME 인터페이스에 사용됩니다. /* IMEINFO */ typedef struct tagIMEInfo { /* The byte count of private data in an IME context. */ /* IME 컨텍스트에서 사적으로 쓰일 메모리의 바이트 수 */ DWORD dwPrivateDataSize; /* The IME property bits. See description below. */ /* IME 속성.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #2 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 파일 포맷과 데이터 구조체 (Part 2) IMM 및 IME의 데이터 구조체 아래 구조체들은 IMM 및 IME와의 통신에 사용됩니다. IME는 이들 구조체에 직접 접근할 수 있지만 어플리케이션을 그럴 수 없습니다. INPUTCONTEXT INPUTCONTEXT 구조체는 입력 컨텍스트와 관련된 데이터를 보관하는 내부 데이터 구조체입니다. /* INPUTCONTEXT */ typedef struct tagINPUTCONTEXT { HWND hWnd; BOOL fOpen; POINT ptStatusWndPos; POINT ptSoftKbdPos; DWORD fdwConv.. 더보기
Windows DDK 문서 IMEIMES.DOC - 11. IME File Format and Data Structures (IME 파일 포맷 및 데이터 구조) #1 IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 파일 포맷과 데이터 구조체 (Part 1) 아래는 IME가 사용하는 IME 파일 포맷과 데이터 구조체에 대해 설명합니다. IME 파일 포맷 IME는 아래 필드들을 리소스의 버전 정보에서 정확히 지정할 필요가 있습니다. 이는 고정된 파일 정보 부분과 가변 길이 정보 부분으로 구성되어 있습니다. 리소스의 버전 정보에 관한 상세한 내용은 Microsoft Platform SDK를 참조하십시오. 아래는 IME 파일이 포함해야 하는 상세 정보 설정입니다. dwFileOS &nsbp;dwFileOS는 버전 정보의 최상위 블록에 명시되어야 하며 Windows 95 및 Windo.. 더보기
Windows DDK 문서 IMEIMES.DOC - 10. Windows NT/Windows 2000 Issues(윈도우 NT/윈도우 2000 배포) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong Windows NT/Windows 2000 배포 아래는 주로 Windows NT/Windows 2000과 관련된 특별한 주제를 다룹니다. 그러나 몇 가지는 Windows 98에도 적용가능합니다. IME와 현지어 호환성 Windows 2000은 어떤 현지 언어 버전에서도 완전한 기능의 IME를 지원합니다. 즉 여러분이 개발한 IME는 어떤 언어로 된 Windows 2000에서도 설치되고 사용될 수 있습니다. IME 개발자는 이를 고려하고 각 환경에서 테스트해보아야 할 것입니다. 이 새로운 기능은 IME 개발자가 작성한 IME 도움말이 다양한 언어의 운영체제에서도 잘 보이도록.. 더보기
Windows DDK 문서 IMEIMES.DOC - 9. IME Help File(IME 도움말 파일) IME 개발을 위한 Win32 다국어 IME 개요 버전 1.32 최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong IME 도움말 파일 IME 도움말 파일은 Windows 98, Windows NT 및 Windows 2000에서 새로 추가된 기능입니다. 시스템 펜 아이콘을 마우스 오른쪽 버튼으로 클릭 시 나타나는 메뉴에는 2개의 항목이 있습니다. 하나는 IME 시스템 설정이며 포커스가 놓인 스레드와 연결된 IME의 설정을 변경합니다. 다른 하나는 온라인 도움말 파일이나 활성화되지는 않습니다. 그러므로 이 메뉴 항목은 항상 회색으로 표시됩니다. 이 항목의 용도는 해당 IME의 온라인 도움말을 표시하기 위한 것이었으나 시스템이 IME에게 IME 도움말 파일의 이름을 설정할 방법을 제공하지 .. 더보기