Win32_API - Edit Control (인풋박스,입력창)

컴퓨터/Win32-API

728x90
반응형

서론 

본문에서는 값을 입력받기 위한 Edit control에 대하여 알아보도록 하겠습니다.

 

CeateWindow 함수를 통해 Edit Controll을 만들어 봅시다.

버튼을 만드는 방법과 비슷합니다. 'edit'이라는 문자열로 이미 정의되어 있습니다.

CreateWindowW(L"edit", NULL, WS_BORDER | WS_CHILD | WS_VISIBLE | ES_NUMBER | ES_RIGHT, 20, 200, 100, 25, hWnd, NULL, hInst, NULL);

스타일 옵션쪽을 간략히 설명하자면 다음과 같습니다.

  • WS_BORDER 테두리를 표시하는 스타일
  • WS_CHILD 자식 윈도 
  • WS_VISIBLE 눈에 보기이 귀한 윈도
  • ES_NUMBER 숫자를 입력할 수 있게 하는 스타일
  • ES_RIGHT 오른쪽 정렬

더 많은 Edit 컨트롤의 스타일 옵션은 아래 링크를 참조하세요.

 

 

Edit Control Styles (Winuser.h) - Win32 apps

To create an edit control using the CreateWindow or CreateWindowEx function, specify the EDIT class, appropriate window style constants, and a combination of the following edit control styles.

docs.microsoft.com

 

Edit control의 메시지 처리 EN_CHANGE

간단하게 명령이 바뀌었을 때 처리를 할 수 있습니다.

WM_COMMAN 메시지와 함께 Wparam에 EN_CHANGE 메시지를 보내줍니다.

 

    case WM_COMMAND:
        switch (HIWORD(wParam))
        {
        case EN_CHANGE:
            hdc = GetDC(hWnd);
            TextOutW(hdc, 100, 100, L"Edit컨트롤에 변화가 있습니다!", 19);
            ReleaseDC(hWnd, hdc);
            break;
        }
        break;

 

전체 소스코드

해당 소스코드를 통해 간단한 Edit 컨트롤을 사용해보겠습니다.


#include <windows.h>

#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource.h"


HINSTANCE hInst;
int num;

// 이 코드 모듈에 포함된 함수의 선언을 전달합니다:
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{

    //윈도우 창 구조체 정의 및 적용
    WNDCLASSEXW wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = NULL;
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    wcex.lpszClassName = L"Test";
    wcex.hIconSm = NULL;
    RegisterClassExW(&wcex);

    //적용한 윈도우 생성 및 업데이트
    hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.
    HWND hWnd = CreateWindowW(L"Test", L"Test", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    if (!hWnd)
    {
        return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    MSG msg;

    // 기본 메시지 루프입니다:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    WCHAR word[1024];

    switch (message)
    {
    case WM_CREATE:
        CreateWindowW(L"edit", NULL, WS_BORDER | WS_CHILD | WS_VISIBLE | ES_NUMBER | ES_RIGHT, 20, 200, 100, 25, hWnd, NULL, hInst, NULL);
        break;
    case WM_LBUTTONDOWN:
        hdc = GetDC(hWnd); //DC을얻는 방법 1
        ReleaseDC(hWnd, hdc);
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            hdc = BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_COMMAND:
        switch (HIWORD(wParam))
        {
        case EN_CHANGE:
            hdc = GetDC(hWnd);
            TextOutW(hdc, 100, 100, L"Edit컨트롤에 변화가 있습니다!", 19);
            ReleaseDC(hWnd, hdc);
            break;
        }
        break;
    case WM_SETTEXT:

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :