Computer/WINAPI 32

2. 윈도우 메뉴, 단축키와 비트맵, 대화상자 컨트롤

에린_1 2023. 1. 18. 14:35
728x90

윈도우 메뉴

  • 리소스 - 윈도우 프로그램에서 화면을 통해 사용자에게 입력받고 출력하는 코드 외의 부분
  • 메뉴항목에서 WM_COMMAND메시지 발생 → iMsg에 저장되어 WndProc()에 전달
  • tchar_t *_fgetts(tchar_t *str, int n, FILE *fPtr) - fPtr파일에서 한 줄을 읽어와 str에 저장. 파일의 끝을 만나면 NULL반환
  • int *_fputts(const tchar_t *str, FILE *fPtr) - str문자열을 fPtr파일에 출력함
  • errno-t _tfopen_s(FILE** fPtr, const tchar_t *filename, const tchar_t *mode) - 열고자하는 filename으로 파일을 연후 fPtr에 연 파일 포인터저장
  • int _stprintf_s(tchar_t (&buffer)[size], const tchar_t *format, argument…) - format이 가리키는 문자열을 buffer공간으로 복사한다. 반환값은 출력한 문자열의 길이이고 오류 발생시 -1반환.
  • int _tcscmp(const tchar_t *string1, const tchar_t *string2) - string1,string2을 비교 -> string1-string2

 

단축키와 비트맵

  • 단축키 설정단계
    1. 메뉴 속성창의 Caption에 단축키 표시
    2. 새로운 액셀러레이터 추가
    3. 단축키 매핑
    4. 단축키 설정 코드 작성
  • 비트맵 이미지 출력과정
    1. 비트맵 가져오기 - 그림을 비주얼 스튜디오의 비트맵으로 불러온다
    2. 비트맵 로드하기 - 비트맵의 ID와 LoadBitmap() 함수를 잉ㅇ해 비트맵 핸들에 비트맵 로드
    3. 화면 얻기 - DC 얻기
    4. 메모리 디바이스 콘텍스트 만들기 - CreateCompatibleDC() 함수를 이용해 hdc와 호환되는 memdc(화면이 없고 메모리에만 존재) 만들기
    5. 비트맵 사용 선언 - SelectObject() 함수를 이용해 hBitmap에 로드된 이미지를 memdc에 설정
    6. 화면에 비트맵 출력 - memdc 그림을 BitBlt(), StretchBit() 로 hdc에 옮김

 

 

  • 더블버퍼링
    1. 비트맵 이미지를 hBit2에 로드
    2. hdc에서 호환이 되는 mem1dc를 만들고 mem1dc에서 호환이 되는 mem2dc 만들기
    3. hdc와 호환이 되도록 CreateCompatibleBitmap() 함수를 이용해 hBit1 만들기
    4. mem1dc에 hBitmap1 설정(그리기) , mem2dc에 hBitmap2 설정(그리기)
    5. mem2dc 그림을 mem1dc에 옮기기
    6. mem1dc에 텍스트 쓰기 → 화면에 출력할 내용이 mem1dc에 모두 출력완료
    7. BitBlt() 함수로 mem1dc내용을 hdc에 옮긴다
  • 애니메이션 출력
    • AND연산으로 마스크 출력 OR연산으로 같은 자리에 이미지 출력

 

