본문 바로가기
kxLibrary

KFC1.0 - Windows SDK Platform C++ Development ToolKit 풀소스 공개

by 두루물 2010. 11. 10.


"KFC1.0 으로 윈도우즈 SDK 플랫폼 API 프로그램을 MFC 처럼 쉽게 하자"

KFC1.0 - MS-Windows SDK Platform C++ library Development ToolKit
전격
공개(풀 소스코드 포함)


Publish My KFC1.0 MS-Windows SDK Platform C++ Library Here!



사용자 삽입 이미지

[이것은 Korea 위상을 드높이 널리 알리는 다물 프로젝트의 일환입니다]

*본 KFC 라이브러리(일명 kxLibrary) 의 현재버전 1.0을 이곳 제작자의 개인 블로그에 세계 최초로 공개합니다. 나중에 시간이 한가하게 되면 codeguru 나 codeproject에 영문 설명서 작업하여 올릴까 고려하겠습니다.
풀 소스를 모두 공개하였으니 마음껏 받아가셔서 자신의 필요한 프로젝트에 얼마든지 활용하시기 바랍니다.

What is KFC1.0 ?

본 라이브러리는 krkim에 의해 개발되어 그동안 개인적으로 꾸준히 사용되어 온 Private Project 의 하나이며 이곳에 모든 Full source가 공개되는 바입니다. 이 KFC라이브러리는 SDK 플랫폼 API 기반(일명 WIN32/WIN64 프로젝트)에서 윈도우즈 프로그램을 개발하는데 사용되는 C++ 클래스 라이브러리 개발자용 툴킷 입니다.

MFC 나 기타 다른 어떠한 제2,제3의 플랫폼 라이브러리에 종속적이지 않고 이를 필요로 하지도 않으며 KFC Library 1.0 (new named as kxLibrary1.0) 단독으로 개발할 수 있으며 하물며 MFC와 API ,WTL 과 API 서로 쌍방의 이종 개발 플랫폼 간의 Porting 이 가능하도록 호환성있는 아키텍쳐를 제공합니다.

This Library is a set of C++ style classes consist of SDK Platform API (MS-Windows).

When i use  this library?

따라서,이 라이브러리는 아래와 같은 상황에 사용할 수 있습니다.

-MS Windows의 메카니즘을 완벽히 공부하고 이해할 수 있는 기회
-MFC를 쓰지 않고 윈도우즈 프로그래밍을 하고자 하는 경우(no MFC Project),

-MFC로는 성격이 많지 않아 프로그래밍 하기 애매한 경우(not proper with MFC),
-Windows SDK에서 제공하는 API로는 체계적인 프로그래밍이 힘든경우(To avoid hard coding API),
-C++ 클래스로 Windows API 프로그래밍을 원하는 경우(c++ object style api level code),
-MFC 프로그램 보다 가벼운 실행코드와 작은 크기를 원할 경우(tiny exe code and size),
-WTL 사용이나 기존의 MFC 소스코드를 API로 재작성 하고 대체할 경우(reengineering / refactoring/ porting to API code)
-SDK,WTL이나 MFC 프로젝트에서 이 라이브러리 사용가능(also available plug in SDK,WTL,MFC Project).
-API 를 객체지향형 언어구조로 개발하고자 할 경우(API with OOP)

이 KFC 라이브러리는 여러 개발 플랫폼 가운데 다음에 위치해 있습니다.
오른쪽으로 갈수록 개발속도가 빠르고 개발 환경이 편하나 빌드후 결과가 무겁고 느리고 크기는 큽니다.
왼쪽으로 갈수록 개발속도는 느리고 개발 환경이 열악하나 빌드후 배포시엔 가볍고 빠르며 크기도 작습니다.
KFC는 이들 사이에 있으면서 양자의 장점만을 위해 구현 되었습니다.
즉,KFC 라이브러리는 개발하기 편하며 빠르고 결과는 왼쪽에 가깝게 가볍고 빠르며 작도록 말입니다.

