본문 바로가기
C & C++/MFC 컨트롤

API 를 이용하여 컨트롤 만들기

by izen8 2011. 4. 25.
반응형

API 를 이용하여 컨트롤 만들기

 

1. 매핑 모드

윈도우 내에서의 좌표는 픽셀단위로 이루어 집니다.

픽셀의 위치는 X, Y로 지정하며 원점으로 부터의 거리로 구성됩니다.

예를들어화면의(100,100) 에문자열을 출력한다면 이는 윈도우의 작업영역 왼쪽 맨 위에서  X축으로나 Y축으로100 픽셀만큼 떨어진 거리에 문자열이 출력된다는 의미이며 원점과 출력된 문자열 사이에는 100개의 픽셀이 있다는 의미입니다.

매핑모드

매핑모드(mapping mode)란 주어진 좌표가 화면 상의 실제 어디에 해당하는지를 계산하는 방법을 의미합니다.

윈도우에서 사용하는 좌표는 논리 좌표와 물리 좌표 두 가지가 있습니다.

 

논리좌표: 윈도우의 내부에서 사용되는 좌표

논리좌표의 실제 위치는 경우(DC의 종류 또는 생성되는 윈도우의 위치)에 따라 달라집니다. 작도 함수들이 사용하는 좌표는 논리좌표입니다.

 

물리좌표: 실제 화면에 출력되는 좌표이며 픽셀 단위를 사용합니다.

물리적인 모니터의 픽셀이 단위이므로 물리좌표(100,100)는 그 위치가 고정입니다. 윈도우를 관리하는 함수(또는메시지)에서사용하는 좌표는 물리적인 좌표입니다.

 

두 가지 좌표의 관계를 정의하는 것을 매핑모드라고 합니다.

매핑 모드는 논리 좌표를 물리 좌표로 변환하는 방법을 의미합니다.

1) 매핑모드의 종류
매핑모드 단위 X축증가 Y축증가
MM_TEXT 픽셀 오른쪽 아래쪽
MM_LOMETRIC 0.1mm 오른쪽 위쪽
MM_HIMETRIC 0.01mm 오른쪽 위쪽
MM_LOENGLISH 0.01 인치 오른쪽 위쪽
MM_HIENGLISH 0.001 인치 오른쪽 위쪽
MM_TWIPS 1/1440 인치 오른쪽 위쪽

디폴트 매핑모드는 픽셀단위인 MM_TEXT 이며 나머지 매핑 모드는 밀리 미터나 인치 등의 단위를 사용합니다.

매핑모드를 변경할 때는 SetMapMode 함수를 사용하며 현재 설정된 매핑모드를 알고 싶을 때는 GetMapMode 함수를사용합니다.

int SetMapMode(int nMapMode);

int GetMapMode( ) const;

SetMapMode 의 인수nMapMode 로변경하고자하는매핑모드를지정해주면된다. 2) 윈도우와 뷰 포트

윈도우(Window)는 논리좌표가 사용되는 표면을 말하며 CDC 의 작도함수는 윈도우에 그래픽을 출력합니다.

뷰포트(Viewport)는 물리좌표가 사용되는 영역을 의미하며 실제로 사용자의 눈에 보이는 좌표영역입니다.

TextOut(100,100,...)함수는 윈도우 영역의(100,100)에문자열을 출력하며 이렇게 출력된 문자열은 뷰 포트를 통해 우리 눈에 보이게 됩니다.

원점(Origin)이란 좌표의기준이되는 점(0,0)의 좌표를 의미합니다.

원점은 매핑 모드에 상관없이 화면의 왼쪽 가장 상단에 위치하고 있습니다.

그래프를 그리고자 할 경우는 원점이 화면의 왼쪽 가장 상단에 있는것보다는 중앙에 있는 것이 더 좋을수도 있습니다.

CPoint SetViewportOrg(int x, int y);

CPoint SetWindowOrg(int x, int y);

각각 뷰 포트와 윈도우의 원점을 인수로 지정한 좌표로 이동합니다.

 

예제) 원점을 이동시켜 문자열을 출력하는 예제(View 클래스의 OnDraw에 작성)

CRect rect;

        GetClientRect(&rect);

        /*

        pDC->SetMapMode(MM_LOMETRIC);

        pDC->SetViewportOrg(rect.right/2, rect.bottom/2);

        CFont font;

        font.CreatePointFont(1000,_T("굴림"));

        pDC->SelectObject(&font);    

        */

        pDC->TextOut(10,10,TEXT("원점이동"));

 