대화상자 컨트롤

  • 대화상자 이용
    1. 리소스에서 새로운 대화상자 만들기
    2. 대화상자에 대한 메시지 처리 함수 작성
    3. 대화상자 띄우기
  • 컨트롤을 대화상자에서 기본적으로 사용할 수 있도록 제공되는 것
  • 컨트롤에서 대화상자로 오는 WM_COMMAND 메시지
    • wParam - HIWORD - 컨트롤에 따른 통지 정보
    • wParam - LOWORD - 컨트롤 ID
    • lParam - 컨트롤 핸들 값
  • 컨트롤에 메시지를 전송하는 함수(콤보박스, 리스트박스 등에 사용)
    • LRESULT SendMessage(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
    • hwnd - 메시지를 받을 윈도우나 컨트롤의 핸들 값
    • iMsg - 전송할 메시지
    • wParam, lParam - 메시지의 부가 정보

 

 

  • 버튼 컨트롤
    • 통지 정보 종류
      • BN_CLICKED - 버튼클릭
      • BN_DBCLICK - 버튼 더블클릭
      • BN_DISABLE - 버튼 사용 불가능 상태
      • BN_HILITE - 사용자가 버튼 선택
      • BN_SETFOCUS - 버튼이 포커스를 받음
    • 윈도우에 작은 윈도우가 존재하고, 그걸 GetDigitem() 함수를 이용해 ID로 얻어올 수 있다.
  • 에디트 컨트롤 - 사용자의 키보드 입출력을 위한 편집 창
    • 통지 정보 종류
      • EN_CHANGE - 에디트 컨트롤의 내용이 변함
      • EN_HSCROLL - 에디트 컨트롤의 수평 스크롤바 선택
      • EN_VSCROLL - 에디트 컨트롤의 수직 스크롤바 선택
      • EN_SETFOCUS - 에디트 컨트롤이 포커스를 받음
  • 콤보박스 컨트롤 - 항목의 리스트 컨트롤을 보여주어 이 중 하나를 선택할 때 사용
    • 통지 정보 종류
      • CBN_DROPDOWN - 콤보박스 컨트롤에 등록된 항목이 아래로 펼쳐짐
      • CBN_DBCLK - 아래로 펼쳐진 항목 리스트 컨트롤에서 하나를 더블 클릭
      • CBN_EDITCHANGE - 콤보박스 컨트롤의 텍스트 편집 공간에 텍스트를 추가, 수정
      • CBN_SELCHANGE - 항목 리스트 컨트롤에서 하나를 선택
    • 콤보 박스 컨트롤에 보내는 iMsg
    • CB_ADDSTRING - 콤보박스 컨트롤의 항목 리스트에 문자열 새로추가
      • wParam - 사용 x
      • lParam - 추가될 문자열의 시작 주소
    • CB_DELETESTRING - 콤보박스 컨트롤에 있는 항목 하나를 삭제
      • wParam - 삭제하고자 하는 항목의 인덱스
      • lParam - 0
    • CB_FINDSTRING - 항목 리스트 컨트롤에 있는 텍스트 중 원하는 텍스트를 찾음
      • wParam - 찾기 시작할 위치를 지정하는 인덱스 값으로 0부터 시작. -1로 하면 리스트 컨트롤 전체에서 찾는다.
      • lParam - 찾고자 하는 문자열 시작 주소
    • CB_GETCOUNT - 콤보 박스 컨트롤의 항목 리스트에 있는 항목 개수 얻기
      • wParam - 0
      • lParam - 0
    • CB_GETCURSEL - 현재 선택한 항목의 인덱스 번호 얻기
      • wParam - 0
      • lParam - 0
    • CB_SERCURSEL - 콤보박스 컨트롤의 텍스트 편집 공간에 지정한 항목의 텍스트를 보여줌
      • wParam - 나타내고자 하는 항목의 인덱스 번호
      • lParam - 사용 x
  • 리스트 박스 컨트롤 - 외부 입력 없이 여러 개의 항목을 일렬로 보여주는 컨트롤
    • 통지 정보 종류
      • LBN_DBCLK - 리스트 박스 컨트롤의 여러 항목 중 하나를 더블클릭
      • LBN_SELCHANGE - 항목 중 하나가 선택
      • LBN_SETFOCUS - 리스트 박스 컨트롤이 포커스를 받음
      • LBN_KILLFOCUS - 리스트 박스 컨트롤이 포커스를 잃음
      • LBN_DELETEITEM - 리스트 박스 컨트롤의 항목 중 하나가 삭제됨
    • 리스트 박스 컨트롤에 보내는 iMsg
      • LB_ADDSTRING - 리스트 박스 컨트롤의 항목 리스트 마지막에 문자열을 추가
        • wParam - 사용 x
        • lParam - 문자열의 시작 주소
      • LB_DELETESTRING - 리스트 박스 컨트롤에 있는 항목 중 하나를 삭제
        • wParam - 삭제하려는 항목의 인덱스 정수
        • lParam - 0
      • LB_FINDSTRING - 항목 리스트 컨트롤에 있는 텍스트 중 원하는 텍스트 찾기
        • wParam - 찾기 시작할 위치를 지정하는 인덱스 값으로 0부터 시작, -1로 하면 리스트 컨트롤 전체에서 찾는다.
        • lParam - 찾고자 하는 문자열의 시작 주소
      • LB_GETCOUNT - 리스트 박스 컨트롤의 항목 리스트에 있는 항목 개수 얻기
        • wParam - 0
        • lParam - 0
      • LB_GETCURSEL - 현재 선택한 항목의 인덱스 번호 얻기
        • wParam - 0
        • lParam - 0
      • LB_SETCURSEL - 선택한 항목을 보여준다
        • wParam - 선택한 항목의 인덱스 번호
        • lParam - 사용 x
      • LB_GETSELCOUNT - 리스트 컨트롤 중 선택한 항목의 인덱스 번호 가져오기
        • wParam - 선택할 수 있는 항목의 최대 개수
        • lParam - 선택한 항목들의 인덱스 번호를 저장할 정수 배열의 시작주소
      • LB_GETTEXT - 항목 리스트 컨트롤 중 wParam에서 지정한 인덱스 항목의 텍스트 얻어오기
        • wParam - 얻어올 항목의 인덱스 번호
        • lParam - 얻어온 텍스트를 저장할 버퍼의 시작 주소
      • LB_INSERTSTRING - 항목 리스트 중간에 문자열을 새로운 항목으로 추가
        • wParam - 항목 리스트 중 추가될 위치의 인덱스 번호
        • lParam - 문자열 시작 주소
  • 모덜리스 대화상자
    • 모덜 대화 상자는 대화상자의 핸들 값이 필요없지만, 모덜리스 대화상자는 부모 윈도우와 대화상자가 동시에 구동되기 때문에 부모 윈도우가 대화상자의 윈도우 핸들 값을 가져야 한다.
    • 모덜 대화상자 생성, 삭제 - DiglogBox(), EndDialog()
    • 모덜리스 대화상자 생성, 삭제 - CreateDialog(), DestroyWindow()
728x90

'Computer > WINAPI 32' 카테고리의 다른 글

3. MDI, 파일 입출력  (0) 2023.01.19
1. 윈도우 프로그래밍, 기본 입출력, 제어 메시지  (0) 2023.01.17