리스트 컨트롤

 

1. 리스트 컨트롤

- 리스트 박스 vs 리스트 컨트롤

리스트 박스 : 단일 항목 나열

리스트 컨트롤 : 리스트를 여러개 가짐

- 다양한 뷰 스타일 제공 (Icon, Small Icon, List, Report 스타일)

 

- 다양한 매크로 함수 제공

- 포함 헤더 : Commctrl.h, Windowsx.h

 

Report 스타일로 설정

 

이(Report)는 엑셀과 비슷한 구조로, 행과 열로 구분할 수 있다.

열은 컬럼(Column),  행은 아이템(Item)이라고 부른다. 열의 모든 내용은 서브 아이템(Sub Item)이라고 부른다.

시작 인덱스는 모두 0 이다.

 

 

ListView_InsertColumn() 함수를 통한 컬럼 생성과 문자열 등록 

void ListView_InsertColumn(
   HWND hwnd, //윈도우 핸들
   int iCol, //컬럼 인덱스
   const LPLVCOLUMN pcol //LVCOLUMN의 메모리 주소
);

 

+ LVCOLUMN 구조체

typedef struct tagLVCOLUMNA {
  UINT  mask; //컬럼에 적용할 속성 설정(뭐뭐 조합할지)
  int   fmt; 
  int   cx;
  LPSTR pszText;
  int   cchTextMax;
  int   iSubItem;
  int   iImage;
  int   iOrder;
  int   cxMin;
  int   cxDefault;
  int   cxIdeal;
} LVCOLUMNA, *LPLVCOLUMNA;

 

+ LVCLOUMN mask : 컬럼에 적용할 속성 결정 (OR연산 이용)

LVCF_FMT 정렬(왼쪽, 가운데, 오른쪽)
LVCF_WIDTH 길이 적용
LVCF_TEXT 문자열 적용
LVCF_SUBITEM 서브 아이템 적용

 

+ LVCOLUMN fmt : 컬럼과 서브 아이템의 데이터 정렬 형식 지정

LVCFMT_LEFT Text is left-aligned.
LVCFMT_RIGHT Text is right-aligned.
LVCFMT_CENTER Text is centered.

주의할 점 : 인덱스가 0인 컬럼과 서브아이템은 항상 왼쪽 정렬

 

+ LVCOLUMN cx, pszText, iSubItem 

cx          : 가로 길이

pszText   : 문자열 지정

iSubItem : 서브 아이템 인덱스 

 


#include "framework.h"
#include "WindowsProject9_ListControl.h"
#include "Commctrl.h"
#include "Windowsx.h"

INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    return 0;
}

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    static HWND hList;
    char* strMenu[] = { "항목1","항목2", "항목3", "항목4" };
    LVCOLUMN lvColumn;

    switch (message)
    {
    case WM_INITDIALOG:
        hList = GetDlgItem(hDlg, IDC_LIST1);
        lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
        lvColumn.fmt = LVCFMT_CENTER;
        
        for (int i = 0; i < 4; i++) {
            lvColumn.cx = strlen(strMenu[i]) * 10;//너무 붙어있지 말라고
            lvColumn.pszText = strMenu[i];
            ListView_InsertColumn(hList, i, &lvColumn);
        }
        return (INT_PTR)TRUE;

    case WM_CLOSE:
        EndDialog(hDlg, 0);
        return (INT_PTR)TRUE;
    }
    return (INT_PTR)FALSE;
}

 

항목1,2,3,4 컬럼이 생성된다.

 


※ 아이템 관련 매크로 함수 ListView_GetItemCount

void ListView_GetItemCount(
   HWND hwnd
);
void ListView_InsertItem(
   HWND hwnd,
   const LPLVITEM pitem
);

 

+ LVITEM 구조체

typedef struct tagLVITEMA {
  UINT   mask; //보통 LVIF_TEXT 만 지정하면 됨
  int    iItem; //ListView_GetItemCount
  int    iSubItem; //0 고정
  UINT   state;
  UINT   stateMask;
  LPSTR  pszText; //문자열 설정
  int    cchTextMax;
  int    iImage;
  LPARAM lParam;
  int    iIndent;
  int    iGroupId;
  UINT   cColumns;
  PUINT  puColumns;
  int    *piColFmt;
  int    iGroup;
} LVITEMA, *LPLVITEMA;

 

변수 추가
버튼 눌림을 위한 WM_COMMAND문 추가
버튼을 누를때 마다 아이템이 자신의 인덱스를 넣으면서 추가된다.

 


※ 아이템 항목 설정 ListView_SetItemText() 이용 예제

