C# 윈도우 폼에서 특정 부분의 폰트를 설정하는 창을 만들어보자. 

Form만 Load 이벤트 핸들러를 달아주고 나머지 박스들은 더블 클릭을 통해 자동으로 만들어진 껍질 사용

 

운영체제에 설치된 폰트 목록을 가져와 콤보박스에 넣는 함수  

 // Form1의 load 이벤트 핸들러 
        private void addFont(object sender, EventArgs e)
        {
            // 운영체제에 설치되어 있는 폰트 목록 가져오기
            FontFamily[] fonts = FontFamily.Families;
            // foreach 문을 통해 conboBox에 하나씩 넣기
            foreach (FontFamily font in fonts)
                comboFontBox.Items.Add(font.Name);
        }

폰트 설정 변경에 공통으로 사용할 함수

 void changeFont()
        {
            FontStyle style = FontStyle.Regular; // FontStyle 일반 스타일 설정
            
            if(boldCheckBox.Checked)
                style |= FontStyle.Bold; // Bold 효과 추가
            if (italicCheckBox.Checked)
                style |= FontStyle.Italic; // Italic 효과 추가
            if (underlineCheckBox.Checked)
                style |= FontStyle.Underline; // Underline 효과 추가

            // 설정한 폰트로 바꾸기 Font("폰트 이름", int(사이즈), FontStyle); 
            textBox.Font = new Font((string)comboFontBox.SelectedItem, 12, style);
        }

 

전체코드:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FontBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Form1의 load 이벤트 핸들러 
        private void addFont(object sender, EventArgs e)
        {
            // 운영체제에 설치되어 있는 폰트 목록 가져오기
            FontFamily[] fonts = FontFamily.Families;
            // foreach 문을 통해 conboBox에 하나씩 넣기
            foreach (FontFamily font in fonts)
                comboFontBox.Items.Add(font.Name);
        }
        // 폰트 변화에 공통적으로 사용할 함수
        void changeFont()
        {
            FontStyle style = FontStyle.Regular; // FontStyle 일반 스타일 설정
            
            if(boldCheckBox.Checked)
                style |= FontStyle.Bold; // Bold 효과 추가
            if (italicCheckBox.Checked)
                style |= FontStyle.Italic; // Italic 효과 추가
            if (underlineCheckBox.Checked)
                style |= FontStyle.Underline; // Underline 효과 추가

            // 설정한 폰트로 바꾸기 Font("폰트 이름", int(사이즈), FontStyle); 
            textBox.Font = new Font((string)comboFontBox.SelectedItem, 12, style);
        }

        // Bold 체크 박스 클릭 이벤트 핸들러
        private void boldCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            changeFont();
        }
        // Italic 체크 박스 클릭 이벤트 핸들러
        private void italicCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            changeFont();
        }
        // 콤보박스 클릭 이벤트 핸들러
        private void comboFontBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            changeFont();
        }
        // 밑줄 체크 박스 클릭 이벤트 핸들러
        private void underlineCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            changeFont();
        }
    }
}

 

 

C#의 WinForm의 경우는 Java의 JFrame과는 다르게

폼 디자이너 툴을 제공하여 프로그래머가 일일이 컴포넌트를 구현할 필요 없이 그림 그리듯 GUI를 만드는 것이 가능하며

이를 WYSIWYG(What You See Is What You Get)방식의 개발이라고 합니다.

 

java: 간단한 로그인 화면 만들기

import javax.swing.*;
import java.awt.*;

public class SimpleLoginForm extends JFrame {
   public SimpleLoginForm(){
           JPanel p = new JPanel();
           Label lid = new Label("id");
           Label lpwd= new Label("pass");
           add(lid);
           add(lpwd);
           TextField tid = new TextField();
           TextField tpwd = new TextField();
           add(tid);
           add(tpwd);
           JButton jsave = new JButton("저장");
           add(jsave);
           lid.setBounds(80, 120, 40, 40);
           lpwd.setBounds(80,190,60,40);
           
           tid.setBounds(160, 120, 200, 40);
           tpwd.setBounds(160, 190, 200, 40);        
           jsave.setBounds(165, 480, 80, 30);
      add(p);
      setSize(600,600);
      setTitle("회원가입");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);
   }    
   public static void main(String args[]) {
	   new SimpleLoginForm();
   }
}

