처음에 프로젝트를 진행하다가 콤보박스를 제대로 작동하게 하는 설명이 되어있는 곳이 없어서

고생을 많이 했던 생각에 이렇게 올립니다.


---> MFC AppWizard로  formview 나 dialog기반의 프로젝트를 생성한다.  <---


1. Workspace의 ResourceView탭을 선택한후


2.resources->dialog 하위 메뉴를 보면   IDD_Dialog이름이 보이는데 더블 클릭하면

  다이얼로그를  수정할 수 있는 창이 보이며,  팝업 메뉴창이 하나 뜬다.


3. 팝업 메뉴의 Combobox를 선택한다.

사용자 삽입 이미지
4.콤보박스를 클릭하면 십자가 모양이 생기는데 원하는 부분에 표를 만들듯이 시작 위치에서
  클릭한 후 끝에서 떼면 콤보박스가 만들어 진다.
 
사용자 삽입 이미지

 
4-1. 콤보박스의 화살표 부분을 클릭하면 하위 메뉴의 길이부분까지 선택범위가 넓어지는데 원하는
   메뉴의 수 만큼 길이를 조절해 주면 된다.
   (참고) 선택점에는 검정색과 투명한점이 있는데 투명한 점은 이동점이고,
             검은색 점은 크기조절점이다.
 
5. 콤보박스에서 오른쪽 버튼을 누르면 단축메뉴가 뜨는데 여기서 Properties를 클릭하면
    콤보박스의 환경을 설정할 수 있는 창이 뜬다.
 
 
사용자 삽입 이미지
6. General탭의 ID 에서 콤보박스의 이름을 변경할 수 있고,
   Data 탭을 선택후 메뉴의 목록을 써 넣는다. 이 때 다음 메뉴는 Ctrl+Enter를 치고 쓰면 된다.
   여기까지 하고 프로그램을 실행하게 되면 콤보박스에 적어넣은 메뉴가 나타나게 된다.
사용자 삽입 이미지
 
 
 
7. 이제 단축키 Ctrl+W 를 이용해 클래스 위자드를 실행한다.
 
8. Object IDs에서 콤보박스의 이름을 클릭, Messages에서 CBN_SELCHANGE를 더블클릭하면
    Add Member Function이라는 대화상자가 뜬다. 이때 명령어를 바꾸어 줄수 있다.
    Ok버튼을 누른면 Member Functions의 내용에 OnSelChangeCombo1(입력한명령어)라는
    한줄이 추가되는데 더블클릭하거나 클래스위저드 메뉴의 Edit Code를 클릭하면 수정할 수있는
    코딩창이 뜨게 된다.
 
사용자 삽입 이미지
 
9. 다시 클래스 위저드를 실행시켜 Member variables탭을 선택한다.
   Control IDs의 콤보박스 ID를 선택한 후 Add Variable을 클릭하면 멤버를 입력할 수 있는 대화
   상자가 뜬다. 여기서 원하는 이름을 입력후 category는 control을 선택하고, Variable type 는
   Ccombobox 를 선택한다. OK버튼을 누르면 멤버가 생성된 것이 보인다.
사용자 삽입 이미지
 
 
10. workspace의 FileView탭을 선택한 후 작업하고 있는 다이얼로그의 헤더파일에 정의되어있는
     클래스에 CString 계열의 문자열 이름을 적어 넣는다. ex) CString 원하는이름;
사용자 삽입 이미지
 
 
 
11. 다시 리소스탭으로 돌아가 콤보박스를 더블클릭하고 코딩창에 아래의 내용을 입력한다.
///////////////////////////////////////////////////////////////////////////////////////

void COfdmDlg::OnSelchangeCOMBOChannel() //입력했던 명령어
{

 int nIndex;
 nIndex = m_Channel.GetCurSel();  
// 현재 선택된 항목의 인덱스를 얻음

 m_Channel.GetLBText(nIndex, Ch_type);   //인덱스에 해당하는 문자열 얻음
 SetDlgItemText(IDC_COMBO_Channel, Ch_type); 
//선택된 항목의 문자열 출력
 if(Ch_type=="실행명령1")
 {
 
  원하는 명령;
   
 }
 
 
 else if(Ch_type=="실행명령2")
{
   원하는 명령;
}

else
 
 {
  원하는 명령;
 }
 
}
///////////////////////////////////////////////////////////////////////////////////////
 
여기서 m_Channel은 9번 단계에서 설정한 이름이고, Ch_type는 6번 단계에서 입력한 문자열이다.
한마디로 Ch_type의 문자열을 비교하면서 선택된 문자열에서 원하는 명령을 실행시켜 주는것이다.
 
  1. Favicon of http://cyworld.com/neige486 BlogIcon 셈틀 김지훈 2009.06.10 20:53 신고

    헉... 도현이 형

    저 04학번 지훈이예요 -_-
    MFC 콤보박스 사용법 찾다가 우연히 발견했어요 ㅋㅋ 이런 우연이 ㅠ_ㅠ

  2. 정말 2010.08.02 17:44 신고

    딱 제가 찾던 겁니다.
    갑사합니다..ㅠㅠㅠ
    완전 고생하고 있었는데요..ㅠㅠ

<SetPixelFormat>


SetPixelFormat 함수는 지정된 디바이스 컨텍스트의 픽셀 포맷을 iPixelFormat 인덱스가 가르키는 포맷으로 설정합니다.


