본문 바로가기
02.Bit 고급/API

01_Window 스타일 변경

by chojju 2021. 11. 29.
반응형
// 윈도우 스타일 변경
#include <windows.h>

// 실행시 윈도우 객채의 내용을 변경해서 실행 시간에 윈도우 style 변경하기
void ModifyStyle( HWND hwnd, UINT Remove, UINT Add, BOOL bReDraw = TRUE)
{
	// 1. 현재 스타일  얻어 오기	: GetWindowLong
	UINT style = GetWindowLong(hwnd, GWL_STYLE);

	// 2. style 변경				: bit 연산..
	style = style & ~Remove;
	style = style | Add;
	SetWindowLong( hwnd, GWL_STYLE, style);

	// 3. style 변경 후 다시 그려야 함.. : SetWindowPos
	if( bReDraw)
	{
		SetWindowPos( hwnd, 0, 0, 0, 0, 0, // z order, x, y, w, h
			SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME);
	}

}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch( msg )
	{
//	case WM_LBUTTONDOWN:
//		ModifyStyle( hwnd, WS_CAPTION, 0);	return 0;
//	case WM_RBUTTONDOWN:
//		ModifyStyle( hwnd, 0, WS_CAPTION);	return 0;
	
	case WM_LBUTTONDOWN:
		// 실행시 Icon 변경..
		{
			HICON hIcon = LoadIcon(0, IDI_QUESTION);
			SetClassLong(hwnd, GCL_HICON, (LONG)hIcon);
		}
		return 0;
	case WM_RBUTTONDOWN:
		// 배경색 변경..
		{
//			HBRUSH	h = (HBRUSH)GetStockObject(BLACK_BRUSH);
			HBRUSH h = CreateSolidBrush(RGB(255, 0, 0));
			SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)h);
			InvalidateRect(hwnd, 0, TRUE);

			DeleteObject(h);

		}
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, 
				   LPSTR lpCmdLine, int nShowCmd)
{
	// 1. 윈도우 클래스 만들기 
	WNDCLASS wc;
	wc.cbWndExtra			= 0;
	wc.cbClsExtra			= 0;
	wc.hbrBackground		= //(HBRUSH)GetStockObject(WHITE_BRUSH);
							  (HBRUSH)CreateSolidBrush(RGB(255, 255, 0));
	\
	wc.hCursor				= LoadCursor(0, IDC_ARROW);
	wc.hIcon				= LoadIcon(0, IDI_WINLOGO);
	wc.hInstance			= hInstance;
	wc.lpfnWndProc			= WndProc;			// DefWindowProc;
	wc.lpszClassName		= "First";
	wc.lpszMenuName			= 0;
	wc.style				= 0;

	// 2. 등록(레지스트리에)
	RegisterClass(&wc);

	// 3. 윈도우 창 만들기 
	HWND hwnd = CreateWindowEx( 0,					// WS_EX_TOPMOST
				 "first",				// 클래스 명
				 "Hello",				// 캡션바 내용
				 WS_OVERLAPPEDWINDOW, 
				 CW_USEDEFAULT , 0, CW_USEDEFAULT, 0,	// 초기 위치 
				 0, 0,			// 부모 윈도우 핸들, 메뉴 핸들
				 hInstance,		// WinMain의 1번째 파라미터 (exe 주소)
				 0);			// 생성 인자



	// 4. 윈도우 보여주기
	ShowWindow(hwnd, SW_SHOW);
	UpdateWindow(hwnd);
	

	// 5. Message 
	MSG msg;
	while( GetMessage( &msg, 0, 0, 0 ) )
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}
반응형

'02.Bit 고급 > API' 카테고리의 다른 글

03_키 다운(WM_KEYDOWN)  (0) 2021.11.29
02_Cursor 변경  (0) 2021.11.29
01_WIN32 API 기본코드  (0) 2021.11.29

댓글