3) 가변비율

일정한 비율로 만들어지는 프로그램은 그림을 그리는 코드나 좌표는 항상 일정하지만 윈도우 확장을 변경함으로써 전체 좌표계의 범위를 조정해 주는 방법을 사용합니다.

윈도우 확장을 조정할 수 있는 매핑모드에는 MM_ISOTROPIC 과 MM_ANISOTROPIC 두가지가 있습니다.

 

CRect rect;

        pDC->SetMapMode(MM_ANISOTROPIC);

        pDC->SetWindowExt(100,100);

        GetClientRect(&rect);

        pDC->SetViewportExt(rect.Width(),rect.Height ());

             pDC->Rectangle(10,10,20,20);

 

4) CWindowDC

윈도우 전체 영역에 출력하고자 할 때 사용하는 DC

이 DC를 이용하고자 할 때는 GetDesktopWindow함수로 바탕화면 윈도우에 대한 핸들을 얻은 후 이 윈도우 핸들을 기반으로 DC를 생성해서 화면에 출력하면 됩니다.

 

예제) 적당한 메시지를 골라서 아래 내용을 출력(임의의 점을 50만개 바탕화면에 출력)

CWnd *hWnd = GetDesktopWindow();

        CWindowDC dc(hWnd);

        int cx = GetSystemMetrics(SM_CXSCREEN);

        int cy = GetSystemMetrics(SM_CYSCREEN);

        int rx, ry;

        int r, g, b;

        srand((unsigned)time(NULL));

        for(int i=0; i<500000; i++)

        {

               rx = rand() * cx / RAND_MAX;

               ry = rand() * cy / RAND_MAX;

               r = rand() * 255 / RAND_MAX;

               g = rand() * 255 / RAND_MAX;

               b = rand() * 255 / RAND_MAX;

               dc.SetPixel(rx, ry, RGB(r, g, b));

        }

        ReleaseDC(&dc);
2. 영역(Region)

- CRgn 클래스

영역을 설정하고 설정된 영역에 여러 동작을 수행할 수 있는 멤버 함수가 구현되어 있는 클래스로 GDI 오브젝트를 지원하는 클래스

멤버 함수로는 영역을 생성하기 위한 함수, 영역을 결합하는 함수, 주어진 영역의 조건을 검사하는 함수 등으로 나누어 집니다.

 

CombineRgn(CRgn* pRgn1, CRgn* pRgn2, int nCombineMode)

2개의 Rgn을 nCombineMode에 따라 조합RGN_AND: 중첩되는 영역 결합RGN_COPY: 첫 번째 영역의 복사본RGN_DIFF: 첫 번째 영역에서 두 번째 영역이 차지하는 영역 제거RGN_OR: 두 영역의 합친 영역RGN_XOR: 두 영역의 합친 영역에서 겹친 영역 제거CopyRgn: 영역 복사CreateEllipticRgn: 타원형의 영역 생성CreatePolygonRgn: 다각형 영역 생성CreateRectRgn: 사각 영역 생성CreateRoundRectRgn: 둥근 사각 영역 생성PtInRegion: 주어진 좌표가 영역 내에 있는지 검사해주는 함수RectInRegion: 주어진 사각형이 영역 내에 있는지 검사해주는 함수

 

영역 내에서 마우스를 클릭 했는 지 검사

CClientDC dc(this);

        dc.FillSolidRect(0,0,100,100,RGB(255,0,0));

        CRgn rgn;

        rgn.CreateRectRgn(0, 0, 100, 100);

        if(rgn.PtInRegion(point) == TRUE)

               AfxMessageBox(TEXT("영역내에서마우스를클릭했습니다"));

        else

               AfxMessageBox(TEXT("영역외부에서마우스를클릭했습니다"));        ReleaseDC(&dc);
예제1. 현재 프로젝트에 다이얼로그(CRgnDlg 클래스) 추가

 

2. 다이얼로그 디자인

 

 

 

 3. 버튼 메시지 작성

 

1) 사각형 버튼 메시지 작성

CRgn rgn;

CRect rect;

GetClientRect(&rect);

rect.top = rect.top + 10;

rect.left = rect.left + 10;

rect.bottom    = rect.bottom - 10;

