메모내용

Window

메시지 발생시키는 함수

                    
                        
RESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
                    
                

윈도우 생성 함수

                    
// 윈도우 생성
HWND WINAPI CreateWindow(
    LPCTSTR lpClassName, // 구조체명
    LPCSTR lpWindowName, // 타이틀바
    DWORD dwStyle, //윈도우 형태
    int x, int y, // 출력좌표
    int nWidth, int nHeight, // 윈도우 전체 크기
    HWND hWndParent, // 부모 윈도우
    HMENU hMenu, // 메뉴바 핸들
    HINSTANCE hInstance, // 인스턴스
    LPVOID lpParam  // 여분, NULL
    ) ; 
)                        

                    
                

MainWindow

Client 영역

클라이언트 영역을 가진다.
DC 핸들을 이용해 클라이언트 영역에 그래픽을 그릴 수 있다.

WndProc

윈도우에 발생한 메시지를 받아 처리하는 함수인
전용 프로시져 함수 (콜백함수) 를 가지고 있다.
다양한 메시지를 받는다
{ WM_CREATE, WM_COMMAND, WM_CLOSE, WM_PAINT ... }

Dialog

폼기반 다이얼로그

부모 윈도우 없이 다이얼로그만 띄어서 모든 처리를 담당하는프로그램 작성방법

                    
                        #include "framework.h"
                        #include "FormBasedWindow.h" // 프로젝트 헤더파일
                        #include "commdlg.h"
                        #include "resource.h"
                        
                        using namespace std;
                        #define MAX_LOADSTRING 100
                        
                        // 전역 변수:
                        //HINSTANCE hInst;                                // 현재 인스턴스입니다.
                        
                        INT_PTR CALLBACK    DlgProc(HWND, UINT, WPARAM, LPARAM);
                        
                        int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                                             _In_opt_ HINSTANCE hPrevInstance,
                                             _In_ LPWSTR    lpCmdLine,
                                             _In_ int       nCmdShow)
                        {
                            
                            CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);        
                        
                            MSG msg;
                            while (GetMessage(&msg, nullptr, 0, 0))
                            {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                            }
                        
                            return (int)msg.wParam;
                        }
                        
                        
                        
                        // 다이얼로그 윈더우의 메시지 처리기입니다.
                        INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)                            //
                        {                        
                        
                            UNREFERENCED_PARAMETER(lParam);
                            switch (message)
                            {
                            case WM_INITDIALOG:
                                
                                SetWindowText(hDlg, TEXT("폼 기반 윈도우"));
                                return (INT_PTR)TRUE;
                        
                            case WM_COMMAND:
                        
                                int ControlId = LOWORD(wParam);
                        
                                if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
                                {
                                    SendMessage(hDlg, WM_CLOSE, 0, 0); // WM_CLOSE 메시지 발생시키기
                                    return (INT_PTR)TRUE;
                                }
                                break;
                            }
                            case WM_CLOSE:{
                                DestroyWindow(hDlg);   // 다이얼로그 윈도우 닫기
                                PostQuitMessage(0);    // 메시지 루프를 종료하여 태스크도 종료시키는 함수
                                return (INT_PTR)TRUE;
                                break;
                            }

                            return (INT_PTR)FALSE;
                        }
                        
                    
                

Control

컨트롤 핸들 구하기
컨트롤 행들을 통해 관련된 매크로를 호출할 수 있다.
사용자가 직접 값을 입력하기도 하고 직접 값을 확인하는 것도
컨트롤을 통해 이루어지기 때문에 중요하다.

컨트롤 핸들 구하기 함수


    HWND GetDlgItem(
        HWND hDlg,          // 포함하고 있는 다이얼로그 핸들                 
        int nIDDlgIter      // 컨트롤 아이디
        )        

SetFocus

특정 윈도우(윈도우, 다이얼로그, 컨트롤) 에 포커스를 설정하는 함수

    SetFoucus(
        HWND hwnd; // 포커스 할 윈도우
    )

    // 사용법
    SetFocus(GetDlgItem(hDlg_소속다이얼로그, IDC_컨트롤아이디));

Static Text

텍스트 를 클라이언트의 특정 위치에 출력하기 위한 컨트롤

EditBox

  • 사용자로부터 데이터 입력을 받기 위한 컨트롤
  • 데이터 입력을 수정, 삭제 등의 데이터 편집이 가능하다

값 가져오기 함수

float 의 경우 문자열로 우선 받아서 float 로 바꾸어야 한다.
보통 atof() 함수를 사용한다.

    // 문자열,실수형 값 가져오기
    UINT GetDlgItemText (
        HWND hDlg,          // 소속된 다이얼로그 핸들
        int nIDDlgIter,     // 컨트롤 아이디
        LPTSTR lpString,    // 값을 전달받을 문자열 버퍼
        int nMaxCount       // 받을 수 있는 문자열 최대 개수
    )

    // 정수형 값 가져오기
    UINT GetDlgItemInt (
        HWND hDlg,          // 소속된 다이얼로그 핸들
        int nIDDlgItem,     // 컨트롤 아이디
        BOOL* lpTranslated  // 변환 성공 여부를 받을 bool 변수 주소, 보통 NULL, 0
        BOOL bSigned        // 부호 있는 정수 여부
    )