#include "framework.h"
#include "WindowsProject9_ListControl.h"
#include "Commctrl.h"
#include "Windowsx.h"
#include <stdio.h>

INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    return 0;
}

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    static HWND hList;
    char* strMenu[] = { "순번","C","C++","WIN32" };
    LVCOLUMN lvColumn;
    LVITEM lvItem;
    char string[100];

    switch (message)
    {
    case WM_INITDIALOG:
        hList = GetDlgItem(hDlg, IDC_LIST1);
        lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
        lvColumn.fmt = LVCFMT_CENTER;
        
        for (int i = 0; i < 4; i++) {
            lvColumn.cx = 50;
            lvColumn.pszText = strMenu[i];
            ListView_InsertColumn(hList, i, &lvColumn);
        }
        return (INT_PTR)TRUE;

    case WM_CLOSE:
        EndDialog(hDlg, 0);
        return (INT_PTR)TRUE;
    
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1) {
            lvItem.iItem = ListView_GetItemCount(hList);
            lvItem.iSubItem = 0;
            lvItem.mask = LVIF_TEXT;
            sprintf_s(string, "%d", lvItem.iItem);
            lvItem.pszText = string;
            ListView_InsertItem(hList, &lvItem);

            GetDlgItemText(hDlg, IDC_EDIT1, string, 10);
            ListView_SetItemText(hList, lvItem.iItem, 1, string);
            GetDlgItemText(hDlg, IDC_EDIT2, string, 10);
            ListView_SetItemText(hList, lvItem.iItem, 2, string);
            GetDlgItemText(hDlg, IDC_EDIT3, string, 10);
            ListView_SetItemText(hList, lvItem.iItem, 3, string);

            //에디트 컨트롤 클리어
            SetDlgItemText(hDlg, IDC_EDIT1, NULL);
            SetDlgItemText(hDlg, IDC_EDIT2, NULL);
            SetDlgItemText(hDlg, IDC_EDIT3, NULL);
            
            return (INT_PTR)TRUE;
        }
    }

    return (INT_PTR)FALSE;
}

값을 입력하면 삽입과 동시에 칸이 초기화 되는 것까지 확인 가능하다


※ 서브 아이템 데이터 가져오기 ListView_GetItemText()

void ListView_GetItemText(
   HWND hwndLV,
   int iItem,
   int iSubItem_,
   LPTSTR pszText_, //문자열 저장을 위한 메모리 공간
   int cchTextMax_
);

 

1단계) 아이템 선택에 대한 메세지 알아내기

- 발생 메세지 : WM_NOTIFY, 부가적 정보가 담긴 메모리 주소가 lparam에 담김

(부가적 정보 = 통지 코드, 컨트롤 핸들, 아이디가 저장된 메모리 주소)

 

lParam 다루는 방법 : NMHDR 구조체 사용

typedef struct tagNMHDR {
  HWND     hwndFrom; //윈도우 핸들
  UINT_PTR idFrom; //컨트롤 아이디
  UINT     code; //통지 코드, NM_CLICK
} NMHDR;

 

2단계) 아이템 인덱스 알아내기 ListView_GetNextItem()

void ListView_GetNextItem(
   HWND hwnd,
   int i, //임의의 인덱스, 선택이 없을 때:-1
   UINT flags //LVNI_SELECTED
);

 

+) 리스트 컨트롤 뷰 설정  ListView_SetExtendedListViewStyle()

void ListView_SetExtendedListViewStyle(
   HWND hwndLV,
   DWORD dwExStyle //LVS_EX_FULLROWSELECT : 하나의 행 전체 선택, LVS_EX_GRIDLINES : 아이템(열) 전체 선택
);

 

DlgProc에 인덱스 변수 추가

 

WM_INITDIALOG에 ListView_SetExtendedListViewStyle 속성을 설정한다

 

WM_NOTIFY 문 추가
선택 결과가 아래 Edit Control에서 보인다


※ 데이터 값 수정하기

ListView_GetItemText()

ListView_SetItemText()

nIndex 값 다시 설정
nIndex 가 -1이 아닐때. 즉, 선택되었을 때를 의미
수정

'Project > WIN32 API' 카테고리의 다른 글

컨트롤(2)  (0) 2021.07.22
컨트롤  (0) 2021.07.21
다이얼로그  (0) 2021.07.21
키보드, 마우스  (0) 2021.07.13
그래픽 오브젝트  (0) 2021.07.12
1. 에디트 컨트롤(박스)
2. 콤보 박스
3. 리스트 박스

 

※ 컨트롤도 윈도우이다. 따라서 윈도우 핸들이 존재한다.

