[Develog] 메모장프로그래밍 3 - 메뉴바

이성훈·2021년 12월 23일
0

DEVELOG

목록 보기
3/14

저번 포스팅까지 만든 솔루션은 다시 삭제하고 처음부터 다시만들었다..

여기의 미리컴파일된 헤더기능을 체크하고 다시만들었다.
다시만들고나서

이렇게 윈도우를 만드는 기능빼고 모두를 삭제했는데 여기서

이런 오류가 뜨길래 잘 찾아보니,

이 클래스네임이라는 속성을 빼먹었다..

#include "pch.h"
#include "framework.h"
#include "MEMO.h"

//윈도우에서 발생한 메시지를 처리하는 함수
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	//처리하고싶은 내용들을 작성하는 부분
	//종료메시지를 받지않고 윈도우자체가 파괴된경우 (X 눌렀을때)
	//자신의 응용프로그램에 VM_QUIT메시지를 보내 종료시킴
	if (uMsg == WM_DESTROY)PostQuitMessage(0); //중요


	//만약내가 처리하지않은 기본 메시지들을 대신 처리해주는 함수
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

//윈도우 클래스 등록
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASS wc;
	wchar_t my_class_name[] = L"test";
	wc.cbClsExtra = NULL;
	wc.cbWndExtra = NULL;
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW); //커서의 핸들값 저장
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //아이콘의 핸들값 저장
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = my_class_name;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;

	RegisterClass(&wc);

	//윈도우를 생성하는부분
	//hWnd : 윈도우 핸들
	HWND hWnd = CreateWindow(my_class_name, L"www.test.com",
		WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL,
		hInstance, NULL);
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	//프로그램에 전달된 메시지를 번역, 실행하는부분
	//Win32 프로그램은 운영체제나 다른 프로그램상에
	//메시지를 주고받는 방식. 그래서 항상 메시지를 받도록
	//메시지 큐를 가지고있고 전달받은 메시지로 프로그램을 실행
	MSG msg; //메시지 구조체
	//평상시는 메시지에 0이아닌값을 받으나
	//VM_QUIT메시지를 받으면 0값으로, 반복문이 종료됨
	while (GetMessage(&msg, NULL, 0, 0)) { 
		//메시지가 가상키관련시, 아스키값으로 해석된 추가 메시지를 발생
		TranslateMessage(&msg); 
		//WndProc함수를 호출.
		DispatchMessage(&msg);
	}
	//반복문의 종료는 프로그램의 종료이다.
	return msg.wParam;
}


이렇게 빈 윈도우창이뜨는것까지 구현된모습이다.

여기서 핸들이라는 개념이 등장하는데, 핸들은 응용프로그램이 리소스에 직접접근하면 위험하기때문에(응용프로그램이 비정상동작하는경우등) 어떤 API함수가 중간에 위치하여, 리소스의 주소를 정수로 치환한값을 핸들이라고한다.
출처 : https://d-yong.tistory.com/19

  1. 응용프로그램이 원하는 리소스 사용요청을 API에게 전달
  2. API는 (운영체제)리소스에 직접접근하여 메모리주소확인
  3. 리소스는 핸들테이블에 리소스주소기록, 핸들값을 생성하여 API에게전달
  4. API가 응용프로그램에 핸들값전달

핸들을 의미하는 자료형은 모두 앞이 H로 시작한다.
(HINSTANCE, HBRUSH, HCURSOR...)

다음으로 메인 윈도우에 메뉴바를 만들어보겠다.


만약에 이런식으로 오류가뜬다면 현재 에디터의 resource.h를 닫으면 해결된다.

이대로 새로만들면

간단하게 하나씩 만들수있다!!

여기서 wc.lpszMenuName 의 값으로 L"IDR_MENU1", L"MEMO", L"MENU"등 여러개를 시도했으나 전혀안됬는데..

이렇게 추가하고나니까 정상적으로 메뉴바가 추가되었다.
이제 각각 기능들을 코딩하면 될듯..

profile
I will be a socially developer

0개의 댓글