1. 속성창 수정안하고, 코드에서 부르기
새 콘솔 창 생성하기
또 다른 방법으로는 프로그램 실행 중에 콘솔 창을 동적으로 생성하는 방법이 있습니다.

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();

public Form1()
{
    InitializeComponent();
    
    AllocConsole();
    
    Console.WriteLine("이것은 콘솔 창에 출력됩니다.");
}


2. 프로젝트 설정 변경하기

C# Windows Forms 애플리케이션에서 Console.WriteLine()을 사용하여 명령 프롬프트 창에 메시지를 출력하려면, 프로젝트 설정을 변경하여 애플리케이션을 "콘솔 애플리케이션"으로 설정해야 합니다. 이렇게 하면 Windows Forms 애플리케이션이 실행될 때 콘솔 창이 함께 나타나고, Console.WriteLine()으로 메시지를 출력할 수 있습니다.

방법 1: 프로젝트 설정 변경하기

  1. Visual Studio에서 Windows Forms 프로젝트를 엽니다.
  2. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고, "속성"을 선택합니다.
  3. "애플리케이션" 탭에서 "출력 형식"을 콘솔 응용 프로그램으로 변경합니다.

public class PublicNM
{

     public const int WM_KEYDOWN = 0x0100;

    // FindWindow를 정적 메서드로 선언합니다.
    public static IntPtr FindWindow(string lpClassName, string lpWindowName)
    {
        // 실제 FindWindow 구현은 생략
        return IntPtr.Zero; 
    }
}

사용예)

         // 정적 메서드에 접근할 때는 클래스 이름을 사용합니다.
         IntPtr hWnd = PublicNM.FindWindow("ClassName", "WindowName");

        protected override bool ProcessCmdKey(ref Message message, Keys keyData)
        {
            switch (message.Msg)
            {
                case PublicNM.WM_KEYDOWN:
                    break;
                default:
                    break;
            }
            return base.ProcessCmdKey(ref message, keyData);
        }

( ChatGPT )c# List 와 배열의 차이점

C#에서 List와 배열(Array)의 주요 차이점은 다음과 같습니다:

  1. 크기 조절 가능 여부:
    • 배열(Array): 배열은 선언된 크기를 초과하거나 축소할 수 없습니다. 한 번 생성되면 크기가 고정됩니다.
    • List: List는 동적으로 크기가 조절될 수 있습니다. 요소를 추가하거나 제거할 때 List 내부에서 자동으로 크기가 조절됩니다.
  2. 메서드와 기능:
    • 배열(Array): 배열은 .NET Framework에서 제공하는 여러 메서드와 기능이 있지만, 크기 조절이나 요소 추가/삭제에 제한이 있습니다. 예를 들어, Array 클래스는 Length 속성을 통해 배열의 길이를 확인할 수 있습니다.
    • List: List는 배열보다 다양한 메서드와 기능을 제공합니다. 예를 들어, 요소 추가/삭제를 위한 Add, Remove, Insert 메서드 등이 있습니다. 또한 LINQ 쿼리와 함께 사용할 수 있는 다양한 확장 메서드를 사용할 수 있습니다.
  3. 선언 및 초기화:
    • 배열(Array): 배열은 고정된 크기를 선언하고 초기화해야 합니다. 예를 들어, int[] numbers = new int[5];와 같이 선언하고 초기화합니다.
    • List: List는 크기를 선언하지 않고 생성할 수 있으며, 초기 요소를 포함할 수도 있습니다. 예를 들어, List<int> numbers = new List<int>();로 선언하고 초기화합니다.
  4. 타입 안정성:
    • 배열(Array): 배열은 특정 데이터 형식으로 타입 안전성을 보장합니다. 즉, 선언된 데이터 형식 이외의 데이터를 저장할 수 없습니다.
    • List: List는 제네릭 형식으로 제공되며, 특정 데이터 형식에 대한 타입 안정성을 보장합니다.

이러한 차이점으로 인해 상황에 따라 배열이나 List 중 하나를 선택하여 사용할 수 있습니다. 배열은 크기가 고정된 정적 데이터에 적합하고, List는 동적인 데이터 구조에 적합합니다.

ChatGPT)
C#에서 public string SpecificPay { get; set; }와 public string SpecificPay;의 차이는 다음과 같습니다:

