본문 바로가기

프로그램언어/C++

대화상자만들기

대화상자 만들기

 

아래 그림과 같이 리소스메뉴을 클릭

 

리소스에서 Dialog를 선태갛고 새로만들기 버튼 클릭

Dialog가 생성된다.

 

대화상자 보이기

int DialogBox(
    HINSTANCE    hInstance,          // 애플리케이션 인스턴스
    LPCTSTR         lpTemplate,       // 대화상자 ID
    HWND           hwnd,              //  부모 윈도우 핸들
    DLGPROC       lpDialogFunc     // 대화상자의 프로시저 함수
);

 

대화상자 종료하기

BOOL EndDialog(HWND hDlg, int nResult);     // nResult는 0값을 넣는다.

 

#include <windows.h>

#include <TCHAR.H>

#include "resource.h"

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst;

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpszCmdLine, int nCmdShow)

{

    HWND hwnd;

    MSG msg;

    WNDCLASS WndClass;

    hInst = hInstance;

    WndClass.style = CS_HREDRAW | CS_VREDRAW;

    WndClass.lpfnWndProc = WndProc;

    WndClass.cbClsExtra = 0;

   WndClass.cbWndExtra = 0;

   WndClass.hInstance = hInstance;

   WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

   WndClass.lpszMenuName = NULL;

   WndClass.lpszClassName = _T("Window Class Name");

   RegisterClass(&WndClass);

   hwnd = CreateWindow(_T("Window Class Name"), _T("Window Title Name"), WS_OVERLAPPEDWINDOW,

   CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

   ShowWindow(hwnd, nCmdShow);

    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

    return (int)msg.wParam;

}

 

BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    switch (iMsg)

    {

    case WM_INITDIALOG:

        return 1;

    case WM_COMMAND:

        switch (LOWORD(wParam))

        {

        case IDOK:

            EndDialog(hDlg, 0);

            break;

        case IDCANCEL:

            EndDialog(hDlg, 0);

            break;

        }

        break;

    }

    return 0;

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    switch (iMsg)

    {

    case WM_CREATE:

        break;

    case WM_LBUTTONDOWN:

        DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

 

실행결과]

 

WM_COMMAND 메시지

메시지를 보낸곳 wParam lParam
HIWORD LOWORD
컨트롤 컨트롤에 따른 통지 정보 컨트롤 ID 컨트롤 핸들 값

 

버튼 컨트롤의 통지 메시지

통지 메시지 설명
BN_CLICKED 버튼 클릭
BN_DBLCK 버튼 더블클릭
BN_DISABLE 버튼 비활성화
BN_DOUBLECLICKED 라디오 버튼이나 BS_OWNERDRAW 스타일 버튼에서 버튼을 더블클릭
BN_HILITE 버튼 선택시 발생
BN_UNHILITE 버튼에서 다른 윈도우로 전환시 발생
BN_SETFOCUS 버튼에 포커스가 갔을 때
BN_KILLFOCUS 버튼에서 포커스가 사라졌을 때
BN_PAINT 버튼이 다시 그려질 때

 

WM_INITDIALOG 메시지 (대화상자가 처음 생성될 때 발생하는 메시지)

wParam 대화상자에서 제일 먼저 키보드로 입력받을 컨트롤의 핸들 값
lParam 부가 정보를 저장하며 일반적으로 0값

 

GetDlgItem() 함수 : 대화상자에 있는 컨트롤의 핸들 값을 얻어온다.

HWND GetDlgItem (
    HWND     hDlg,                // 컨트롤이 있는 대화상자의 핸들
    int           nIDDlgItem       // 컨트롤 ID
);

 

EnableWindow() 함수 : 윈도우나 컨트롤을 사용, 불가능 상태로 만드는 함수

BOOL EnableWindow (
    HWND      hwnd,          // 대상이 되는 윈도우나 컨트롤의 핸들
    BOOL        bEnable       // TRUE이면 사용 가능, FALSE이면 사용 불가능 상태로 만듦
);

 

다이얼로그박스에 버튼 추가히기

 

 

"출력하기"버튼을 만들어 다이얼로그에 출력하고 "끝내기"버튼을 만들어 다이얼로그창을 닫는다.

BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    HDC hdc;

 

    switch (iMsg)

    {

    case WM_INITDIALOG:

        return 1;

    case WM_COMMAND:

        switch (LOWORD(wParam))

        {

        case ID_BUTTON_PRINT:

            hdc = GetDC(hDlg);

            TextOut(hdc, 0, 0, _T("Hello World"), 11);

            ReleaseDC(hDlg, hdc);

            break;

        case ID_BUTTON_END:

            EndDialog(hDlg, 0);

            break;

        case IDOK:

            EndDialog(hDlg, 0);

            break;

        case IDCANCEL:

            EndDialog(hDlg, 0);

            break;

        }

        break;

    }

    return 0;

}

실행 결과]

마우스 왼쪽버튼을 클릭하고 출력버튼을 누르면

끝내기 버튼을 누르면 다이얼로그창이 닫힌다.

 

 

 

 

버튼 컨트롤을 활성화와 비활성화를 만들어보자.

BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    HDC hdc;

    HWND hButton;

 

    switch (iMsg)

    {

    case WM_INITDIALOG:

        hButton = GetDlgItem(hDlg, ID_PAUSE);

        EnableWindow(hButton, FALSE);

        return 1;

    case WM_COMMAND:

        switch (LOWORD(wParam))

        {

        case ID_START:

            hButton = GetDlgItem(hDlg, ID_START);

            EnableWindow(hButton, FALSE);

            hButton = GetDlgItem(hDlg, ID_PAUSE);

            EnableWindow(hButton, TRUE);

            break;

        case ID_PAUSE:

            hButton = GetDlgItem(hDlg, ID_START);

            EnableWindow(hButton, TRUE);

            hButton = GetDlgItem(hDlg, ID_PAUSE);

            EnableWindow(hButton, FALSE);

            break;

        case ID_CLOSE:

            EndDialog(hDlg, 0);

            break;

        case ID_BUTTON_PRINT:

            hdc = GetDC(hDlg);

            TextOut(hdc, 0, 0, _T("Hello World"), 11);

            ReleaseDC(hDlg, hdc);

            break;

 실행결과]

다이얼로그가 로드되면서 정지버튼이 비활성화 되고, 시작버튼을 클릭하면 정지버튼은 활성화, 시작버튼을 비활성화되고, 정버튼을 클릭하면 시작버튼은 활성화되고, 정지버튼은 비활성화된다.

종료버튼을 클릭하면 다이얼로그 창이 닫힌다.

 

'프로그램언어 > C++' 카테고리의 다른 글

대화상자3  (0) 2020.12.29
대화상자만들기2  (0) 2020.12.28
ROP모드로 이미지 마스크 설정  (0) 2020.12.22
API 비트맵2  (0) 2020.09.28
API 비트맵  (0) 2020.09.28