GetDlgItem()을 통해 핸들을 얻는다.

 

1. Edit Control

: 사용자로부터 데이터 입력 받음

데이터 입력, 수정, 삭제를 위한 컨트롤

 

사용방법? 함수 사용

 

여러 속성을 제공하고 있음

- Password : 비밀번호(값이 보이지 않음)

- Visible : 화면에 출력

- Read Only : 오로지 읽도록(처리된 결과를 보여줄 때 사용)

- Border : 경계선 있/없

- Number : 값을 숫자로만 받음

...

 

※ 내용 읽기 함수  GetDlgItemText, GetDlgItemInt

UINT GetDlgItemTextA( //문자열 읽기
  HWND  hDlg,
  int   nIDDlgItem,
  LPSTR lpString,
  int   cchMax
);
UINT GetDlgItemInt( //정수값 받기
  HWND hDlg,
  int  nIDDlgItem,
  BOOL *lpTranslated, //메모리 주소(보통 NULL)
  BOOL bSigned //TRUE면 음수도 받을 수 있고, FALSE면 양수만 입력 받음
);

 

<EditControl에 쓰여진 데이터 읽기 코드>

#include "framework.h"
#include "WindowsProject7_control2.h"
#include <stdio.h>

INT_PTR CALLBACK    DlgProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    return 0;
}

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    char string[100];
    int nVal;

    switch (message)
    {
    case WM_CLOSE:
        EndDialog(hDlg, 0);
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_BUTTON1:
            GetDlgItemText(hDlg, IDC_EDIT1, string, 99);
            MessageBoxA(hDlg, string, "확인", MB_OK);
            return (INT_PTR)TRUE;

        case IDC_BUTTON2:
            nVal = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE);
            sprintf_s(string, "%d", nVal);
            MessageBoxA(hDlg, string, "확인", MB_OK);
            return (INT_PTR)TRUE;
        }       
    }
    return (INT_PTR)FALSE;
}

GetDlgItemText 버튼으로 문자열을 읽어들이고, GetDlgItemInt 버튼으로 양의 정수만(마지막 매개변수를 False로 설정)을 읽어들이고 있다.

 

문자열 입력 후 Text()버튼
문자열 입력 후 Int() 버튼

 

숫자 입력 후 Text() 버튼과 Int()버튼


※ 데이터 설정 함수 SetDlgItemText, SetDlgItemInt

BOOL SetDlgItemText(
  HWND   hDlg,
  int    nIDDlgItem,
  LPCSTR lpString //설정할 문자열 지정
);
BOOL SetDlgItemInt(
  HWND hDlg,
  int  nIDDlgItem,
  UINT uValue, //지정하고자 하는 값
  BOOL bSigned //부호 설정
);

 

Get -> Set 으로 바꾸면 된다.

 

각각의 버튼을 누르면 Edit Text에 내용이 설정된다.


2. Combo Box

여러 항목을 리스트 형태로 출력 및 선택

※ Simple, Drop Down, Drop List 형태 제공

Dialog 설정

'정렬' 속성은 기본적으로 TRUE로 설정이 되어 있다. 

따라서 우리가 항목을 추가할 때 자동으로 정렬이 되므로 자동 정렬되는 것을 원치 않으면 FALSE로 설정하면 된다.

'형식' 속성을 보면 Simple, Drop Down, Drop List 형태를 제공하고 있음을 알 수 있다.

 

 

※ 항목이 펼쳐지는 영역 설정 가능

항목이 펼쳐지는 영역을 설정할 수도 있다.

 

※ 매크로 함수 사용

- Windowsx.h 포함

실제 MSDN에 combo box를 검색하면 사용가능한 매크로 함수 목록이 뜬다.

 

※ 윈도우 핸들 구하는 함수 GetDlgItem

HWND GetDlgItem(
  HWND hDlg,
  int  nIDDlgItem
);

 

ComboBox_AddString() 사용 실습 

void ComboBox_AddString(
   hwndCtl,
   lpsz
);

 

#include "framework.h"
#include "WindowsProject8_ComboBox.h"
#include <stdio.h>
#include "Windowsx.h"

INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    return 0;
}

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hComboBox; //정적 변수 선언
    static const char* strMenu[] = { "메뉴1","메뉴2","메뉴3" }; //문자열 각각의 메모리 주소가 저장됨
    switch (message)
    {
    case WM_INITDIALOG:
        hComboBox = GetDlgItem(hDlg, IDC_COMBO1); //핸들 얻음
        for (int i = 0; i < 3; i++) {
            ComboBox_AddString(hComboBox, strMenu[i]);
        }
        return (INT_PTR)TRUE;

    case WM_CLOSE:
        EndDialog(hDlg, 0);
        return (INT_PTR)TRUE;
    }
    return (INT_PTR)FALSE;
}