rect.right = rect.right - 10;

rgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);

SetWindowRgn((HRGN)rgn, TRUE);


2) 둥근 사각형 버튼 메시지 작성

CRgn rgn;

        CRect rect;

        GetClientRect(&rect);

        rect.top = rect.top + 10;

        rect.left = rect.left + 10;

        rect.bottom = rect.bottom - 10;

        rect.right = rect.right - 10;

        rgn.CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, 30, 30);

        SetWindowRgn((HRGN)rgn, TRUE);

 

3) 원형 버튼 메시지 작성

CRgn rgn;

        CRect rect;

        GetClientRect(&rect);

        rect.top = rect.top + 10;

        rect.left = rect.left + 10;

        rect.bottom    = rect.bottom - 10;

        rect.right = rect.right - 10;

        rgn.CreateEllipticRgn(rect.left, rect.top, rect.right, rect.bottom);

        SetWindowRgn((HRGN)rgn, TRUE);

 

4) 다각형 버튼 메시지 작성

        CRgn rgn;

        CPoint ptVertex[5];

        ptVertex[0].x = 180;           ptVertex[0].y = 80;

        ptVertex[1].x = 100;          ptVertex[1].y = 160;

        ptVertex[2].x = 120;          ptVertex[2].y = 260;

        ptVertex[3].x = 240;          ptVertex[3].y = 260;

        ptVertex[4].x = 260;          ptVertex[4].y = 160;

        rgn.CreatePolygonRgn(ptVertex, 5, ALTERNATE);

        SetWindowRgn((HRGN)rgn, TRUE);

 


5) 조합 버튼 메시지 작성

CRgn rgn1, rgn2;

        CRect rect;

        GetClientRect(&rect);

        rgn1.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);

        rect.top = rect.top + 50;

        rect.left = rect.left + 50;

        rect.bottom    = rect.bottom - 50;

        rect.right = rect.right - 50;

        rgn2.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);

        rgn1.CombineRgn(&rgn1, &rgn2, RGN_XOR );

        SetWindowRgn((HRGN)rgn1, TRUE);

 

4. 다이얼로그 헤더 파일을 적당한 클래스에 인클루드 시켜서 다이얼로그를 출력하는 코드 작성

1) #include "RgnDlg.h"

2) CRgnDlg dlg;

        dlg.DoModal();


3. 레이어드(Layered Window)와 AnimateWindow
1) SetLayeredWindowAttributes

윈도우의 투명 효과를 위한 함수

매개변수

COLORREF crKey: 색상 값BYTE bAlpha: 알파 값DWORD dwFlags: 적용 대상LWA_COLORKEY 이면 첫번째 인자 사용, LWA_ALPHA이면 두번째 인자 사용

 

이 함수 사용을 위해서는 윈도우 속성에 확장 스타일 적용을 지정해주어야 합니다.

윈도우의 확장 스타일 적용은

SetWindowLong 함수를 이용합니다.SetWindowLong(윈도우핸들, GWL_EXSTYLE, GetWindowLong(윈도우핸들, GWL_EXSTYLE) | WS_EX_LAYERED);

위 처럼 입력하면 가능합니다.

 

2) AnimateWindow 함수

윈도우에 애니메이션을 적용하고자 하는 경우 사용

BOOL AnimateWindow(

   DWORD dwTime, // 애니메이션이 적용될 시간   DWORD dwFlags // 애니메이션 효과

);

AW_SLIDE: 슬라이드 효과AW_BLEND: 페이드 효과AW_CENTER: 안에서 바깥쪽으로 적용AW_HOR_POSITIVE: 슬라이드와 함께 적용하며 왼쪽에서 오른쪽으로 적용AW_HOR_NEGATIVE: 오른쪽에서 왼쪽으로AW_VER_POSITIVE: 위에서 아래로AW_VER_NEGATIVE: 아래에서 위로

앞에서 작성한 다이얼로그 코드 수정

1) 슬라이더를 1개 추가하고 변수 연결

CSliderCtrl m_Slider;

 