1. public string SpecificPay { get; set; }

public string SpecificPay { get; set; }: 이것은 C#의 속성(Property)입니다. 속성은 클래스의 멤버로, 해당 속성에 대한 값을 캡슐화하고, 접근을 제어하며, 필요한 경우 추가 로직을 적용할 수 있습니다. 이 특정 속성은 읽기 및 쓰기가 가능합니다(getter와 setter 모두가 존재함).

2. public string SpecificPay;

public string SpecificPay;: 이것은 클래스의 필드(Field)입니다. 필드는 해당 클래스의 인스턴스마다 각각의 값을 저장합니다. 이것은 간단한 데이터 저장 용도로 사용되며, 특별한 접근 로직이나 제한이 없습니다. 직접적으로 필드에 접근하여 값을 설정하거나 가져올 수 있습니다.


따라서, 첫 번째 선언은 읽기 및 쓰기가 가능한 속성을 정의하고, 두 번째 선언은 클래스의 필드를 정의합니다.

결과화면)


(CHAT.GPT)
WPF에서 메인 윈도우에서 클래스를 호출하고, 해당 클래스에서 다이얼로그를 메인 윈도우의 가운데에 위치하도록 호출하려면, 다음과 같은 절차를 따르면 됩니다.

  1. 메인 윈도우에서 클래스 호출
  2. 클래스에서 다이얼로그 호출 시 메인 윈도우를 기준으로 위치 설정



1. MainWindow.xaml.cs

메인 윈도우에서 클래스를 호출하는 버튼 클릭 이벤트를 설정합니다.

using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OpenDialogFromClassButton_Click(object sender, RoutedEventArgs e)
        {
            DialogHelper helper = new DialogHelper();
            helper.ShowDialog(this);
        }
    }
}

2. DialogHelper.cs

다이얼로그를 표시할 클래스입니다.

using System.Windows;

namespace WpfApp
{
    public class DialogHelper
    {
        public void ShowDialog(Window owner)
        {
            DialogWindow dialog = new DialogWindow
            {
                Owner = owner,
                WindowStartupLocation = WindowStartupLocation.CenterOwner
            };
            dialog.ShowDialog();
        }
    }
}

3. DialogWindow.xaml

다이얼로그 윈도우의 XAML 파일입니다.

<Window x:Class="WpfApp.DialogWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DialogWindow"
        Height="200"
        Width="400">
    <Grid>
        <!-- 다이얼로그의 UI 요소들 -->
    </Grid>
</Window>

4. DialogWindow.xaml.cs

다이얼로그 윈도우의 코드 비하인드 파일입니다.

using System.Windows;

namespace WpfApp
{
    public partial class DialogWindow : Window
    {
        public DialogWindow()
        {
            InitializeComponent();
        }
    }
}

5. MainWindow.xaml

메인 윈도우의 XAML 파일에서 클래스를 호출하여 다이얼로그를 여는 버튼을 추가합니다.

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="450"
        Width="800">
    <Grid>
        <Button Content="Open Dialog from Class" Click="OpenDialogFromClassButton_Click" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

요약

이 구조에서는 DialogHelper 클래스가 메인 윈도우의 인스턴스를 인자로 받아 다이얼로그를 중앙에 위치하도록 설정합니다. 이렇게 하면 다이얼로그 윈도우가 항상 메인 윈도우의 중앙에 표시됩니다.







case1)
Application.Exit();

case2)
System.Diagnostics.Process.GetCurrentProcess().Kill();

 

 

# DispatcherTimer  활용사례

using System;
using System.Windows.Threading;
using Systehttp://m.Windows.Forms;
using System.Timers;
using System.IO;

namespace APM
{
    public partial class APMMain : Form
    {
        private DispatcherTimer displayTimer1 = new DispatcherTimer(); //유가
        private DispatcherTimer displayTimer2 = new DispatcherTimer(); //코스닥
        private DispatcherTimer displayTimer3 = new DispatcherTimer(); //파생
        private DispatcherTimer displayTimer4 = new DispatcherTimer(); //채권

        private int sec1, sec2, sec3, sec4;


