-
Win32 API 7강. 다이얼로그(3) 폼 기반의 윈도우 프로그램Win32 API with 나우캠퍼스 2022. 8. 17. 15:02
3. 폼 기반의 윈도우 프로그램
폼 기반의 윈도우 생성
▩ WinMain()에서 DialogBox() 호출
- DialogBox(인스턴스, 다이얼로그 아이디, 0, 콜백 함수);
▩ 다이얼로그 프로시져 연결
▩ 타이틀 바꾸기
1) 리소스 속성창에서 변경
- 리소스뷰 => Dialog 우클릭 => 속성 => 모양 => 캡션(Caption) => 타이틀명 바꾸기.
2) SetWindowText()로 변경
BOOL SetWindowTextA( [in] HWND hWnd, [in, optional] LPCSTR lpString );
hWnd : 윈도우 핸들
lpString : 타이틀명 입력
파일열기 모달형 다이얼로그
▩ #include <commdlg.h>
▩ 파일열기 다이얼로그 생성 함수
BOOL GetOpenFileNameA(LPOPENFILENAMEA lpofn);
▩ OENFILENAME 구조체
typedef struct tagOFN_NT4W { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCWSTR lpstrFilter; LPWSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPWSTR lpstrFile; DWORD nMaxFile; LPWSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCWSTR lpstrInitialDir; LPCWSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCWSTR lpstrDefExt; LPARAM lCustData; LPOFNHOOKPROC lpfnHook; LPCWSTR lpTemplateName; } OPENFILENAME_NT4W, *LPOPENFILENAME_NT4W;
lStructSize : 파일의 크기 ( sizeof(OPENFILENAME) )
hwndOwner : 부모 윈도우 핸들
lpstrFilter : 파일형식 설명\0*.확장자\0, 참고로, \0은 구분문자이다.
ex) "비트맵(*.bmp)\0*.bmp\0
nFilterIndex : 선택한 파일 인덱스, 1부터 시작
lpstrFileTitle : 파일명을 저장할 배열 설정, nMaxFileTitle에 길이 지정, static 변수 또는 전역 변수 설정
lpstrFile : 전체 경로를 저장할 배열 설정, nMaxFile에 최대 길이 지정
lpstrTitle : 다이얼로그 타이틀 문자열 출력
사용예시
OPENFILENAME ofn; static char strFileTitle[MAX_PATH]; static char strFile[100]; static char strFileExtension[10]; char string[100]; switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 메뉴 선택을 구문 분석합니다: switch (wmId) { case ID_32771: memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrTitle = "파일을 선택해 주세요"; ofn.lpstrFileTitle = strFileTitle; ofn.lpstrFile = strFile; ofn.lpstrFilter = "비트맵(*.bmp)\0*.bmp\0jps 파일\0*.jpg\0"; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; if (GetOpenFileName(&ofn) != 0) { switch (ofn.nFilterIndex) { case 1: sprintf(strFileExtension, "%s", "bmp"); break; case 2: sprintf(strFileExtension, "%s", "jpg"); break; } } InvalidateRect(hWnd, NULL, TRUE); break;
파일저장 모달형 다이얼로그
▩ 파일열기 모달형과 대부분 같다
▩ #include <commdlg.h>
▩ 파일저장 다이얼로그 생성 함수
BOOL GetSaveFileName(LPOPENFILENAME lpofn);
▩ lpstrFilter 역할
- 저장할 파일의 형식을 구분
▩ 저장할 때는 확장자의 유무를 파악하여 확장자 추가 결정
사용예시
switch (ofn.nFilterIndex) { case 1: sprintf(strFileExtension, "%s", "bmp"); if (ofn.nFileExtension == 0) { strcat(strFileTitle, ".bmp"); strcat(strFile, ".bmp"); } break; case 2: sprintf(strFileExtension, "%s", "jpg"); if (ofn.nFileExtension == 0) { strcat(strFileTitle, ".jpg"); strcat(strFile, ".jpg"); } break; }
기본적으로 GetOpenFileName과 사용방법은 같지만 사용자가 확장자를 입력안하고 저장했을 경우에 임의로 확장자를 추가해주는 코드만 입력하면 된다. ( strcat활용 )
'Win32 API with 나우캠퍼스' 카테고리의 다른 글
Win32 API 8강. 컨트롤1(2) 버튼 컨트롤 - 푸시 버튼, 라디오 버튼, 체크 버튼 (0) 2022.08.17 Win32 API 8강. 컨트롤1(1) 컨트롤 기초와 Static Text (0) 2022.08.17 Win32 API 7강. 다이얼로그(2) 모델리스형 다이얼로그 (0) 2022.08.17 Win32 API 7강. 다이얼로그(1) 모달형 다이얼로그 (0) 2022.08.17 Win32 API 6강. (3) 타이머 (0) 2022.08.16