hComboBox 핸들을 선언하고, 각각의 문자열 주소를 저장할 strMenu를 선언한다.

Dialog를 실행할 때 콤보박스의 핸들을 얻어와서 hComboBox에 저장한 뒤 AddString()을 통해 설정한 문자열을 넣어주고 있다.

 

결과

 

 

※ ComboBox_DeleteString() 사용 실습 - 역순으로 삭제

void ComboBox_DeleteString(
   hwndCtl,
   index
);

DlgProc 함수에서 표시된 부분을 추가한다. DeleteString 함수 사용

 

버튼을 클릭할 때마다 항목이 하나씩 사라지고, 모두 지운 뒤에 버튼을 클릭하면 설정한 메세지 창이 뜬다.

 

 

ComboBox_InsertString() 사용하여 항목 추가 실습

void ComboBox_InsertString(
   hwndCtl,
   index,
   lpsz
);

 

코드 추가
WM_COMMAND 문을 switch-case문으로 바꾼 후 삽입 버튼을 누를 때 삽입이 되도록 한다.

 

해당 인덱스에 알맞게 추가되었다.

 

ComboBox_GetCurSel()을 통해 인덱스 조사

void ComboBox_GetCurSel(
   hwndCtl
);

IDC_BUTTON3 추가 후 인덱스 조사하기

 

정상적으로 처리하는 것을 알 수 있다.

단지, 메뉴를 추가한 뒤 인덱스가 늘어난 경우에 대해선 처리하지 못하므로 추후에 이를 case 0,1,2로 나누지 말고 for문으로 바꿔야할 것 같다.

 


3. List Box

- 리스트 출력 영역 안에서 항목 선택

- 지정된 영역보다 많은 항목은 스크롤 바를 통해 선택

- windowsx.h 포함

 

MSDN에서 list box macro를 검색하면 해당 매크로 함수들의 목록이 나온다

 

IDC_BUTTON4 추가
리스트 박스 메뉴 추가

여기서 10이 넘어가는 순간 자동정렬 되므로 속성창에 가서 '정렬'을 FALSE로 바꿔줘야 한다.

 

 

 

'Project > WIN32 API' 카테고리의 다른 글

컨트롤(3)  (0) 2021.07.22
컨트롤  (0) 2021.07.21
다이얼로그  (0) 2021.07.21
키보드, 마우스  (0) 2021.07.13
그래픽 오브젝트  (0) 2021.07.12
1. 모달형 다이얼로그
2. 모델리스형 다이얼로그
3. 폼 기반 윈도우 프로그램
4. 파일열기 모달형 다이얼로그

 

다이얼로그

① 모달(Modal)형 다이얼로그 : 대화상자를 닫기 전 다른 윈도우로 전환할 수 없는 대화상자

② 모델리스(Modeless)형 다이얼로그 : 대화상자를 열어 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자

 

1. 모달형 다이얼로그

- 다이얼로그가 최우선 순위

- 대표적인 다이얼로그 형태 MessageBox()

 

- MessageBox()를 이용한 모달형 다이얼로그 확인 예제

리소스 - Menu - 모달형 메뉴 추가 후 ID 편집으로 ID 확인

 

WM_command 에서 MessageBox() 띄우는 간단한 예시 코드 작성

 

모달형 메시지 박스

 

※ 모달 대화 상자 생성 함수

DialogBox() 

INT_PTR DialogBox(
   HINSTANCE hInstance,
   LPCTSTR lpTemplate,
   HWND hWndParent,
   DLGPROC lpDialogFunc
);

 

 

※ 폼 생성과 lpTemplate 설정

폼 아이디 → 고유 값

폼 아이디를 변환하는 매크로 함수 MAKEINTRESOURCE() → lpTemplate에 지정

 

폼 생성

 

※ 다이얼로그 프로시저

:: 일반 윈도우 메시지와 동일하다. 콜백 함수의 형식을 가진다(메세지에 따라 반응).

DLGPROC Dlgproc;

INT_PTR CALLBACK Dlgproc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
);

DialogProc과 WndProc 차이

- WndProc 메세지 처리 → DefWindowProc

- Dialog 메세지 처리 → TRUE, FALSE

 

 

※ EndDialog() 함수 호출

- 다이얼로그 해제되면서 부모 윈도우로 리턴해줄 수 있음. 이때 사용

BOOL EndDialog(
  HWND    hDlg,
  INT_PTR nResult
);

 