BOOL SetPixelFormat(

  HDC hdc;           //픽셀 포맷을 설정하려는 디바이스 컨텍스트
  int iPixelFormat;   //픽셀 포맷 인덱스(1기준)
 
CONST PIXELFORMATDESCRIPTOR* ppfd;
                       //논리적인 픽셀 포맷 사양에 대한 포인터

 );


[파라미터]

hdc

  픽셀 포맷을 설정하려는 디바이스 컨텍스트를 지정.

iPixelFormat

  설정하려는 픽셀 포맷을 가리키는 인덱스.
  디바이스 컨텍스트가 지원하는 여러 픽셀 포맷이 1-기준의 인덱스로 지정됩니다.

ppfd

  논리적인 픽셀 포맷 사양을 포함하고 있는 PIXELFORMATDESCRIPTOR 스트럭쳐의 포인터.  시스템의 메타파일 컴포넌트는 이 스트럭쳐를 이용하여 논리적인 픽셀 포맷 사양을 기록합니다.  이 스트럭쳐는 SetPixelFormat 함수의 동작 외에는 아무 효과가 없습니다.


[반환 값]

함수가 성공하면, TRUE를 반환합니다.

함수가 실패하면, FALSE를 반환합니다.
확장 오류 정보를 얻으려면,
GetLastError를 호출합니다.

[주의]

hdc가 윈도우를 참조하면, SetPIxelFormat 함수 호출은 그 윈도우의 픽셀 포맷도 변경합니다. 두 번 이상 윈도우의 픽셀 포맷을 설정하는 것은 윈도우 매니저와 멀티쓰레드 응용프로그램에 복잡함을 유발시킬 수 있으므로, 허용되지 않습니다. 어플리케이션은 한 윈도우의 픽셀 포맷을 한번만 설정할 수 있습니다. 한 윈도우의 픽셀 포맷이 설정되면, 이를 변경할 수 없습니다.

wglCreateContext 함수를 호출하기 전에 디바이스 컨텍스트 내의 픽셀 포맷을 선택해야 합니다.

wglCreateContext 함수는 디바이스 상에 그리기 위한 렌더링  컨텍스트를 디바이스 컨텍스트의 선택된 픽셀 포맷 내에 생성합니다. OpenGL 윈도우는 자체의 픽셀 포맷을 지닙니다. 이런 이유로, OpenGL 윈도우의 클라이언트 영역에서 나온 디바이스 컨텍스트를 만이 윈도우에 그릴 수 있게 됩니다. 결과적으로, OpenGL 윈도우는 WS_CLIPCHILDREN WS_CLIPSIBLINGS 스타일을 가지고 생성되어야 합니다. 그리고, 윈도우 클래스 속성은 CS_PARENTDC 스타일을 포함하지 않아야 합니다.

다음 코드는 SetPixelFormat의 사용예입니다.


PIXELFORMATDESCRIPTOR pfd = {

        sizeof(PIXELFORMATDESCRIPTOR), //pfd 크리
        1,                           //버젼 번호
        PFD_DRAW_TO_WINDOW |   //윈도우 지원
        PFD_SUPPORT_OPENGL |    //OpenGL 지원
        PFD_DOUBLEBUFFER,        //더블 버퍼링
        PFD_TYPE_RGBA,            //RGBA 타입
        24,                          //24-비트 컬러 깊이
        0, 0, 0, 0, 0, 0,              //컬러 비트 무시
        0,                            //알파 버퍼 없음
        0,                            //시프트 비트 무시
        0,                            //누적 버퍼 없음
        0, 0, 0, 0,                   //누적 비트 무시
        32,                          //32-비트 Z-버퍼  
        0,                           //스텐실 버퍼 없음
        0,                           //보조 버퍼 없음
        PFD_MAIN_PLANE,           //main 레이어
        0,                           //예약됨
        0, 0, 0                      //레이어 마스크 무시

);

HDC hdc;

int iPixelFormat;

//디바이스 컨텍스트에 대한 가능한 최상의 일치하는 픽셀 포맷을 얻음

iPixelFormat = ChoosePixelFormat(hdc, &pfd);

//디바이스 컨텍스트의 픽셀 포맷을 설정

SetPixelFormat(hdc, iPixelFormat, &pfd);


[정보]

헤더 파일: wingdi.h

라이브러리:opengl32.lib

TransparentBlt(화면DC, 출력좌표x, 출력좌표y, 넓이, 높이, 메모리DC, 원본좌표x, 원본좌표y, 넓이, 높이, 칼라키);

 

BOOL TransparentBlt(
  HDC hdcDest,        // handle to destination DC
  int nXOriginDest,   // x-coord of destination upper-left corner
  int nYOriginDest,   // y-coord of destination upper-left corner
  int nWidthDest,     // width of destination rectangle
  int hHeightDest,    // height of destination rectangle
  HDC hdcSrc,         // handle to source DC
  int nXOriginSrc,    // x-coord of source upper-left corner
  int nYOriginSrc,    // y-coord of source upper-left corner
  int nWidthSrc,      // width of source rectangle                       <=    1
  int
nHeightSrc,     // height of source rectangle                       <=    2
  UINT crTransparent  // color to make transparent
);

+ Recent posts

티스토리 툴바