2) OnIniDialog에 작성int answer;        answer = AfxMessageBox(TEXT("레이어드윈도우사용"), MB_YESNOCANCEL);

        HWND hWnd = GetSafeHwnd();

        int speed = 1000;

        switch(answer)

        {

        case IDYES:

               SetWindowLong(hWnd, GWL_EXSTYLE,GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

               SetLayeredWindowAttributes(0, 128, LWA_ALPHA);      

               m_Slider.SetRange(20, 255);

               m_Slider.SetPos(128);

               break;

        case IDNO:

               m_Slider.ShowWindow(SW_HIDE);

               AnimateWindow(speed, AW_BLEND);

               break;

        case IDCANCEL:

               m_Slider.ShowWindow(SW_HIDE);

               AnimateWindow(speed, AW_SLIDE|AW_VER_POSITIVE|AW_HOR_NEGATIVE);

               break;

        }

 

3) 슬라이더의 NM_RELEASEDCAPTURE 메시지에 작성

SetLayeredWindowAttributes(0, m_Slider.GetPos(), LWA_ALPHA);

 

4) Dialog 클래스의 WM_PAINT 메시지에 작성

dc.FillSolidRect(0,0,100,100,RGB(255,0,0));

SetLayeredWindowAttributes(RGB(255,0,0), 0, LWA_COLORKEY);

//빨강색 영역이 흰색으로 처리될 것이며 이 영역은 마우스 메시지를 받지 못함

3. 다이얼로그 박스 제어

1) 크기 변경

기본적으로 다이얼로그의 크기는 제어가 변경이 불가능합니다.

만일 다이얼로그 박스의 크기를 변경가능하게 하려면 Border 속성을 Resizing으로 설정하면 됩니다.

이 때의 문제점은 다이얼로그의 크기가 변경되는데 이 문제는 WM_SIZE 메시지에서 처리가 가능합니다.

SetWindowPos멤버 함수를 호출하여 이 함수에서 크기를 같이 변경되도록 지정하면 됩니다.

 

예제)

1. 대화상자 기반 프로젝트 생성(SizeChange)

 

2. 다이얼로그 디자인

버튼 2개를 적당한 크기로 오른쪽에 배치

 

 

 

 

Border 속성 변경 - Resizing

 

3. 변수 연결

확인 버튼 - m_Button1

자세히 버튼 - m_Button2


4. 다이얼로그 클래스의 OnSize 함수 처리if(m_Button1.GetSafeHwnd() != NULL)

        m_Button1.SetWindowPos(NULL, cx/3*2, cy/5*1, cx/5, cy/5, SWP_NOZORDER);    

if(m_Button2.GetSafeHwnd() != NULL)

        m_Button2.SetWindowPos(NULL, cx/3*2, cy/5*2, cx/5, cy/5, SWP_NOZORDER);

 

2) 자세히와 간략히 다이얼로그 만들기

다이얼로그의 크기를 변경하여 이 기능을 구현할 수 있습니다.

현재 크기는 GetWindowRect로 얻어낼 수 있습니다.

 

1. 현재 다이얼로그 하단에 아무 컨트롤이나 배치

 

  

 

 

2. 변수 선언BOOL m_bFlag; 기본적으로 FALSE로 설정
3. Dialog 클래스에 변수 선언

RECT rect;

 

4. Dialog 클래스의 OnInitDialog 함수에 작성

GetClientRect(&rect);

 

5. 간단히 버튼의 BN_CLICKED 메시지에 작성if(m_bFlag == FALSE)

{

        m_Button2.SetWindowText(_T("자세히"));

        SetWindowPos(NULL,0,0,rect.right, rect.bottom-30,SWP_NOMOVE|SWP_NOZORDER);

        m_bFlag = TRUE;

}

else

{

        m_Button2.SetWindowText(_T("간단히"));

        SetWindowPos(NULL,0,0,rect.right, rect.bottom+40,SWP_NOMOVE|SWP_NOZORDER);

        m_bFlag = FALSE;

}


4. 커스텀 컨트롤

기본적으로 모든 컨트롤의 모양은 정해져 있지만 사용자가 컨트롤을 직접 제작하여 사용할 수 있습니다.

GDI 함수들만 적절히 이용해도 원하는 모양의 버튼이나 컨트롤을 만들 수 있습니다.1) 사용자가 그린 그림이 버튼 처럼 동작하기- SDI 옵션으로 프로젝트 생성(DrawindButton)

 

- View 클래스에 2개의 변수 선언

CRect   m_Rect;

BOOL    m_bFlag;

 

- View 클래스의 생성자에서 선언한 변수 직접 초기화

m_Rect = CRect(10, 10, 200, 50);

m_bFlag = FALSE;

 