값 설정하기 함수

    
        BOOL SetDlgItemText(
            HWND hDlg,          // 소속된 다이얼로그 핸들
            int nIDDlgItem,     // 컨트롤 아이디
            LPCTSTR lpString    // 설정한 텍스트 값
        )

        BOOL SetDlgItemInt(
            HWND hDlg,          // 소속된 다이얼로그 핸들
            int nIDDlgItem,     // 컨트롤 아이디
            UINT nValue,        // 설정할 정수형 값
            BOOL bSigned        // 부호 있는 정수인지 여부
        )
    
    

Button

눌려지면 WM_COMMAND 메시지를 발생시킨다.
LOWORD(wParam) 으로 어떤 버튼이 눌렸는지 식별할 수 있고
HIWORD(wParam) 으로 버튼이 어떤 상태에서 메시지를 발생시켰는지 알 수 있다.


    LOWORD(wParam) // 아이디
    HIWORD(wParam) // 컨트롤 상태를 알 수있는 "통지 코드"

통지 코드

  • BN_CLICKED : 버튼이 클릭되었을 때
  • BN_DBCLICK : 버튼이 더블클릭 되었을 때
  • BN_PUSHED : 사용자에 의해 버튼이 눌렸을 때
  • BN_UNPUSHED : 버튼이 떼어졌을 때
  • BN_PAINT : 버튼이 새로 그려져야 할 때
  • BN_SETFOCUS : 버튼이 포커스를 얻었을 때
  • BN_KILLFOCUS : 버튼이 포커스를 잃었을 때
  • BN_HILITE : 사용자에 의해 버튼이 눌렸을 때
  • BN_DISABLE : 버튼이 비활성화 되었을 때

CheckBox

다수의 선택사항을 확인하기 위한 컨트롤
선택시 WM_COMMAND 메시지 발생
LOWORD(wParam) 으로 컨트롤의 아이디를 확인, 컨트롤 식별 가능하다
아래의 매크로를 통해 언제든지 버튼의 체크 여부를 확인하고 버튼의 상태를 변경할 수 있다.





버튼 상태 관련 함수


    // 버튼 체크 여부 확인
    UINT isDlgButtonChecked(
        HWND hDlg,      // 소속된 다이얼로그 핸들
        int nIdButton   // 컨트롤 아이디 
    )

    // 버튼 상태 변경함수
    BOOL CheckDlgButton(
        HWND hDlg,      // 소속된 다이얼로그 핸들
        int nIDButton,  // 컨트롤 아이디
        UINT uCheck     // 버튼의 새로운 상태. = BST_CHECKED , BST_UNCHECKED 로 설정
    )

RadioButton

  • 여러 선택지 중에서 하나를 선택하기 위한 버튼
  • 선택시 WM_COMMAND 메시지를 발생
  • LOWORD (wParam) 으로 컨트롤 아이디를 확인, 컨트롤 식별이 가능하다
  • 생성 순서대로 번호가 매겨지고
    특정 번호마다 구간을 나누어, 그 그룹의 시작번호를 가진 RadioButton 의 group 속성을 true 로 설정하여
    특정 번호부터 특정 번호까지 그룹을 설정할 수 있다
  • 다이얼로그 초기 등장시 RadioButton 에 포커스가 가는것을 막기 위해 PushButton 을 하나 둔다.
아래의 매크로를 통해 언제든지 버튼의 체크 여부를 확인하고 버튼의 상태를 변경할 수 있다.

버튼 상태 관련 함수


    // 버튼의 체크 여부 확인 매크로. BST_CHECKED, BST_UNCHECKED, BST_INDETERMINDED 반환
    UINT IsDlgButtonChecked(
        HWND hDlg,      // 소속 다이얼로그 핸들
        int nIdButton   // 컨트롤 아이디
    )

    // 버튼의 체크 상태 설정 매크로
    BOOL CheckDlgButton(
        HWND hDlg,      // 소속 다이얼로그 핸들
        int nIDButton,  // 컨트롤 아이디
        UINT uCheck     // 버튼의 새로운 상태. = BST_CHECKED , BST_UNCHECKED 로 설정
    )

    // 라디오 버튼용 상태 설정 매크로
    // 선택만 할 수 있고 다른 버튼은 비선택으로 만들어버린다.
    BOOL CheckRadioButton(
        int nIDFirstButton, // 그룹의 첫번째 버튼
        int nIDLastButton,  // 그룹의 마지막 버튼
        int nIDCheckButton, // 선택할 버튼
    )


                            

ComboBox

선택하고자 하는 항목들을 리스트 형태로 출력 및 선택할 수 있다.


