ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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활용 )

Designed by Tistory.