API

대화상자와 등록 정보 시트 소프트웨어

디버그정 2008. 8. 6. 15:52
대화상자와 등록 정보 시트 소프트웨어

2005/03/10 10:13

복사 http://blog.naver.com/semigifn/10835249

제 3장 .대화상자와 등록 정보 시트  *기본:-대화상자에서 컨트롤을 생성 하는 것은 아주 쉽다.그것은 리소스 편집기 에서 정의 되는 대화 템플릿에서 크기와 위치가 정해지고 응용프로그램에 연결된다.대화상자는 기본적으로 두가지의 종류로 나누어 지는데 그것은 모달과 비모달이다.모달 대화상자는 그 대화상자가 사라질 때 까지 응용프로그램이 작동하지 못하도록 하며 비모달 대화상자는 창과 거의 비슷한 속성을 지니며 사용자는 얼마든지 주창이나 다른 윈도를 실행할수 있다. *****모달 대화상자:-모달 대화상자를 만드는데에는 세단계의 구현과정이 있다.첫 번째는 대화상자 템플릿을 생성하고 두 번째는 CDialog객체를 구축하고 마지막 세 번째는 DoModal을 호출하여 대화상자를 나타나게 한다. *대화상자 템플릿:-대화상자 템플릿은 대화상자의 기초적인 등록정보를 정의하며 대화상자를 생성하는 방법은 두가지가 있는데 첫 번째는 프로그래밍으로 하는 방법(여기에는 어떤 클래스(CEdit,CButton,CStatic등 컨트롤의 클래스를 파생하여 그것을 정의해줄수도 있고 리소스 스크립트라고 불리는 스크립트를 사용하는 방법도 있고 구조체 DLGTEMPLATE과 DLGITEMPLATE를 초기화하여 사용하는 방법) 두 번째는 보통 많이 쓰는 방법으로 비주얼 C++리소스 편집기를 사용하거나 SDK의 대화상자 편집기를 사용하거나기타의 다른 편집 도구를 사용하는 방법이 있다. *다이얼 로그박스의 스타일:-WS_VISIBLE:이 스타일을 줌으로써 다이얼로그 박스를 보이게 할 수가 있다.즉 다이얼로그 박스도 하나의 윈도 이므로 반드시 ShowWindow를 호출해야만 보이는데 이 스타일은 호출할 필요 없이도 바로 다이얼로그 박스를 보이게 한다.-WS_CAPTION:대화상자에 제목 표시줄을 제공한다.-WS__POPUP:아이얼로그 박스는 팝업창이므로 반드시 지정해 주어야한다.-WS_SYSMENU:제목 표시줄에 닫기단추 즉 시스템 메뉴를 추가한다. ***DS로 시작하는 것은 대화상자에 한정된다.-DS_MODALFRAME:다이얼로그박스는 모달 대화상자가 된다.이 스타일은 다이얼로그 박스 겉에다가 아무런 표시도하지 않는다.(예전에는 두꺼운 선을 그렸었다.)-DS_CENTER:대화상자를 화면의 중심에 오도록 한다.-DS_CONTEXTHELP:대화상자 제목 표시줄에 물음표를 추가하여 사용자가 그 대화상자의컨트롤에 관련된 문맥에 맞는 도움말을 얻을수 있게한다. *-DS_SYSMODAL:이 스타일은 시스템 모달을 생성하는데 시스템 모달이란 예전에는 치명적인 에러를 나타내는데 전형적으로 사용되었는데 윈도 98에서는 처리과정이 서로 독립 되어 있기 때문에 이 스타일은 단지 그 대화상자를 최상위 창으로 만든다.그러나 사용자는 얼마든지 다른 응용프로그램으로 전환할수 있다. *참고 사항:-다이얼 로그 박스에서의 단위는 윈도우에서의 단위와는 다르다.수평적으로는 기본 대화상자의기본 대화상자의 글꼴의 4분의 1높이에 가깝고 수직적으로는 문자 높이의 8분의 1에 가깝다. *기본적으로 다이얼로그는 Create명령문으로 프로그램에서도 생성할수도 있으며 리소스 편집기에서도 생성할수도 있다. 다이얼로그 박스에서 생성할수 있는 컨트롤은 앞장에서 본것과 같다.(LTEXT,CTEXT,RTEXT,PUSHBUTTON,DEFPUSHBUTTON,EDITTEXT,CHECKBOX,AUTOCHECKBOX,STATE3,AUTO3STATE,RADIOBUTTON,AUTORADIOBUTTON,GROUPBOX,LISTBOX,COMBOBOX,SCROLLBAR,ICON)->기본 스타일과 충돌하는 스타일을 주면 기본적으로 여러분이 주는 스타일이 선택된다. *저번장에서 사용자가 윈도에 컨트롤을 그릴 때는 키보드 인터 페이스를 일일이 추가 해야만 했다.그러나 다이얼로그박스에 컨트롤을 그릴때는 사용자가 키보드 인터페이스를 추가할 필요가 없다.다이얼로그박스에서는 윈도가 자동으로 키보드 인터페이스를 추가해준다.이러한 키보드 인터페이스에 영향을 미치는 요인으로는사용자가 키보드를 정의하는 순서,단축키를 정의하는 &의 사용,그룹 컨트롤에 WS_GROUP 속성,기본 누르기 단추를 지정하는 DEFPUSHBUTTON의 사용등이 영향을 끼친다.탭키는 반드시 WS_TABSTOP를 지정해주어야한다. *****다이얼로그 박스가 만들어지면 윈도는 다이얼로그박스에게 OnInitDialog를 호출한다. 리소스 에디터로 생성하지 않고 여기에서 적당한 컨트롤들을 생성 시켜줄수도 있다.다이얼로그박스는 다른 윈도우 처럼 WM_COMMAND나 다른 메시지를 받을 수도 있으나 WM_INITDIALOG 메시지 만이 다른 윈도 들과 구별된다. *대화상자의 데이터와 컨트롤에 안전하게 액세스하기:-방법1:대화상자를 CDialog에서 파생시키고 그 대화상자와 관련된 데이터와 컨트롤들을 대화상자클래스의 데이터 멤버로 선언한다.참고->고전적인 방법 -방법2:대화상자를 CDialog에서 파생시키고 그 대화상자의 컨트롤과 DoDataExchange에서 서로 연결 시킬수가 있다.이렇게 하면 그 데이터를 억세스 함에따라 그 컨트롤의 내용이 변경된다.->예전에 했던 프로그램(클래스 위자드로 자동으로 연결 시켜주면 된다.)-방법3:2번과 비슷한 방법이라고 생각되는데 OnInitDialog안에서 CWnd::Attach를 사용하여 그 컨트롤 객체를 컨트롤 창에 할당한다. *다이얼 로그 박스 생성하기:-이것은 단지 DoModal함수를 호출하면 된다.이 함수는 그 대화상자가 사라진후가 될 때까지 반환하지 않는다.그리고 이함수가 반환할 때는 OK버튼을 누르고 사라진다면 IDOK를 반환하고 아니라면 IDCANCEL을 반환한다.(다른 경우도 있다.) *****대화상자의 컨트롤과 데이터 멤버를 연결하기:그것은 클래스 위자드에서 변수 추가에서 목록 상자의 컨트롤 ID를 입력하고 변수 추가를 선택한다.이렇게 함으로써 컨트롤들은 자동으로 해당 컨트롤에 자동으로 연결되며 컨트롤의 내용이 변경 됨에따라 자동으로 변수에 세트 된다.*DDX/DDV의 작동순서:DDX는 어떤 컨트롤과 어떤 클래스의 멤버 데이터를 연결 시키는 것으로써대화상자가 생성될 때 불리는 OnInitDialog함수는 UpdateData(FALSE)를 호출함으로써 컨트롤에게 멤버데이타 값을 보낸다.그리고 OK버튼이 눌리면 이는 UpdateData(TRUE)를 호출함으로써 변수의 내용을 다시 멤버데이타에게로 보낸다.DDX_Text:짧은 정수,UINT형,긴정수,DWORD,CString,실수,배밀도 실수 등을 편집 컨트롤에 연결한다.DDX_Check:정수 변수를 체크상자에 연결한다.DDX_Radio:정수변수를 라디오 단추에 연결한다.DDX_LBIndex:정수 변수를 목록상자에 연결한다.DDX_LBString:CString변수를 목록 상자에 연결한다.DDX_LBStringExact:CString변수를 목록 상자에 연결한다.DDX_CBIndex:정수변수를 콤보 상자에 연결한다.DDX_CBString:CString변수를 콤보 상자에 연결한다.DDX_CBStringExact:CString변수를 콤보 상자에 연결한다.DDX_Scroll:정수 변수를 스크롤바에 연결한다.DDV는 두가지로 나눌수 있다.DDV는 숫자변수가 지정된 범위내에 있는지 검증하는 것과 CString 형 변수가 어떤 값을 초과 하지 않는가를 검증하며 DDV루틴은 DDX루틴 바로뒤에 위치해야한다.DDV_MinMaxByte:BYTE값이 지정된 범위안에 있는지를 검증한다.DDV_MinMaxInt:int값이 지정된 범위내에 있는지 검증한다.DDV_MinMaxLong:long값이 지정된 범위안에 있는지 검증한다.DDV_MinMaxUINT:UINT값이 지정된 범위안에 있는지 검증한다.DDV_MinMaxDWord:WORD값이 지정된 범위안에 있는지 검증한다.DDV_MinMaxFloat:float값이 지정된 범위안에 있는지 검증한다.DDV_MinMaxDouble:ldouble값이 지정된 범위안에 있는지 검증한다.DDV_MaxChars:CString 변수가 지정된 문자수 이하에 있는지를 검증한다.예를 들어본다면void CMyDialog::DoDataExchange(CDataExchange *pDX){DDX_Text(pDX,IDC_EDIT,m_nIntVal);DDV_MinMaxInt(pDX,m_nIntVal,0,100);}이것은 컨트롤아이디가 IDC_EDIT인 에디트 상자를 m_nIntVal에 연결하고 이값은 0부터 100사이의 값으로 제한한다. *방법 3으로 컨트롤을 만들기:-이방법은 어제 했던 컨트롤을 만드는 방법중 2번째 해당하는 방법으로 컨트롤의 클래스를 파생시키고 거기에서 특성에 맞게 몇 개의 함수를 추가하거나 새로운 특성을 정의 해주는 것이다.만약 내가 CEdit 에서 파생한 CNumEdit 클래스를 만들었다고 가정해보자.그렇다면 오버라이드 된 함수(메시지)들을 어떻게 불러 줄것인가?(강제적으로는 불러 줄 수는 있다.)그러나 자동으로 CNumEdit로 불러주고 없다면 CEdit를 찾아갈수 있게 할수는 없을까?이것의 해결책은 CWnd::SubclassDlgItem함수이다.(다른 방법도 있을 것 같다.메시지 맵이거나 C++에서는 이것이 자동으로 되지 않나?)어쨌든 SubclassDlgItem함수의 해결책을 찾아본다면  1.리소스 스크립트로 컨트롤을 포함 시킨다.2.대화상자의 클래스에서 파생된 클래스의 개체를 선언 한다.(자동으로 된다.) 3.OnInitDialog함수를 오버로딩하여 그객체의 SubclassDlgItem을 호출한다. 예를든다면 CNumEdit m_ctlNumEdit;....//OnInitDialog에서 m_ctlNumEdit.SubclassDlgItem(IDC_NUMEDIT,this);이렇게 하면 된다.이렇게 하면 이 컨트롤 Edit Box에서 발생한 메시지는 CNumEdit클래스에서 처리가 된다. *****비 모달 대화상자:-비모달 대화상자는 모달 대화상자의 변형으로써 Create를 호출함으로써 만들어진다.또한 비모달 대화상자는 대화상자가 만들어지자마자 반환한다.(모달 대화상자는 대화상자가 없어지고 나서야 리턴 값을 반환한다.)또한 비모달 대화상자는 DestroyWindow를 호출함으로써 사라진다.또한 OnOK나 OnCancel를 호출하면 안되는데 왜냐하면 이두함수 모두 EndDialog를 호출하기 때문이다.만약에 사용하려한다면 자신만의 함수로 오버로딩 시켜야 될 것이다.일반적으로 MFC는 비모달 대화상자의 사용을 모달 대화상자를 사용하는 것과 거의 다르지 않도록 비모달 대화상자에 대한 인터 페이스를 일반화한다.