- View 클래스의 WM_LBUTTONDOWN 메시지 작성if(m_Rect.PtInRect(point))

{

        m_bFlag = !m_bFlag;

        RedrawWindow(&m_Rect);

}

 


- View 클래스의 WM_LBUTTONUP 메시지 작성

srand(time(NULL));

if(m_bFlag)

{

        m_bFlag = !m_bFlag;

        RedrawWindow(&m_Rect);

}

if(m_Rect.PtInRect(point))

{

        RECT rect;

        GetClientRect(&rect);

        CClientDC dc(this);

        int x;

        int y;

        for(int i = 0; i<10; i++)

        {

        x = rand();

        y = rand();

        dc.Rectangle(x%rect.right, x%rect.bottom,x%rect.right+20, x%rect.bottom+20);

        }

        ReleaseDC(&dc);

}

 


- View 클래스의 WM_PAINT 메시지에 작성

CRect Rect(m_Rect);

dc.Rectangle(&Rect);

dc.FillSolidRect(&m_Rect, RGB(255,0,0));

dc.SetBkMode(TRANSPARENT);

dc.SetTextColor(RGB(0,0,255));

if(m_bFlag)

{

CRect Rect = m_Rect;

Rect += CRect(0, 0, 2, 2);

dc.DrawText(_T("사각형그리기"), &Rect,       DT_CENTER | DT_SINGLELINE | DT_VCENTER);

}

else

{

dc.DrawText(_T("사각형그리기"), &Rect,       DT_CENTER | DT_SINGLELINE | DT_VCENTER);

}


2) 커스텀 컨트롤 만들기

커스텀 컨트롤을 만들 때는 일반 DLL로 프로젝트를 생성해서 CWnd로부터 상속받는 클래스로 생성해서 메시지를 처리해주면 됩니다.

메시지를 처리할 때는 부모 윈도우에게 메시지를 전달하는 형태를 취하면 됩니다.

 

- 커스텀 컨트롤 제작하기1. 일반 DLL 프로젝트 생성(MFC를 정적으로 링크한 기본 DLL – Custom 프로젝트)

 

2. CWnd 클래스로부터 상속받는 클래스 생성(CCustomButton)

 

3. CCustomButton 클래스의 WM_PAINT 메시지 작성

CBrush curbrush, *pOldBrush;

CRect rect;

GetClientRect(&rect);

dc.SetBkMode(TRANSPARENT);

curbrush.CreateSolidBrush(RGB(255, 0, 0));

pOldBrush = (CBrush *)dc.SelectObject(&curbrush);

dc.SetTextColor(RGB(0,0,255));

dc.Ellipse(rect);

dc.DrawText(_T("사각형그리기"), &rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

 

4. CCustomButton클래스의 WM_LBUTTONDOWN 메시지 작성

GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID(), (LONG)GetSafeHwnd());

 


5. CCustomButton클래스를 등록할 RegisterWindow 함수 생성(static으로 생성)

BOOL CCustomButton::RegisterWndClass(HINSTANCE hInstance)

{

WNDCLASS wndClass;

    wndClass.lpszClassName = TEXT("CustomButton");

    wndClass.hInstance = hInstance;

    wndClass.lpfnWndProc = CustomButtonProc;

    wndClass.hCursor = ::LoadCursor(NULL, IDC_ARROW);

    wndClass.hIcon = 0;

    wndClass.lpszMenuName = NULL;

    wndClass.hbrBackground = (HBRUSH) ::GetStockObject(LTGRAY_BRUSH);

    wndClass.style = CS_GLOBALCLASS;

    wndClass.cbClsExtra = 0;

    wndClass.cbWndExtra = 0;

    return (::RegisterClass(&wndClass) != 0);

}

 

6. 메시지 처리 함수 선언CCustomButton의 구현 파일 상단에 전역 함수로 작성

LRESULT CALLBACK CustomButtonProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

        CWnd* pWnd;

        pWnd = CWnd::FromHandlePermanent(hWnd);

        if (pWnd == NULL)

        {

               pWnd = new CCustomButton;

               pWnd->Attach(hWnd);

        }

        return AfxCallWndProc(pWnd, hWnd, message, wParam, lParam);

}

 

7. App 클래스의 InitInstance 함수에 작성

AFX_MANAGE_STATE(AfxGetStaticModuleState());