This library performance is among as following,
Toward the right, development environment is fast,easy and save time but it has a heavy and slow and the size is larger results. otherwise toward the left, development is slow,diffucult and take a long time,but the result is more light,faster and has tiny size. So KFC Library tries to has the benefits both left and right.

 <=== low level(high speed)             high level(low speed)   ===>
 -------------------------------------------------------------------
 (light) SDK (API)     <     KFC      <    WTL     <   MFC  (heavy)
 -------------------------------------------------------------------
 <=== low level(small size)             high level(large size)  ===>

(i guess both KFC and WTL are nip and tuck ;-))

또한,구조는 기존의 MFC나 WTL의 Event Driven 방식을 고수 합니다.
It also support event driven (message handler) method like as the WTL,MFC.

How to Use?

아래는 MFC 코드로 착각할 만큼 거의 똑같습니다. 그러나 이것은 API 에 기반을 둔 KFC Library 프로젝트의 소스코드 예제 입니다.
Following Dialog based sample source is not MFC,it's KFC Application source based on SDK API Platform.


How to Make?

아래의 KFC1.0 라이브러리 소스코드 프로젝트를 다운로드 하여 빌드합니다. 그런후에 자신의 WIN32/WIN64 SDK 프로젝트를 만든다음 해당 경로의 KFC1.0의 라이브러리 파일인 KFCWndLib.lib를 링크에 삽입 합니다.
이후 KFC1.0 라이브러리에서 제공하는 MFC의 CString에 해당하는 kxBuff.h의 kxString 문자열 버퍼 클래스,선형버퍼,벡터등의 버퍼조작 함수부터 윈도우즈 프레임워크 클래스,툴바나 MDI 탭바 등 각종 추가포함된 시스템 공용 컨트롤 클래스와 KFC1.0에서만 제공하는 커스텀 컨트롤등 갖가지 클래스와 함수를 적절하게 이용합니다.
이것을 하기전에 KFC1.0 압축을 푼 경로의 Demo 프로그램을 먼저 빌드해 보십시오.

DialogApp Class

Header File

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
  $Id: DialogApp.h 3 2009-12-20 19:12:53Z krkim $ $Revision: 3 $
  $HeadURL: https://krkim-laptop/svn/KFC/trunk/Demo/Dialog/DialogApp.h $
 */

#pragma once
//
#include "KFCApp.h"
//
class CDialogApp : public KFCApp  
{
public:
	virtual BOOL InitInstance();
	virtual BOOL ExitInstance();
	CDialogApp();
	virtual ~CDialogApp();

};

 Source File

/* 
  $Id: DialogApp.cpp 3 2009-12-20 19:12:53Z krkim $ $Revision: 3 $
  $HeadURL: https://krkim-laptop/svn/KFC/trunk/Demo/Dialog/DialogApp.cpp $
 */

#include "stdafx.h"
#include "DialogApp.h"
#include "ExampleDlg.h"
#include "resource.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//Declare KFC Entry Point Macro

KFC_ENTRYPOINT(CDialogApp)

CDialogApp::CDialogApp()
{
}

CDialogApp::~CDialogApp()
{
}

BOOL CDialogApp::InitInstance()
{
	CExampleDlg dlg(IDD_MAIN,0/*demodlg->GetSafeHwnd()*/);

	int flag = dlg.DoModal();
	MessageBox(0,(flag == IDOK) ? "IDOK pressed" : "Canceled","result",MB_OK);
	return FALSE;//In Modal Dialog mode,return FALSE.
}

BOOL CDialogApp::ExitInstance()
{
	return TRUE;
}

ExampleDlg Class
 
Header File
/* 
  $Id: ExampleDlg.h 3 2009-12-20 19:12:53Z krkim $ $Revision: 3 $
  $HeadURL: https://krkim-laptop/svn/KFC/trunk/Demo/Dialog/ExampleDlg.h $
 */

#pragma once

#include "KFCDlg.h"

class CExampleDlg : public KFCDlg
{
public:
	CExampleDlg(void);
	CExampleDlg(UINT nID,HWND hParent = NULL);
	virtual ~CExampleDlg(void);

