1) WideString
캐스팅 시키는 함수. 아래 방법으로 하시면, A에 wchat_t 형식으로 Hello가 들어갑니다.

A = WideString("Hello");

2) StringToOleStr
원라는 AnsiString용 함수입니다. char 배열도 사용할 수 있습니다.

A = StringToOleStr("Hello");

3) MultiByteToWideChar
이 방법을 쓰시면 UTF8 형식으로도 변경할 수 있습니다. UniCode를 사용하는 경우, 이 API를 꼭 이용하셔야 합니다. UTF8을 원하시면 CP_ACP 부분을 CP_UTF8 로 바꾸어 주시면 됩니다. 이 방법은 조금 복잡합니다. 먼저 문자열 길이가 얼마나 나오는지 얻어낸 다음, 그 길이만큼 변수를 잡고, 변환을 다시 시켜야 합니다.

String            stString = "HELLO";
int               itWideSize = MultiByteToWideChar(CP_UTF8, 0, stString.c_str(), stString.Length() + 1, NULL, 0);
wchar_t           *wcTarget = new wchar_t[itWideSize];

MultiByteToWideChar(CP_ACP, 0, stString.c_str(), stString.Length() + 1, wcTarget, itWideSize);
=========================================================================================================
볼랜드포럼 유영인님 글에서 발췌

2006/07/05 11:46
Component->Import Component 실행

Import ActiveX Control 선택하고 진행

기본적으로 BDS의 Imports 인가 거기에 생성 되는데 다른데 생성해도 상관 없음

???_TLB.cpp,??? _OCX.cpp 등 cpp 관련이 2개 생성됨

BDS에서 새로운 package library 프로젝트를 하나를 만듦
만든후 앞에서 생성한 cpp 파일(???_TLB.cpp,??? _OCX.cpp) 추가 - 미리 생성된 CPP는 삭제하지 말것

Package Compile
Link
Install

ActiveX는 자동으로 컴포넌트가 Install 됨..

간혹 프로젝트에서 나타나지 않을 경우 Project - Option(Shift + Ctrl + F11)로 들어가서
Package Option 탭을 보고 체크되지 않았을경우 체크해 주면 나타나게 됨..

2006/07/04 19:25
VS(Visual Studio) 에서는 없는 개념(없다는건 아니고 다른이름이죠) 이라 VS진영에서 넘어오신 분들은 처음에 당혹해 하는 부분입니다만..
borland 는 (물론 C++ Builder와 Delphi) 에서는 VCL 이라는 라이브러리를 사용합니다.
VCL 은 VC++ 에서 MFC 정도라고 할까요? 사실 Windows API를 가지고 Windows Application 을 만드는것은 여간 복잡한(나름대로 익숙하면 그렇지만은 않은) 과정이 많아 이를 단순화 시킨게 MFC라면 VCL도 이러한 관점과 같습니다. 사실 VCL 은 Borland 의 오래전의 OWL(정확한지 기억이 가물가물) 에서부터 유래 합니다.
즉 Windows 의 여러가지 콘트를들을 Visual 하게 작업할 수 있도록 만들어서 제공하는 라이브러리가 VCL입니다.
이 러한 VCL의 주축은 Package Library 에서부터 출발 합니다. VC++에서 DLL 을 만들어 사용하듯이 borland에서도 물론 DLL을 사용할 수 있습니다.. 또한 VCL 이라는 package library 를 사용하고 있습니다. 이러한 package 라이브러리를 만들어 주는 프로젝트가 package library 프로젝트 입니다. 이렇게 만든 프로젝트의 결과물이 바로 bpl 파일 입니다. Borland Package Library 의 약자 이죠.
즉 VC++ 에서 DLL project를 하면 결과가 dll 이 나오듯이 borland의 package library project를 컴파일 하면 바로 bpl 이 나옵니다.
우리가 흔히 component 라고 판매하거나 아니면 다른사람이 만든것을 가져다 쓸수 있는 구조가 바로 bpl 입니다.
그러나 bpl 만 있으면 사실 프로그램에 직접 가져다 같이 컴파일 할 수 없습니다.
DLL 파일을 우리가 사용할려면 사실 DLL 에 있는 함수가 어떤것이 있는지를 선언해주는 header가 같이 있어야
우리의 코드에 적용할 수 있는 이치와 같이 bpl 도 header 가 있어야 합니다.
이러한 bpl을 가져다 다른프로그램에 접목시켜 프로그래밍을 하려면 bpi 파일과 header 파일이 있어야 합니다.
또한 bpl 에 만약 폼(Form) 이 같이 포함되어 있으면 해당 dfm (Design Form 의 약자인지 사실 Delphi Form의 약자인지는 혼동) 파일도 같이 있어야 합니다.
우리가 어떠한 판매되는 package library(component 라고 흔히 합니다) 를 구입하면 source code수준까지 구입하지 않을경우 바로 bpl + bpi + dfm 이 같이 들어 있습니다.