CCustomButton::RegisterWndClass((HINSTANCE)AfxGetInstanceHandle());

return CWinApp::InitInstance();8. App클래스에 CCustomButton 버튼의 헤더파일 인클루드

 

9. DLL  함수 작성

extern "C" __declspec(dllexport ) void LoadCustomButton()

{

}

 

- 커스텀 컨트롤을 사용하는 프로젝트 생성1. 대화상자 기반으로 프로젝트 생성

 

2. 앞에서 생성한 DLL 파일과 LIB 파일을 복사

 

3. 프로젝트 속성에 Custom.lib 추가

 

4. Dialog 클래스의 구현 파일 전역부에 Dll import 함수 선언extern "C" __declspec(dllimport)void LoadCustomButton();

 

5. Dialog 클래스의 OnInitDialog 함수에 작성

LoadCustomButton();

 

6. 다이얼로그에 커스텀 컨트롤을 배치하고 Class 란에 RegisterClass에서 등록한 클래스 이름을 기재

CustomButton

 

빌드해서 화면에 나타나는지 확인

 


7. Dialog 클래스에 컨트롤의 메시지를 처리할 함수 추가void OnCustomButton(void)

{

        RECT rect;

        GetClientRect(&rect);

        CClientDC dc(this);

        int x;

        int y;

        for(int i = 0; i<10; i++)

        {

        x = rand();

        y = rand();

        dc.Rectangle(x%rect.right, x%rect.bottom,x%rect.right+20, x%rect.bottom+20);

        }

        ReleaseDC(&dc);

}

 

8. 대화상자 클래스의 BEGIN_MESSAGE_MAP에서 함수와 메시지 연결

ON_CONTROL(0, IDC_CUSTOM1, OnCustomButton)

 


5. 배포 프로젝트 생성

설치 및 배포 프로젝트는 Install Shields나 Install Factory같이 사용자를 위한 셋업 프로그램을 만들 수 있도록 제공되는 기능입니다.

프로그래머는 이 설치 및 배포 프로젝트를 이용해 사용자가 보다 편리하게 프로그램을 설치할 수 있도록 할 수 있습니다.

1. 프로젝트가 속한 솔루션에 설치 및 배포 프로젝트를 추가합니다.

 

2. 설치 프로젝트를 선택한 상태에서 마우스 오른쪽 클릭을 한 다음, 메뉴가 나타나면, 추가 - 프로젝트 출력을 선택합니다.

이 때, 발견된 종속성에는 만약 배포하고자 하는 프로젝트에 .NET Framework에서 제공하는 참조(DLL 등) 이외에 추가적인 참조가 존재한다면, 자동적으로 포함이 됩니다.

추가가 되지 않는 경우도 있는데, 이 때는 직접적으로 추가를 해야 합니다.

 

3. 속성 창의 항목들은 기본적으로 속성 이름을 통해 그 역할을 직관적으로 이해할 수 있습니다.

1) RemovePreviousVersion은 새로운 배포 버전을 설치할 때 이전 버전의 프로그램을 제거하고 설치할 것인지를 설정하는 속성입니다.

버전은 프로그램의 버전이 아닌 셋업 프로그램의 버전을 보고 판단합니다.

 

2) 파일 시스템

파일 시스템 항목은 우리가 배포하고자 하는 항목을 사용자 시스템의 어느 곳에 위치시킬 것인지를 결정하는 속성입니다.

설치 프로젝트에 배포하고자 하는 프로젝트를 추가하면 디폴트 값으로 응용 프로그램 폴더에 실행 파일이 추가됩니다.

이 실행 파일의 바로 가기를 바탕화면에 추가하고자 한다면 프로젝트의 기본 출력(활성)에서 마우스 오른쪽을 클릭한 다음, 바로 가기 추가를 선택하여 바로 가기를 만듭니다. 그리고 이 바로 가기를 드래그 & 드롭을 이용해 사용자 바탕화면으로 이동시키면 됩니다.

 

반응형

'C & C++ > MFC 컨트롤' 카테고리의 다른 글

[Dialog] 모서리가 둥근 윈도우  (0) 2011.04.25
프린트 인쇄 미리보기  (0) 2011.04.25
[Tree] 트리 컨트롤러  (0) 2011.04.25
[Slider] 비트맵 슬라이더  (0) 2011.04.25
[Etc] 가위, 바위, 보 게임  (0) 2011.04.18

댓글