nResult :: 부모 윈도우에게 전달되는 값(전역변수). 기본 값 = 0 

 

→ 기본적인 해제 적용 방법? WM_CLOSE에서 EndDialog() 호출

 

DlgProc 선언
위 메시지 박스 코드 바로 아래에 DialogBox 함수 작성
About 함수를 복사해온 후 일부 코드 추가

Close 버튼과 OK 버튼, 취소 버튼 등을 누르면 EndDialog() 함수가 실행이 되면서 다이얼로그 창이 해제된다.

 

DialogBox 메세지


2. 모델리스형 다이얼로그

※ 생성 함수 CreateDialog 

- 모달 다이얼로그를 생성하는 DialogBox 함수와 이름만 다를 뿐 매개변수는 똑같다.

HWND CreateDialog(
   HINSTANCE hInstance,
   LPCTSTR lpTemplate,
   HWND hWndParent,
   DLGPROC lpDialogFunc
);

 

※ 모달형과 폼 생성 방법은 동일하다.

주의할 사항은 폼 속성 중에 Visible을 True로 설정해야 한다는 것! 

 

 

※ 해제 함수 DestroyWindow

BOOL DestroyWindow(HWND hWnd);

→ WM_CLOSE에서 호출한다.

 

리소스 메뉴 추가
visible = TRUE
WM_command case 문 추가
WndProc에 추가
메뉴
결과


3. 폼 기반의 윈도우 프로그램

:: WinMain()과 DialogBox() 호출 필요함 

DialogBox(인스턴스, 다이얼로그 아이디, 0, 콜백함수) → 부모 윈도우 자리에 0

 

※ DialogProc 연결

전체 코드(비교적 짧다)
빈 창

 

※ 타이틀 바꾸기

1. 리소스 속성창에서 변경

타이틀 변경

2. SetWindowText()로 변경

 

다이얼로그 시작시 제목을 "이미지"로 변경하고자 함
변경 확인


4. 파일열기 모달형 다이얼로그

:: 파일경로, 파일명을 알아오는 기능, #include <commdlg.h>

 

※ 생성 함수 GetOpenFileName

BOOL GetOpenFileNameA(
  LPOPENFILENAMEA lpofn
);

GetOpenFileName의 매개변수로는 OPENFILENAME이라는 구조체가 들어가며, 이 구조체 안에는 수많은 정보가 있다.

typedef struct tagOFN_NT4A {
  DWORD         lStructSize; //구조체 크기(몇 바이트 차지하는지)
  HWND          hwndOwner; //부모 윈도우 핸들
  HINSTANCE     hInstance;
  LPCSTR        lpstrFilter; //파일형식 설명 → \*.확장자\0 방식
  LPSTR         lpstrCustomFilter;
  DWORD         nMaxCustFilter;
  DWORD         nFilterIndex; //선택한 파일 인덱스, 1부터 시작
  LPSTR         lpstrFile; //전체 경로를 저장할 배열 설정. static 변수 또는 전역변수로 설정
  DWORD         nMaxFile; //파일경로 최대 길이 설정
  LPSTR         lpstrFileTitle; //파일명을 저장할 배열 설정. static 변수 또는 전역변수로 설정
  DWORD         nMaxFileTitle; //파일명 길이 지정
  LPCSTR        lpstrInitialDir;
  LPCSTR        lpstrTitle; //다이얼로그 타이틀 문자열 출력
  DWORD         Flags;
  WORD          nFileOffset;
  WORD          nFileExtension;
  LPCSTR        lpstrDefExt;
  LPARAM        lCustData;
  LPOFNHOOKPROC lpfnHook;
  LPCSTR        lpTemplateName;
} OPENFILENAME_NT4A, *LPOPENFILENAME_NT4A;

 

리소스 메뉴 추가
WndProc에 변수 선언
WM_COMMAND에 열기(32771)가 선택됐을 때의 동작을 선언

 

화면에 표시

※ 파일 저장 모달형 다이얼로그

:: 파일 열기 모달형과 대부분 같다. #include <commdlg.h>

 

※ 생성 함수 GetSaveFileName

BOOL GetSaveFileName(
  LPOPENFILENAMEA lpofn
);

 

리소스 메뉴 추가
열기와 거의 유사하나 표시한 부분만 조금 달라진다. 확장자의 유무에 따라 확장자 추가를 결정한다.

 

'Project > WIN32 API' 카테고리의 다른 글

컨트롤(2)  (0) 2021.07.22
컨트롤  (0) 2021.07.21
키보드, 마우스  (0) 2021.07.13
그래픽 오브젝트  (0) 2021.07.12
그래픽  (0) 2021.07.08

+ Recent posts