관리 메뉴

Bull

간단한 Win32 SDK 윈도우 프로그램 본문

Software Framework/MFC

간단한 Win32 SDK 윈도우 프로그램

Bull_ 2023. 9. 10. 22:07

소스코드

 

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wPraram, LPARAM IParam);
int WINAPI WinMain(
	_In_ HINSTANCE hInstance, 
	_In_opt_ HINSTANCE hPrevInstance, 
	_In_ LPTSTR lpszCmdLine,
	_In_ int nCmdShow
	) 
{
	HWND hwnd; // 윈도우 핸들
	MSG msg; // 메시지 구조체
	WNDCLASSEX WndClass; // 윈도우 클래스 구조체

	// 윈도우 클래스 구조체 WndClass에 값을 채워 등록
	WndClass.cbSize = sizeof(WNDCLASSEX); //구조체 크기
	WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; // 클래스 스타일
	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 = "EasyText"; // 윈도우 클래스 이름
	WndClass.hIconSm = 0; // 기본적인 작은 아이콘

	// 윈도우 클래스 등록
	RegisterClassEx(&WndClass);

	// 프레임 윈도우 생성
	hwnd = CreateWindow(
		"EasyText",
		"Practice1a",
		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 msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam) {
	HDC hdc; // 디바이스 컨텍스트
	RECT rect; // RECT 구조체
	PAINTSTRUCT ps; // 페인트 구조체
	LPCSTR szMsg1 = "I love Window Programming!"; // 윈도우에 출력될 문자열
	LPCSTR szMsg2 = "키보드가 눌러졌습니다."; // 키보드를 눌렀을 때 출력될 문자열
	LPCSTR szMsg3 = "키보드가 떼어졌습니다."; // 키보드를 떼었을 때 출력될 문자열

	// 커널에 들어온 메시지를 switch 문을 이용하여 처리
	switch (message) {
	case WM_CREATE: // 윈도우 생성 메시지가 온 경우
		break;
	case WM_PAINT: // 화면에 출력 메시지가 온 경우
		hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc, 10, 10, szMsg1, strlen(szMsg1)); // 윈도우에 문자열을 출력
		EndPaint(hwnd, &ps);
		break;
	case WM_KEYDOWN: // 키보드의 키가 눌린 경우
		hdc = GetDC(hwnd);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, szMsg2, strlen(szMsg2), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		ReleaseDC(hwnd, hdc);
		break;
	case WM_KEYUP: // 키보드의 키가 떼어진 경우
		hdc = GetDC(hwnd);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, szMsg3, strlen(szMsg3), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		ReleaseDC(hwnd, hdc);
		break;
	case WM_LBUTTONDBLCLK: // 왼쪽 마우스 더블 클릭한 경우
		MessageBox(hwnd, "마우스 더블 클릭!", "마우스 메시지", MB_OK | MB_ICONASTERISK);
		break;
	case WM_DESTROY: // 프로그램 종료 메시지가 온 경우
		PostQuitMessage(0);
		break;
	default: // 그 외 메시지
		return DefWindowProc(hwnd, message, wParam, IParam);
	}
	return 0;
}

 

기본적인 SDK의 틀과 키보드가 떼어졌을 때, 눌려졌을 때, 더블클릭을 하였을 때 기능을 구현한 코드입니다.

 


키보드가 떼어졌을 때

 

키보드가 눌렸을 때

마우스를 더블 클릭 하였을 때

 

출처

[단계별로 쉽게 배우는 Visual C++ 2022 MFC 윈도우 프로그래밍, 정일홍 지음]의 「실습1-1」 코드

'Software Framework > MFC' 카테고리의 다른 글

[MFC] 텍스트 상자 정렬 방법  (0) 2023.10.04
[MFC] 텍스트 상자 야매 정렬 방법  (1) 2023.10.04
[visual studio2022] 리소스 뷰 탭 위치  (0) 2023.10.04
SetTimer() 함수  (0) 2023.09.13