        public APMMain()
        {
            InitializeComponent();

            InitControl();
        }
        void InitControl()
        {
            

            displayTimer1.Interval = TimeSpan.FromSeconds(interval);
            displayTimer1.Tick += new EventHandler(displayTimer_Tick);
            sec1 = 0;
            displayTimer2.Interval = TimeSpan.FromSeconds(interval);
            displayTimer2.Tick += new EventHandler(displayTimer_Tick);
            sec2 = 0;
            displayTimer3.Interval = TimeSpan.FromSeconds(interval);
            displayTimer3.Tick += new EventHandler(displayTimer_Tick);
            sec3 = 0;
            displayTimer4.Interval = TimeSpan.FromSeconds(interval);
            displayTimer4.Tick += new EventHandler(displayTimer_Tick);
            sec4 = 0;

            displayTimer1.Start();
            displayTimer2.Start();
            displayTimer3.Start();
            displayTimer4.Start();

            
        }

        void displayTimer_Tick(object sender, EventArgs e)
        {
            if ((sender as DispatcherTimer).Equals(displayTimer1))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec1++);
                timer1.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }

            else if ((sender as DispatcherTimer).Equals(displayTimer2))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec2++);
                timer2.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }

            else if ((sender as DispatcherTimer).Equals(displayTimer3))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec3++);
                timer3.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }

            else if ((sender as DispatcherTimer).Equals(displayTimer4))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec4++);
                timer4.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }
        }

        #region WndProc
        protected override void WndProc(ref Message m)
        {

            switch (m.Msg)
            {
                default:
                    break;
            }
            base.WndProc(ref m);
        }
        #endregion   

        public void SetRegin()
        {
            //
        }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        }
    }
}

/*
KEYPOINT) DateTime now = DateTime.ParseExact(MANUAL_DT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
*/


using System;
using System.Timers;
using System.IO;


class Program
{
    public static void Main()
    {
        CHKNMNM nmm = new CHKNMNM();
        nmm.CALCCHK();
        nmm.REALCHK();
        nmm.DISPCHK();
    }
}

class CHKNMNM
{
    string[] HOLIDAY = new string[]
    {
        "2024-01-01",
        "2024-02-09",
        "2024-02-12",
        "2024-03-01",
        "2024-04-10",
        "2024-05-01",
        "2024-05-06",
        "2024-05-15",
        "2024-06-06",
        "2024-08-15",
        "2024-09-16",
        "2024-09-17",
        "2024-09-18",
        "2024-10-03",
        "2024-10-09",
        "2024-12-25",
    };
    string[] HOLIDAYNM = new string[]
    {
        "2024-01-01(신정)",
        "2024-02-09(구정)",
        "2024-02-12(구정)",
        "2024-03-01(삼일절)",
        "2024-04-10(선거일)",
        "2024-05-01(노동절)",
        "2024-05-06(어린이날대체)",
        "2024-05-15(부처님오신날)",
        "2024-06-06(현충일)",
        "2024-08-15(광복절)",
        "2024-09-16(추석)",
        "2024-09-17(추석)",
        "2024-09-18(추석)",
        "2024-10-03(개천절)",
        "2024-10-09(한글날)",
        "2024-12-25(크리스마스)",
    };
    string[] YOIL = new string[]
    {
    "MONDAY",
    "TUESDAY",
    "WEDNESDAY",
    "THURSDAY",
    "FRIDAY",
    "SATURDAY",
    "SUNDAY",
    };
    string[] RANDOMNM = new string[]
    {
    "CHO","PARK","JIN",
    };
    string CHKDateFormat = "yyyy-MM-dd";

    const int MAX_CNT = 1024;
    string[] CHKNM = new string[MAX_CNT];
    string[] CHKDT = new string[MAX_CNT];
    string[] CHKYO = new string[MAX_CNT];
    string[] CHKRM = new string[MAX_CNT];

    string MANUAL_DT = "20230101121212";