그리고 실제 실행파일을 실행하는 환경에서는 bpl 만 있으면 됩니다. (bpi 및 dfm 은 개발자 환경 파일이라 생각하면 됩니다).

Install 이라는것은 package library 즉 bpl 파일을 BDS (BCB6 나 그전도 마찬가지) 에 등록해야 사용할 수 있습니다. 이를 Install Package 라고 합니다. 즉 package library를 BDS에 등록하는 것이죠 프로그램에 쓸수 있도록.

C# 으로 .NET 환경에서 프로그래밍 하신 경험이 있으시면 .NET Assembly 라는 용어를 들어 보셨으리라 생각 합니다. bpl 은 이런 Assembly 와 같은 개념이라 생각하시면 됩니다.

제 생각에는 C# 은 바로 언어구문은 C , C++, Java 구문을 많이 따르고, 소스 파일 구문은 Delphi Pascal 을 많이 따르고(Header 를 사용하지 않고 using 문을 쓰는점에서)  Assembly 개념은 bpl 을 많이 따른 그야말로 장점을 모아 모아 만들긴 한거 같습니다...(그렇다고 만능은 아니고요)

Visual Studio (C#의 경우) 는 ActiveX 나 COM 을 직접 참조하여 프로그래밍 할수 있습니다. .NET 환경에서도 마찬가지고요... 그러나 C++ Builder에서는 이를 직접 사용하지 못합니다.

앞에서 우리가 ActiveX 에서 몇개의 C++ 파일을 BCB 에서 자동으로 만들어 주는 과정을 거쳤습니다.
여기에서 만들어지는것은 몇가지 C++ 와 바로 Type Library 라는 것을 만들어 줍니다. Type Library 라는것은
그전의 object 파일이 어떤 컴파일러든 링크 가능하던 시절이 지나고 서로 호환을 갖지 못하게 되었으며 이로 인해
MS에서는 type library라는 것을 제공하게 됩니다.
type library 는 간단히 말하면 어떤 코드(라이브러리 코드 , 컴파일된 object code 라 생각할 수 있죠) 를 외부에서 사용할때(LINK 할때) 연결하는 규칙이라 생각하시면 됩니다.  OLE 프로그래밍을 해보셨으면 아마 이러한 작업을 했던 경험이 있으실 겁니다.
Property 와 Method 를 만들어 붙이는 것이죠..

즉 BCB 는 ActiveX에서 이러한 소스코드와(실제 소스코드가 아니고 해당 active x에 연결하는 구조) 와 type library 를 만들어 내는 것입니다.

이렇게 만든 코드를 package 라이브러리로 만들어서 바로 bpl을 만들어 주면 BCB 나 BDS2006에서 사용할 수 있는 것 입니다.

처음 접하시는 분들은 좀 어려운 부분이기는 하나.. 매우 중요한 부분으로 Borland 툴의 우수한 기술력이라고 생각 합니다.

OCX를 이용하면 많은 부분을 처리할 수 있습니다. OCX는 기존의 DLL보다는 진일보한 인터페이스를 제공하고 있으니까요..
가령 Acrobat Reader를 자신의 폼에 배치하여 사용할 수도 있습니다.

지금으로서 (.NET을 제외하면) Borland 와 VS 와 연결 창구는 ActiveX 밖에 없는것 같습니다.
==========================================================================================

볼랜드포럼 - 둘리님 글에서 발췌..
==========================================================================================
2006.07.14
MFC에서 프로젝트를 FormView를 쓰면 화면 전환시에 사용하는 법은 다음과 같이 난 작성한다...

메인폼에 사용자 메시지를 받을 수 있는 함수를 다음과 같이 작성한다..

이런식의 함수를 사용하고자 하는 곳에서...

::SendMessage(AfxGetMainWnd()->m_hWnd, UM_MENUCHANGE, IDD_LDP_CAL_FORM, NULL);

이런식으로 호출해서 폼이 바뀌는방식을 주로 쓴다..


그리고 C++ 빌더에서는 다음과 같이 사용한다...
1. 이전 화면이 있으면 삭제..
2. 화면 호출 및 생성
3. 화면 크기를 메인폼에 맞게 수정..(Resize 함수 이용)

다음과 같이 처리한다... 어떤 방식이 더 낫다고 볼 수 없다..

어차피, 결과는 똑같으니까..

그런데.. 난 VCL 방식으로 처리하는게 더 좋다.. 왜... 간단하니까....

-2006.06.29 -

 

  1. 두개의 다른 윈도우를 생성해 SDI처럼 보여줄때.. 사용한 방식...

    void __fastcall Tfrm_Menu::FormChange()
    {
    TRect rect = Rect(0,60, 1024, 708);

    FormDelete(); // 이전 폼 삭제

    if(Menu_Val == 0)
    {
    //TfrmMain *frmMain = new TfrmMain(this);
    frm_Main = new Tfrm_Main(this); // 현재 폼을 오너로 해서 생성
    frm_Main->Show();

    String temp="..\\img\\mnu01_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Main->Canvas->Draw(0,0, BrushBmp);
    }
    else if(Menu_Val == 1){
    frm_Device = new Tfrm_Device(this);
    frm_Device->Show();

    String temp="..\\img\\mnu02_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Device->Canvas->Draw(0,0, BrushBmp);
    }
    /* else if(Menu_Val == 2)
    {
    frm_Manual = new Tfrm_Manual(this); // 현재 폼을 오너로 해서 생성
    frm_Manual->Show();
    } */
    else if(Menu_Val == 2)
    {
    frm_Setting = new Tfrm_Setting(this); // 현재 폼을 오너로 해서 생성
    frm_Setting->Show();

    String temp="..\\img\\mnu03_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Setup->Canvas->Draw(0,0, BrushBmp);
    }
    else if(Menu_Val == 3)
    {
    frm_IOMap = new Tfrm_IOMap(this); // 현재 폼을 오너로 해서 생성
    frm_IOMap->Show();

    String temp="..\\img\\mnu04_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_IOMap->Canvas->Draw(0,0, BrushBmp);
    }
    /* else if(Menu_Val == 99)
    {
    frm_Test = new Tfrm_Test(this); // 현재 폼을 오너로 해서 생성
    frm_Test->Show();
    }
    */
    }

    void __fastcall Tfrm_Menu::FormDelete()
    {

    // 다이얼로그가 살아있다면 없애고...

    if(frm_Keypad)
    {
    delete frm_Keypad;
    frm_Keypad = NULL;
    }

    // 이전 폼 삭제../
    if(frm_Main)
    {
    delete frm_Main;
    frm_Main = NULL;

    String temp="..\\img\\mnu01_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Main->Canvas->Draw(0,0, BrushBmp);
    }
    else if(frm_Device)
    {
    delete frm_Device;
    frm_Device = NULL;

    String temp="..\\img\\mnu02_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Device->Canvas->Draw(0,0, BrushBmp);
    }
    /* else if(frm_Manual)
    {
    delete frm_Manual;
    frm_Manual = NULL;
    }
    */
    else if(frm_Setting)
    {
    delete frm_Setting;
    frm_Setting = NULL;

    String temp="..\\img\\mnu03_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Setup->Canvas->Draw(0,0, BrushBmp);
    }
    else if(frm_IOMap)
    {
    delete frm_IOMap;
    frm_IOMap = NULL;

    String temp="..\\img\\mnu04_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_IOMap->Canvas->Draw(0,0, BrushBmp);
    }
    /*
    else if(frm_Test)
    {
    delete frm_Test;
    frm_Test = NULL;
    }
    */

    }

  2. 위의 MFC 방법에서 조금 더 손본 것...
    LRESULT CMainFrame::OnFormChange(WPARAM wParam, LPARAM lParam)
    {
    // Form Change
    CCreateContext context;
    CView* pOldActiveView = /*(CView *)*/GetActiveView(); // 현재 뷰를 기록한다
    CView* pNewActiveView = (CView *)GetDlgItem(wParam); // 새 뷰를 지정 Form으로 생성한다..
    context.m_pCurrentDoc = pOldActiveView->GetDocument() ; // 이전 뷰의 도큐먼트를 가져오고..

    if((pNewActiveView == NULL))// && (pOldActiveView != pNewActiveView))
    {
    switch (wParam)
    {
    case IDD_FORMVIEW_MAIN :
    pNewActiveView = (CView*)new CFrmMain();
    break;

    case IDD_FORMVIEW_SETUP :
    pNewActiveView = (CView*)new CFrmSetup();
    break;

    case IDD_FORMVIEW_MANUAL :
    pNewActiveView = (CView*)new CFrmManual();
    break;

    case IDD_FORMVIEW_MONITOR :
    pNewActiveView = (CView*)new CFrmMonitor();
    break;

    case IDD_FORMVIEW_INFO :
    pNewActiveView = (CView*)new CFrmInfo();
    break;

    default:
    pNewActiveView = (CView*)new CFrmMain();
    break;
    }
    pNewActiveView->Create(NULL,
    NULL,
    0L,
    CFrameWnd::rectDefault,
    this, wParam, &context) ; // 새로운 뷰틀 만들고

    pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    pNewActiveView->ModifyStyleEx(WS_EX_CLIENTEDGE, 0); // 오목 없애기..
    pNewActiveView->ModifyStyleEx(WS_EX_TRANSPARENT, 0); // 투명

    pNewActiveView->OnInitialUpdate(); // 뷰의 내용을 초기화 하고
    pNewActiveView->ShowWindow(SW_SHOW); // 새로운 View를 보인다.
    SetActiveView(pNewActiveView, TRUE); // 새로운 뷰를 활성하고.. // 쓰기 에러 발생부분

    // 디버그일때는 숨김으로 표시하도록 하고 .. Release일때는 폼을 삭제하도록 하자..

    #ifdef _DEBUG
    pOldActiveView->ShowWindow(SW_HIDE); // 숨김이 아니라 종료로 바꿔야 되는데... ㅠㅠ
    // pOldActiveView->DestroyWindow();
    // delete pOldActiveView; // 종료 시키고 메모리에서도 제거하자..(메모리릭 방지)
    #else
    pOldActiveView->ShowWindow(SW_HIDE); // 숨김이 아니라 종료로 바꿔야 되는데... ㅠㅠ
    pOldActiveView->DestroyWindow();
    // delete pOldActiveView; // 종료 시키고 메모리에서도 제거하자..(메모리릭 방지)
    #endif //_DEBUG
    ((CMainFrame *)AfxGetMainWnd())->RecalcLayout(); // 윈도우를 새로 갱신하자
    }
    return 0;
    }

    // DEBUG에서 이전 폼을 삭제하려고 하면 에러가 난다..
    // 원인 찾으면 다시 댓글로 처리..

< IplImage >

- OpenCV의 이미지 구조체


// 선언하기 (1차포인터 선언)

 IplImage *pSample = NULL;


// 이미지 로드하기

// cvLoadImage 함수를 이용해서 로드

// 두번째 인자는 양수값이면 강제로 3칼라(RGV), 0이면 강제로 흑백, 음수값이면 이미지 원래의 칼라를 따름

 pSample = cvLoadImage("sample.jpg", 1);
 

// 이미지 세이브하기

// 두번째 인자에 IplImage의 형태는 2차포인터이므로 &pSample 임

int cvSaveImage( char*형 파일이름, &pSample );

 

// 이미지 복사

// 빈 포인터 하나 만들고

IplImage *pCopySample = NULL;

 
//  같은 싸이즈로 빈 이미지를 하나 만들고

pCopySample = cvCreateImage( cvSize(pSample->width, pSample->height) ,IPL_DEPTH_8U, pSample->nChannels );

 

// OPENCV 소스에 있던 내용인데요 origin이 IPL_ORIGIN_TL에 따라 그냥 복사.. 혹은 Flip 시킴

if( image->origin == IPL_ORIGIN_TL )

{
     cvCopy( image, frame_copy, 0 );

}
else
{
     cvFlip( image, frame_copy, 0 );

}

// 복사후 필요없으면 pSample, pCopySample 모두 해지할것...

 

// 닫기

// 릴리즈함수

ReleaseImage( &pSample );

+ Recent posts

티스토리 툴바