	//KFC message handler >>
	KFC_BEGIN_MAP()
		KFC_HANDLE_MSG(WM_INITDIALOG,OnInitDialog)
		KFC_HANDLE_MSG(WM_DESTROY,OnDestroy)
		KFC_HANDLE_MSG(WM_COMMAND,OnCommand)
	//KFC_ENDCHAIN_MAP(KFCDlg)
	KFC_END_MAP()
	//KFC message handler <<
protected:
	/*message event handler function do not virtual */
	// kfc msg >>
	kfc_msg BOOL OnInitDialog(HWND hWndFocus,LPARAM dwInitParam);
kfc_msg void OnDestroy(); kfc_msg BOOL OnCommand(UINT nID, HWND hWndCtrl, UINT nNotifyCode);
// kfc msg << };
Source File
#include "stdafx.h"
#include "ExampleDlg.h"
#include "DialogApp.h"
#include "resource.h"

///////////////////////////////////////////////////////////////////////////
CExampleDlg::CExampleDlg() :KFCDlg()
{
}

CExampleDlg::CExampleDlg(UINT nID, HWND hParent) :KFCDlg(nID,hParent)
{
}

CExampleDlg::~CExampleDlg(void)
{
}

BOOL CExampleDlg::OnInitDialog(HWND hWndFocus,LPARAM dwInitParam)
{	//dwInitParam is user param when create.
	KFCDlg::OnInitDialog(hWndFocus,dwInitParam);
	SetIcon(KFCGetApp()->LoadIcon(IDI_MAINICON),FALSE);
	if(GetStyle() & WS_POPUP)
		CenterWindow(::GetParent(m_hWnd));
	return TRUE;//If no focus,return FALSE;
}

void CExampleDlg::OnDestroy()
{
}

BOOL CExampleDlg::OnCommand(UINT nID, HWND hWndCtrl, UINT nNotifyCode)
{
	//if nID == 1 ,IDOK or ENTER key
	//nNotifyCode == Notify message  from an accelerator = 1,from a menu = 0
	//hWndCtrl = from a control = ctrl handle Otherwise  = NULL

	HINSTANCE hInst = KFCGetInstanceHandle();

	switch(nID)
	{
	case IDC_BUTTON1:
		break;
	case IDOK:
	case IDCANCEL:
		break;
	default:
		break;
	}
	return 0;
}
As result,it is similar to MFC or WTL message handler. but it works on SDK API Platform and support easy and simple way for API coding.
Also It is possible that MFC Project porting to API PRoject (or inverted) could be enabled more easily by using this KFC Library. Above simple sample demonstrate just the event handler which similar to WTL/MFC 's that.
For more info, see Demo Project in KFC1.0 Library Product.


KFC1.0 에 대하여

원제작자 :
krkim (http://krkim.net)
최초 공개 싸이트 :
http://krkim.net
공개날짜: 2010/11/10

라이센스: Full Open Source
              원 저작자 표기를 유지하는 조건으로 얼마든지 변형하여 사용가능.
              사전협의 없이 출판,강의 등 영리목적의 수단이나 기업의 상업적 이용 불가
              배포되는 압축파일 명의 이름을 변경하지 말것.
              Sourceforge 와 같은 OpenSource Project로 런칭시 저에게 미리 알려주기 바람.

문의 메일: durumul@gmail.com

About KFC1.0 License and Author

Original Author: krkim ,seoul in The Greate One Korea.
            Copyright(c) 2010 krkim All rights reserved.
License : Full Open Source
          Do not remove original author info.
          Do not use for commercial purpose without contact me.
          Don't rename original release package file name.
          If anyone has plan to try to launch as opensource project,
          (eg:sourceforge),please notice for me before do it.
Contact: durumul@gmail.com

KFC Platform History

KFC1.0 은 KFC2.0 플랫폼에서 kxLibrary 로 rename 되었습니다.

KFC1.0 = KFCWndLib        - published 2010.11.10 at http://krkim.net
KFC2.0 = kxLib(kxWndLib) - not published


Thanks Regards As,
KR.Kim

감사합니다.

출처: http://krkim.net/category/kxLibrary


Additional Links

Bugfix::KFCApp Class Update for DLL KFCSetResourceInstance() (http://krkim.net/130)