관련 함수


    #include "windowsx.h"

    // 콤보박스에 선택지 추가 함수
    ComboBox_AddString(
        HWND hwndCtl,   // 컨트롤 핸들
        LPCTSTR lpsz    // 추가하고자 하는 선택지 문자열
    )

    // 콤보박스에 선택지 중간 삽입 함수
    ComboBox_InsertString(
        HWND hWndCtl,   // 컨트롤 핸들
        int index,      // 인덱스
        LPCSTR lpsz     // 추가하고자 하는 선택지 문자열
    )

    // 콤보박스의 선택지 제거
    ComboBox_DeleteString(
        HWND hWndCtl,   // 컨트롤 핸들
        int index       // 제거하고자 하는 요소의 인덱스
    )

    // 콤보박스의 선택지 인덱스 확인 함수
    // 아무것도 선택되지 않았을때는 CB_ERR (-1) 이 반환된다
    int ComboBox_GetCurSel(
        HWND hWndCtl    // 컨트롤 핸들
    )


ListBox

  • 리스트 출력영역 안애서 하나의 항목을 선택하기 위한 컨트롤
  • 이미 리스트 요소들이 노출되어 있다.
  • 지정한 영역보다 많은 항복은 스크롤바를 통해 선택할 수 있다.

관련 함수


    #incldue "windowsx.h"

    // 리스트박스에 선택지 추가 함수
    ListBox_AddString(
        HWND hwndCtl,   // 컨트롤 핸들
        LPCTSTR lpsz    // 추가하고자 하는 선택지 문자열
    )

    // 리스트박스에 선택지 중간 삽입 함수
    ListBox_InsertString(
        HWND hWndCtl,   // 컨트롤 핸들
        int index,      // 인덱스
        LPCSTR lpsz     // 추가하고자 하는 선택지 문자열
    )

    // 리스트박스의 선택지 인덱스 확인 함수
    // 아무것도 선택되지 않앗을떄는 LB_ERR (-1) 이 반환된다.
    int ListBox_GetCurSel(
        HWND hWndCtl    // 컨트롤 핸들
    )


Client 영역

클라이언트 영역을 가진다.
DC 핸들을 이용해 클라이언트 영역에 그래픽을 그릴 수 있다.
Dialog 는 컨트롤을 올려 놓을 수 있다.

DlgProc

윈도우에 발생한 메시지를 받아 처리하는 함수인
전용 프로시져 함수 (콜백함수) 를 가지고 있다.
WndProc 함수에서 받는 대부분의 메시지도 비슷하게 받을 수 있다.
{ WM_INITDLALOG, WM_COMMAND, WM_CLOSE, WM_PAINT, ... }

모달형 다이얼로그

#include <commdlg.h>

모든 제어권을 독점하여 최우선적으로 처리되어야 하는 윈도우
하나의 값에 집중할때 사용한다
미리 제공하는 다이얼로그 생성 매크로 함수
MessageBox( ), GetOpenFileName( ), GetSaveFileName( ) 등이 있다




생성함수


    DialogBox (
        HINSTANCE hInstance,        // 인스턴스 아이디
        LPCTSTR lpTemplate,         // 컨트롤이 올려져 있는 폼, = MAKEINTRESOURCE(다이얼로그 아이디)
        HWND hWndParent,            // 부모 윈도우의 핸들
        DLGPROC lpDialogFunc        // 프로시져 함수
    )

제거함수

보통 WM_CLOSE 에서 호출한다


    EndDialog ( 
        HWND hDlg, 
        INT_PTR nResult  // 부모 윈도우에 전달할 값
        )

INT_PTR nResult : 사용자로부터 입력값을 받고자 할때, 여기에 값을 넣어 부모 윈도우에 값을 전달한다
하지만 전달하고 싶은 값들이 많기 때문에, 보통은 전역변수로 부모 윈도우와 값을 주고 받는다.

모델리스형 다이얼로그

#include <commdlg.h>

제어권을 독점하지 않는다.
다중 작업용으로 사용되는 윈도우
폼 생성 중의 Visible 속성을 true 로 바꾸어 주어야 한다.
DialogBox() 매크로함수는 내부에서 visible 속성을 true 또는 ShowWindow 등의 기능을 호출하지만,
모델리스형은 그렇게 하지 않기 때문에,
Visible(표시) = true 로 해주지 않으면 코드상에는 문제가 없으나. 화면에 표시가 되지 않는다.


생성함수


    CreateDialog (
        HINSTANCE hInstance,    // 인스턴스 아이디
        LPCTSTR lpTemplate,     // 컨트롤이 올려져 있는 폼, = MAKEINTRESOURCE(다이얼로그 아이디)
        HWND hWndParent,        // 부모 윈도우 핸들
        DLGPROC lpDialogFunc    // 프로시져 함수
    )

제거함수

보통 WM_CLOSE 에서 호출한다


    DestroyWindow( HWND hWnd);