JFrame을 상속 받고 일일이 컴포넌트들을 코딩하여 붙이고 위치 혹은 간격 설정을 프로그래머가 해주어야 한다.

정말 손이 많이 가고 번거롭다.

 

C#: 간단한 로그인 화면 만들기

이제 옆의 도구 상자에서 원하는 컴포넌트를 드래그 앤 드롭 하여 붙여넣고

적당히 클릭하여 내용을 바꿔주고 실행시키면

다음과 같이 자바와는 다르게 정말 간단하게 화면을 만들 수가 있다.

이것이 C#이다 교재를 바탕으로 윈도우 폼을 공부하던 중 초기에 콘솔 앱으로 프로젝트를 만들어 WinForm을 실행 하는 예제가 상속도 인식이 되지 않고 실행도 매끄럽게 되지 않아서 여러모로 조사하여 해결법을 찾게 공유하고자 한다. 

 

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net6.0-windows</TargetFramework>
		<ImplicitUsings>enable</ImplicitUsings>

		<UseWindowsForms>true</UseWindowsForms>
		<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>

		<Nullable>enable</Nullable>
	</PropertyGroup>

</Project>

 

해당 내용을 다음과 같이 ]net.6.0 에 -windows 옵션 추가 및  useWindowsForms 옵션 true

ImportWindowsDesktopTargets 옵션 true를 주면

 

예시 코드:

using System;
using System.Windows.Forms;

namespace UsingApplication
{
    class MainApp : Form
    {
        static void Main(string[] args)
        {
            MainApp form = new MainApp();

            form.Click += new EventHandler((sender, eventArgs) =>
            {
                Console.WriteLine("Console Window...");
                Application.Exit();
            });

            Console.WriteLine("Starting Window Application ...");
            Application.Run(form);
            Console.WriteLine("Exiting Window Application ...");
        }
    }
}

 

다음과 같이 잘 작동되는 것을 알 수가 있다.

C#: C++에서 ++를 더 붙여 C++을 계승한다는 의미로 붙여진 객체지향 언어이자 .NET에 최적화된 언어

.NET(닷넷): 1900년대 말 마이크로소프트가 인터넷 서비스는 모든 종류의 기기에서 사용할 수 있어야 한다는 비전을 가지고 만들어진 플랫폼 사업적으로는 실패 하였으나 개발자들에게 .NET 클래스 라이브러리와 C#을 안겨주었다. 

CLR(Common Language Runtime): 모든 C#으로 만든 프로그램이 실행되는 곳

자바의 JVM 처럼 운영체제에서 일정 자원을 할당 받아서 C# 소스코드를 컴파일 및 실행 +가비지 컬렉터

목적: 자신이 설치한 플랫폼에 최적화시켜 컴파일한 후 실행시키기 위함 

 

실행과정(예시): 

1. 소스파일 컴파일시 아직 하드웨어가 이해할 수 없는 중간언어로 작성된 실행 파일 생성 

2. 사용자가 해당 파일을 실행시키면 CLR이 Just In Time(실시간) 컴파일 하여 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일한 후 실행 

 

프로그램 파일 계층구조(예시): 

Hellow world 예제:

// 1번
using System; // 2번
using static System.Console; // 3번

namespace Hellow
{
    class MainApp
    {
        static void Main(String[] args)
        {
            System.Console.WriteLine("Hellow World"); // 1번
            Console.WriteLine("Hellow World"); // 2번
            WriteLine("Hellow World"); // 3번
        }
    }
}

using (~namespace): 뒤에 나올 namespace를 사용하겠다는 키워드 (비유: 자바에서의 import)

using static ~: 어떤 데이터 형식의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다는 선언

대표적으로는 콘솔로부터 데이터를 출력 입력 받는 메소드들 Write(), Read()들이 존재

namespace: 하는 일(기능)이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식 등을 하나의 이름 아래 묶어 둔 것

+만약 자바를 경험해본 사람이라면 namespace를 패키지 라고 생각하면 이해 하시는데 도움이 되실 겁니다.

static void Main(String[] args): 모든 프로그램이 실행되기 위해서는 반드시 하나 씩은 가지고 있어야 할 메소드(진입점)

 

   

 

+ Recent posts