1. 모달형 다이얼로그
2. 모델리스형 다이얼로그
3. 폼 기반 윈도우 프로그램
4. 파일열기 모달형 다이얼로그

 

다이얼로그

① 모달(Modal)형 다이얼로그 : 대화상자를 닫기 전 다른 윈도우로 전환할 수 없는 대화상자

② 모델리스(Modeless)형 다이얼로그 : 대화상자를 열어 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자

 

1. 모달형 다이얼로그

- 다이얼로그가 최우선 순위

- 대표적인 다이얼로그 형태 MessageBox()

 

- MessageBox()를 이용한 모달형 다이얼로그 확인 예제

리소스 - Menu - 모달형 메뉴 추가 후 ID 편집으로 ID 확인

 

WM_command 에서 MessageBox() 띄우는 간단한 예시 코드 작성

 

모달형 메시지 박스

 

※ 모달 대화 상자 생성 함수

DialogBox() 

INT_PTR DialogBox(
   HINSTANCE hInstance,
   LPCTSTR lpTemplate,
   HWND hWndParent,
   DLGPROC lpDialogFunc
);

 

 

※ 폼 생성과 lpTemplate 설정

폼 아이디 → 고유 값

폼 아이디를 변환하는 매크로 함수 MAKEINTRESOURCE() → lpTemplate에 지정

 

폼 생성

 

※ 다이얼로그 프로시저

:: 일반 윈도우 메시지와 동일하다. 콜백 함수의 형식을 가진다(메세지에 따라 반응).

DLGPROC Dlgproc;

INT_PTR CALLBACK Dlgproc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
);

DialogProc과 WndProc 차이

- WndProc 메세지 처리 → DefWindowProc

- Dialog 메세지 처리 → TRUE, FALSE

 

 

※ EndDialog() 함수 호출

- 다이얼로그 해제되면서 부모 윈도우로 리턴해줄 수 있음. 이때 사용

BOOL EndDialog(
  HWND    hDlg,
  INT_PTR nResult
);

 

nResult :: 부모 윈도우에게 전달되는 값(전역변수). 기본 값 = 0 

 

→ 기본적인 해제 적용 방법? WM_CLOSE에서 EndDialog() 호출

 

DlgProc 선언
위 메시지 박스 코드 바로 아래에 DialogBox 함수 작성
About 함수를 복사해온 후 일부 코드 추가

Close 버튼과 OK 버튼, 취소 버튼 등을 누르면 EndDialog() 함수가 실행이 되면서 다이얼로그 창이 해제된다.

 

DialogBox 메세지


2. 모델리스형 다이얼로그

※ 생성 함수 CreateDialog 

- 모달 다이얼로그를 생성하는 DialogBox 함수와 이름만 다를 뿐 매개변수는 똑같다.

HWND CreateDialog(
   HINSTANCE hInstance,
   LPCTSTR lpTemplate,
   HWND hWndParent,
   DLGPROC lpDialogFunc
);

 

※ 모달형과 폼 생성 방법은 동일하다.

주의할 사항은 폼 속성 중에 Visible을 True로 설정해야 한다는 것! 

 

 

※ 해제 함수 DestroyWindow

BOOL DestroyWindow(HWND hWnd);

→ WM_CLOSE에서 호출한다.

 

리소스 메뉴 추가
visible = TRUE
WM_command case 문 추가
WndProc에 추가
메뉴
결과


3. 폼 기반의 윈도우 프로그램

:: WinMain()과 DialogBox() 호출 필요함 

DialogBox(인스턴스, 다이얼로그 아이디, 0, 콜백함수) → 부모 윈도우 자리에 0

 

※ DialogProc 연결

전체 코드(비교적 짧다)
빈 창

 

※ 타이틀 바꾸기

1. 리소스 속성창에서 변경

타이틀 변경

2. SetWindowText()로 변경

 

다이얼로그 시작시 제목을 "이미지"로 변경하고자 함
변경 확인


4. 파일열기 모달형 다이얼로그

:: 파일경로, 파일명을 알아오는 기능, #include <commdlg.h>

 

※ 생성 함수 GetOpenFileName

BOOL GetOpenFileNameA(
  LPOPENFILENAMEA lpofn
);

GetOpenFileName의 매개변수로는 OPENFILENAME이라는 구조체가 들어가며, 이 구조체 안에는 수많은 정보가 있다.

typedef struct tagOFN_NT4A {
  DWORD         lStructSize; //구조체 크기(몇 바이트 차지하는지)
  HWND          hwndOwner; //부모 윈도우 핸들
  HINSTANCE     hInstance;
  LPCSTR        lpstrFilter; //파일형식 설명 → \*.확장자\0 방식
  LPSTR         lpstrCustomFilter;
  DWORD         nMaxCustFilter;
  DWORD         nFilterIndex; //선택한 파일 인덱스, 1부터 시작
  LPSTR         lpstrFile; //전체 경로를 저장할 배열 설정. static 변수 또는 전역변수로 설정
  DWORD         nMaxFile; //파일경로 최대 길이 설정
  LPSTR         lpstrFileTitle; //파일명을 저장할 배열 설정. static 변수 또는 전역변수로 설정
  DWORD         nMaxFileTitle; //파일명 길이 지정
  LPCSTR        lpstrInitialDir;
  LPCSTR        lpstrTitle; //다이얼로그 타이틀 문자열 출력
  DWORD         Flags;
  WORD          nFileOffset;
  WORD          nFileExtension;
  LPCSTR        lpstrDefExt;
  LPARAM        lCustData;
  LPOFNHOOKPROC lpfnHook;
  LPCSTR        lpTemplateName;
} OPENFILENAME_NT4A, *LPOPENFILENAME_NT4A;

 

리소스 메뉴 추가
WndProc에 변수 선언
WM_COMMAND에 열기(32771)가 선택됐을 때의 동작을 선언

 

화면에 표시

※ 파일 저장 모달형 다이얼로그

:: 파일 열기 모달형과 대부분 같다. #include <commdlg.h>

 

※ 생성 함수 GetSaveFileName

BOOL GetSaveFileName(
  LPOPENFILENAMEA lpofn
);

 

리소스 메뉴 추가
열기와 거의 유사하나 표시한 부분만 조금 달라진다. 확장자의 유무에 따라 확장자 추가를 결정한다.

 

'Project > WIN32 API' 카테고리의 다른 글

컨트롤(2)  (0) 2021.07.22
컨트롤  (0) 2021.07.21
키보드, 마우스  (0) 2021.07.13
그래픽 오브젝트  (0) 2021.07.12
그래픽  (0) 2021.07.08

+ Recent posts