    public void CALCCHK()
    {
        int ii = 0; //(1-MON, 7-SUNDAY)
        int day = 0;
        int mm = 0;
        int kk = 0;

        DateTime now = DateTime.ParseExact(MANUAL_DT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);

        DateTime calcnow;

        //POINT:CHKRM's INCREASE ITSELF
        //POINT:RANDOMNM's INCREASE ITSELF
        //POINT:CHKRM's INCREASE ITSELF
        //POINT:RANDOMNM's INCREASE ITSELF

        while (true)
        {
            calcnow = now.AddDays(day);
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) < 20231231)
            {
                day++;
                continue;
            }
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20250101) break;
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20231231) ii = 7;




            int check = 0;
            for (int ff = 0; ff < HOLIDAY.Length; ff++)
            {
                if (calcnow.ToString(CHKDateFormat) == HOLIDAY[ff])
                {
                    check = 100;
                    break;
                }
            }


            if (check == 0)
            {
                if (ii == 4) CHKRM[kk++] = RANDOMNM[mm++ % 3];
                else if (ii == 5) CHKRM[kk++] = RANDOMNM[mm++ % 3];
            }
            else
            {
                if (ii == 1) CHKRM[kk++] = "PARK";
                else if (ii == 2) CHKRM[kk++] = "JIN";
                else if (ii == 3) CHKRM[kk++] = "CHO";
                else if (ii == 4) CHKRM[kk++] = RANDOMNM[mm++ % 3];
                else if (ii == 5) CHKRM[kk++] = RANDOMNM[mm++ % 3];
            }

            day++;
            ii++;

            if (ii == 8) ii = 1;
        }
    }
    public void REALCHK()
    {
        int ii = 0; //(1-MON, 7-SUNDAY)
        int day = 0;
        int kk = 0;
        int sum = 0;

        DateTime now = DateTime.ParseExact(MANUAL_DT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
        DateTime calcnow;

        while (true)
        {
            calcnow = now.AddDays(day);
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) < 20231231)
            {
                day++;
                continue;
            }
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20250101) break;
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20231231) ii = 7;




            int check = 0;
            for (int ff = 0; ff < HOLIDAY.Length; ff++)
            {
                if (calcnow.ToString(CHKDateFormat) == HOLIDAY[ff])
                {
                    check = 100;
                    break;
                }
            }


            if (check == 0)
            {
                if (ii == 1)
                {
                    CHKNM[sum] = "PARK";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 2)
                {
                    CHKNM[sum] = "JIN";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 3)
                {
                    CHKNM[sum] = "CHO";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 4)
                {
                    CHKNM[sum] = CHKRM[kk++];
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 5)
                {
                    CHKNM[sum] = CHKRM[kk++];
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 6)
                {
                    CHKNM[sum] = "HOLIDAY";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 7)
                {
                    CHKNM[sum] = "HOLIDAY";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
            }
            else if (check == 100)
            {
                CHKYO[sum] = YOIL[ii - 1];
                CHKDT[sum] = calcnow.ToString(CHKDateFormat);

                int subcheck = 0;
                for (int ff = 0; ff < HOLIDAY.Length; ff++)
                {
                    if (CHKDT[sum] == HOLIDAY[ff])
                    {
                        CHKNM[sum] = HOLIDAYNM[ff];
                        subcheck = 100;
                        break;
                    }
                }
                if (subcheck == 0)
                {
                    CHKNM[sum] = "SPECIAL";
                }
            }

            day++;
            ii++;
            sum++;

            if (ii == 8) ii = 1;
        }
    }
    public void DISPCHK()
    {
        int kk = 0;
        int ____park_k = 0, ____jin_k = 0, ____cho_k = 0;

        while (true)
        {
            string dateTxt = "";
            string nameTxt = "";

            int check = 0;
            for (int ii = 0; ii < 7; ii++)
            {
                dateTxt += CHKDT[kk] + " ";
                nameTxt += CHKNM[kk] + " ";

                if (CHKNM[kk] == "PARK") ____park_k++;
                else if (CHKNM[kk] == "JIN") ____jin_k++;
                else if (CHKNM[kk] == "CHO") ____cho_k++;

                if (CHKDT[kk] == "2024-12-31")
                {
                    check = 100;
                    break;
                }

                kk++;
            }
            Console.WriteLine(dateTxt);
            Console.WriteLine(nameTxt);

            if (check == 100) break;
        }
    }
}







'c# 언어 > 초급과정' 카테고리의 다른 글

프로세스.종료  (0) 2024.03.16
DispatcherTimer 활용사례  (0) 2024.03.12
SetWindowLong 함수란 무엇인가  (0) 2024.01.30
Windows Form 실행시에 Message 순서출력  (0) 2024.01.06
공백여러개를 하나로 정리하기  (0) 2023.12.13

+ Recent posts