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
) ;
)
클라이언트 영역을 가진다.
DC 핸들을 이용해 클라이언트 영역에 그래픽을 그릴 수 있다.
윈도우에 발생한 메시지를 받아 처리하는 함수인
전용 프로시져 함수 (콜백함수) 를 가지고 있다.
다양한 메시지를 받는다
{ WM_CREATE, WM_COMMAND, WM_CLOSE, WM_PAINT ... }
부모 윈도우 없이 다이얼로그만 띄어서 모든 처리를 담당하는프로그램 작성방법
#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;
}
컨트롤 핸들 구하기
컨트롤 행들을 통해 관련된 매크로를 호출할 수 있다.
사용자가 직접 값을 입력하기도 하고 직접 값을 확인하는 것도
컨트롤을 통해 이루어지기 때문에 중요하다.
HWND GetDlgItem(
HWND hDlg, // 포함하고 있는 다이얼로그 핸들
int nIDDlgIter // 컨트롤 아이디
)
SetFoucus(
HWND hwnd; // 포커스 할 윈도우
)
// 사용법
SetFocus(GetDlgItem(hDlg_소속다이얼로그, IDC_컨트롤아이디));
// 문자열,실수형 값 가져오기
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 // 부호 있는 정수인지 여부
)
눌려지면 WM_COMMAND 메시지를 발생시킨다.
LOWORD(wParam) 으로 어떤 버튼이 눌렸는지 식별할 수 있고
HIWORD(wParam) 으로 버튼이 어떤 상태에서 메시지를 발생시켰는지 알 수 있다.
LOWORD(wParam) // 아이디
HIWORD(wParam) // 컨트롤 상태를 알 수있는 "통지 코드"
다수의 선택사항을 확인하기 위한 컨트롤
선택시 WM_COMMAND 메시지 발생
LOWORD(wParam) 으로 컨트롤의 아이디를 확인, 컨트롤 식별 가능하다
아래의 매크로를 통해 언제든지 버튼의 체크 여부를 확인하고 버튼의 상태를 변경할 수 있다.
// 버튼 체크 여부 확인
UINT isDlgButtonChecked(
HWND hDlg, // 소속된 다이얼로그 핸들
int nIdButton // 컨트롤 아이디
)
// 버튼 상태 변경함수
BOOL CheckDlgButton(
HWND hDlg, // 소속된 다이얼로그 핸들
int nIDButton, // 컨트롤 아이디
UINT uCheck // 버튼의 새로운 상태. = BST_CHECKED , BST_UNCHECKED 로 설정
)
// 버튼의 체크 여부 확인 매크로. 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, // 선택할 버튼
)
선택하고자 하는 항목들을 리스트 형태로 출력 및 선택할 수 있다.
#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 // 컨트롤 핸들
)
#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 // 컨트롤 핸들
)
클라이언트 영역을 가진다.
DC 핸들을 이용해 클라이언트 영역에 그래픽을 그릴 수 있다.
윈도우에 발생한 메시지를 받아 처리하는 함수인
전용 프로시져 함수 (콜백함수) 를 가지고 있다.
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 로 바꾸어 주어야 한다.
모델리스형은 그렇게 하지 않기 때문에,
Visible(표시) = true 로 해주지 않으면 코드상에는 문제가 없으나. 화면에 표시가 되지 않는다.
CreateDialog (
HINSTANCE hInstance, // 인스턴스 아이디
LPCTSTR lpTemplate, // 컨트롤이 올려져 있는 폼, = MAKEINTRESOURCE(다이얼로그 아이디)
HWND hWndParent, // 부모 윈도우 핸들
DLGPROC lpDialogFunc // 프로시져 함수
)
보통 WM_CLOSE 에서 호출한다
DestroyWindow( HWND hWnd);