클래스의 상속(Class inheritance)

상속이란 말을 어디선가 들어본 적이 있는 것 같지 않나요? 
짐작하는 그 상속이 맞냐구요? 네 맞습니다. 
혹시나 상속이 뭔지 들어보 적 없는 분들을 위해 무엇인지 알려드리려고 합니다. 
상속이란 네이버 지식백과를 빌어 다음과 같이 정의되어 있습니다. 
'일정한 친족적 관계가 있는 사람 사이에 한 쪽이 사망하거나 법률상의 원인이 발생하였을 때 재산적 또는 친족적 권리와 의무를 계승하는 제도'. 
즉, 부모님이 돌아가셨다고 할 때 그 유산을 자식이 물려받는 것이라고 할 수 있습니다. 
클래스의 상속도 이와 똑같습니다. 
객체 지향 프로그래밍에선 부모 클래스와 자식 클래스가 있는데, 
부모 클래스는 자식 클래스의 기반이 된다 하여 기반 클래스라고 부르기도 하고, 
자식 클래스는 부모 클래스로부터 파생되었다고 해서 파생 클래스라고도 부르기도 합니다.

C#에서, 클래스를 다른 클래스로 상속하려면 다음과 같이 클래스 이름 뒤에 콜론(:)을 추가하고 상속하려는 클래스의 이름을 덧붙이시면 됩니다.

using NoName;
using NoName.Windows.Forms;
using NoName.Timers;

class FrmMain : Form
{
NoName.Timers.Timer tm = new NoName.Timers.Timer();
FrmChild f1 = new FrmChild();

int ____width=0;
int ____height=0;
int ____idx=0;

public FrmMain()
{
this.Text="FrmMain";

tm.Elapsed += new ElapsedEventHandler(____time_tick);
tm.Interval = 1000;
tm.Start();

f1.Show();
}
void ____time_tick(object sender, ElapsedEventArgs e)
{
this.Width = f1.Width + ____width;
this.Height = f1.Height + ____height;

____width += 10;
____height += 10;

____idx++;
if(____idx==13) f1.Close();
if(____idx==14) this.Close();

this.Text = "FrmMain" + ">>>[" + ____idx.ToString("0000") + "]";
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x0100, WM_SYSKEYDOWN = 0x0104, WM_PAINT = 0x000f, WM_SIZE = 0x0005;

if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
         switch (keyData.ToString())
         {
case "Return" :
DialogResult dialogResult = MessageBox.Show("[" + this.Text + "]" + ">>Quit OK!!", "Inform",
              MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

if (dialogResult == DialogResult.OK) Application.Exit();
break;
case "Right"  :
break;
case "Left"   :
break;
         default:
             break;
         }
     }
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void WndProc(ref Message m)
{
const int WM_KEYDOWN = 0x0100, WM_SYSKEYDOWN = 0x0104, WM_PAINT = 0x000f, WM_SIZE = 0x0005;

base.WndProc(ref m);

try
{
switch(m.Msg)
{
case WM_PAINT :
break;
default:
break;
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

class FrmChildBase : Form
{
//
}

class FrmChild : FrmChildBase
{
public FrmChild()
{
this.Width=400;
this.Height=400;

this.Text="FrmChild";
}
}

class Program
{
public static void Main()
{
Application.Run(new FrmMain());
}
}






IntPtr 구조체

정의
네임스페이스:
System
어셈블리:
System.Runtime.dll
포인터나 핸들을 나타내는 데 사용되는 플랫폼별 형식입니다.

using NoName;
using NoName.Runtime.InteropServices;

class NotTooSafeStringReverse
{
    static public void Main()
    {
        string stringA = "I seem to be turned around!";
        int copylen = stringA.Length;

        // Allocate HGlobal memory for source and destination strings
        IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
        IntPtr dptr = Marshal.AllocHGlobal(copylen + 1);

        // The unsafe section where byte pointers are used.
        unsafe
        {
            byte *src = (byte *)sptr.ToPointer();
            byte *dst = (byte *)dptr.ToPointer();

            if (copylen > 0)
            {
                // set the source pointer to the end of the string
                // to do a reverse copy.
                src += copylen - 1;

                while (copylen-- > 0)
                {
                    *dst++ = *src--;
                }
                *dst = 0;
            }
        }
        string stringB = Marshal.PtrToStringAnsi(dptr);

        Console.WriteLine("Original:\n{0}\n", stringA);
        Console.WriteLine("Reversed:\n{0}", stringB);

        // Free HGlobal memory
        Marshal.FreeHGlobal(dptr);
        Marshal.FreeHGlobal(sptr);
    }
}

/*--------------------------------------------------------------------
D:\tmp\console>csc sample.cs /unsafe
Microsoft (R) Visual C# Compiler version 4.8.4084.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240


D:\tmp\console>
D:\tmp\console>
D:\tmp\console>
D:\tmp\console>
D:\tmp\console>
D:\tmp\console>ex44
Original:
I seem to be turned around!

Reversed:
!dnuora denrut eb ot mees I

D:\tmp\console>
--------------------------------------------------------------------*/

class Program
{
string drawText;

protected override void OnPaint(NoName.Windows.Forms.PaintEventArgs pea)
{
NoName.Drawing.Graphics formGraphics = pea.Graphics;
NoName.Drawing.Font drawFont = new NoName.Drawing.Font("바탕체", DEPTH);
formGraphics.DrawString(drawText, drawFont, NoName.Drawing.Brushes.SteelBlue, 0, 0); //x,y position display
}
void draw()
{
int ii,kk;

drawText="";

for(ii=0; ii<MAPY-1; ii++)
{
for(kk=1; kk<MAPX-1; kk++)
{
if(tris[ii,kk]==1) drawText=drawText+"()";
else drawText=drawText+"  ";
}
drawText=drawText+"\n";
}

Invalidate();
}
}

1) 핸들을 알았을떄에, 해당frm에 메세지보내기
2) 핸들은 모르지만, 타이틀을 알았을때에 해당frm에 메세지보내기

using NoName;
using NoName.Text;//Encoding
using NoName.ComponentModel;//BackgroundWorker
using NoName.Timers;
using NoName.Windows.Forms;
using NoName.Runtime.InteropServices;

class MessageHandleCls
{
public int WM_COPYDATA=0x004A;
/*--------------------------------------------------------------------------------------------------*/
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int unMsg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
/*--------------------------------------------------------------------------------------------------*/

IntPtr ____handle;

public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}

NoName.Timers.Timer tm = new NoName.Timers.Timer();
NoName.Timers.Timer tmmmm = new NoName.Timers.Timer();
Random rr = new Random();

public void running(IntPtr ____hwnd)
{
____handle=____hwnd;

tm.Elapsed += new ElapsedEventHandler(____time_tick);
tm.Interval = 1000;
tm.Start();

tmmmm.Elapsed += new ElapsedEventHandler(____time_tick_mmm);
tmmmm.Interval = 1000;
tmmmm.Start();
}
void ____time_tick(object sender, ElapsedEventArgs e)
{
int index=0;
int xpos;
string formatText="";

xpos = rr.Next() % 5;

if(xpos % 5 == 0) formatText="RIGHT";
else if(xpos % 5 == 1) formatText="LEFT";
else if(xpos % 5 == 2) formatText="DOWN";
else if(xpos % 5 == 3) formatText="RETURN";
else if(xpos % 5 == 4) formatText="SPACE";

byte[] dataByte=Encoding.UTF8.GetBytes(formatText);

COPYDATASTRUCT cpyData=new COPYDATASTRUCT();
cpyData.dwData=(IntPtr)0;
cpyData.cbData=formatText.Length;
cpyData.lpData=Marshal.AllocHGlobal(dataByte.Length);
Marshal.Copy(dataByte,0,cpyData.lpData,dataByte.Length);

IntPtr sndData=Marshal.AllocHGlobal(Marshal.SizeOf(cpyData));
Marshal.StructureToPtr(cpyData,sndData,true);

Console.WriteLine("Time:[" + DateTime.Now.ToString() + "]::" + ">>>>>>>>>>>SendStr:[" + sndData + "]");

IntPtr ____result=SendMessage(____handle, WM_COPYDATA, (IntPtr)index, sndData);

Marshal.FreeHGlobal(cpyData.lpData);
Marshal.FreeHGlobal(sndData);
}
void ____time_tick_mmm(object sender, ElapsedEventArgs e)
{
int index=0;
int xpos;
string formatText="";
IntPtr ____handle_mmm;

____handle_mmm = FindWindow(null, "DEBUGGING");

xpos = rr.Next() % 5;

if(xpos % 5 == 0) formatText="RIGHT";
else if(xpos % 5 == 1) formatText="LEFT";
else if(xpos % 5 == 2) formatText="DOWN";
else if(xpos % 5 == 3) formatText="RETURN";
else if(xpos % 5 == 4) formatText="SPACE";

byte[] dataByte=Encoding.UTF8.GetBytes(formatText);

COPYDATASTRUCT cpyData=new COPYDATASTRUCT();
cpyData.dwData=(IntPtr)0;
cpyData.cbData=formatText.Length;
cpyData.lpData=Marshal.AllocHGlobal(dataByte.Length);
Marshal.Copy(dataByte,0,cpyData.lpData,dataByte.Length);

IntPtr sndData=Marshal.AllocHGlobal(Marshal.SizeOf(cpyData));
Marshal.StructureToPtr(cpyData,sndData,true);

Console.WriteLine("Time:[" + DateTime.Now.ToString() + "]::" + ">>>>>>>>>>>SendStrTmp:[" + sndData + "]");

IntPtr ____result=SendMessage(____handle_mmm, WM_COPYDATA, (IntPtr)index, sndData);

Marshal.FreeHGlobal(cpyData.lpData);
Marshal.FreeHGlobal(sndData);
}
}

class WindowsManageCls : Form
{
const int WM_COPYDATA=0x004A;

public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}


MessageHandleCls nm = new MessageHandleCls();

public WindowsManageCls()
{
this.Text = "DEBUGGING";

nm.running(this.Handle);
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x0100, WM_SYSKEYDOWN = 0x0104;

if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
         switch (keyData.ToString())
         {
case "Return" :
DialogResult dialogResult = MessageBox.Show("Quit OK!!", "Inform",
              MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

if (dialogResult == DialogResult.OK) Application.Exit();
break;
case "Right"  :
break;
case "Left"   :
break;
         default:
             break;
         }
     }
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

try
{
switch(m.Msg)
{
case WM_COPYDATA :
COPYDATASTRUCT cds=(COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
byte[] rcvData=new byte[cds.cbData];
Marshal.Copy(cds.lpData,rcvData,0,cds.cbData);
String strText=Encoding.UTF8.GetString(rcvData);
Console.WriteLine("Time:[" + DateTime.Now.ToString() + "]::" + "ReceiveStr:[" + strText + "]");
break;
default:
break;
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

class Program
{
public static void Main(string[] args)
{
Application.Run(new WindowsManageCls());
}
}






ex40.cs
0.01MB

//NoName->System 으로 변경//NoName->System 으로 변경//NoName->System 으로 변경//NoName->System 으로 변경//NoName->System 으로 변경
using NoName; 
using NoName.ComponentModel;
using NoName.Windows.Forms;
using NoName.Drawing;
using NoName.Drawing.Drawing2D;
using NoName.Timers;

class Program
{
public static void Main(string[] args)
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);


if(args.Length==1) 
{
if(args[0]=="E") Application.Run(new OtherManageCls());
}
}
}

class OtherManageCls : Form
{
int ____hatchstyle=0;
const int WM_KEYDOWN = 0x0100, WM_KEYUP = 0x0101, WM_CHAR = 0x0102, WM_SYSKEYDOWN = 0x0104, WM_SYSKEYUP = 0x0105, WM_PAINT = 0x000f, WM_SIZE = 0x0005;

public OtherManageCls()
{
this.Width = 700;
this.Height = 300;
}
void draw()
{
int xx,yy,width,height;

xx = this.Width / 4;
yy = this.Height / 4;
width = this.Width / 4 * 2;
height = this.Height / 4;

DrawBackground(0,0,this.Width,this.Height,____hatchstyle);
DrawForeground(xx,yy,width,height,____hatchstyle);

this.Text = "Time:[" + DateTime.Now.ToString() + "]" + ">>HatchStyle Number:[" + ____hatchstyle.ToString("00") + "]";
}
void DrawForeground(int xx, int yy, int width, int height, int ____hatchstyle)
{
HatchStyle hs = (HatchStyle)____hatchstyle;
Brush myBrush = new HatchBrush(hs, NoName.Drawing.Color.SteelBlue);
Pen myPen = new Pen(NoName.Drawing.Color.LightGray, 1);

NoName.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillRectangle(myBrush, new Rectangle(xx, yy, width, height));
formGraphics.DrawRectangle(myPen , xx, yy, width, height);
}
void DrawBackground(int xx, int yy, int width, int height, int ____hatchstyle)
{
HatchStyle hs = (HatchStyle)____hatchstyle;
Brush myBrush = new HatchBrush(hs, NoName.Drawing.Color.LightYellow);
Pen myPen = new Pen(NoName.Drawing.Color.LightGray, 1);

NoName.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillRectangle(myBrush, new Rectangle(xx, yy, width, height));
formGraphics.DrawRectangle(myPen , xx, yy, width, height);
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData.ToString())
{
case "Return" :
DialogResult dialogResult = MessageBox.Show("Quit OK!!", "Inform",
MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

if (dialogResult == DialogResult.OK) Application.Exit();
break;
case "Right"  :
____hatchstyle += 1;
if(____hatchstyle == 53) ____hatchstyle=0;
break;
case "Left"   :
____hatchstyle -= 1;
if(____hatchstyle == -1) ____hatchstyle=52;
break;
default:
break;
}

draw();
}
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

try
{
switch(m.Msg)
{
case WM_PAINT :
draw();
break;
default:
break;
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

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

Data communication between Proesses!!  (0) 2022.03.25
SendMessage/FindWindow/Snd/Rcv Str  (0) 2022.03.15
HatchStyle,HatchBrush,Pen  (0) 2022.03.08
Hexa 4가지 항목으로 점수계산 로직  (0) 2022.03.06
LINQ 쿼리 소개(C#)  (0) 2022.02.23

/*____check.cs*/



using System;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;//DLL
using System.Timers;

class TouchMessageHooking
{
[DllImport("user32.dll")]
public static extern void keybd_event(byte vk, byte scan, int flags, ref int info);

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hwnd, int unMsg, IntPtr wparam, IntPtr lparam);

[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hwnd, int unMsg, int wparam, int lparam);

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string classname, string windowname);

int WM_KEYDOWN=0x0100;
int VK_F5=0x74;
int VK_ENTER=13;
int ____timeinterval=9000 * 4;
int index=0;

System.Timers.Timer tm_basic = new System.Timers.Timer();
System.Timers.Timer tm = new System.Timers.Timer();

IntPtr ____handle_mmmm  = IntPtr.Zero;
IntPtr ____handle_popup = IntPtr.Zero;

int toggle=0;
int ____thread_sleep_time=400;

ConsoleKeyInfo keyinfo;

public void running()
{
tm.Elapsed += new ElapsedEventHandler(____time_tick);
tm.Interval = ____timeinterval;
tm.Start();

tm_basic.Elapsed += new ElapsedEventHandler(____time_tick_basic);
tm_basic.Interval = 1000;
tm_basic.Start();

while(true)
{
keyinfo=Console.ReadKey(true);

if(keyinfo.Key.ToString()=="Escape")
{
break;
}
else if(keyinfo.Key.ToString()=="Spacebar")
{
if(toggle==0)
{
Console.WriteLine("Stop");
tm.Stop();
toggle=100;
}
else
{
Console.WriteLine("Restart");
tm.Start();
toggle=100;
}
}
}
}
void ____time_tick_basic(object sender, ElapsedEventArgs e)
{
Console.WriteLine(DateTime.Now.ToString() + ">>>>Index:[" + index.ToString("0000") + "]");
Console.Title = DateTime.Now.ToString() + ">>>>Index:[" + index.ToString("0000") + "]";

index++;
}
void ____time_tick(object sender, ElapsedEventArgs e)
{
IntPtr ____result=IntPtr.Zero;
bool ____toggle;
string handleCaption="http://10.1.117.11:7101/getDashboardLink.do?dashboard_type=";

____handle_mmmm=FindWindow(null, handleCaption);
____toggle=PostMessage(____handle_mmmm, WM_KEYDOWN, VK_F5, 0);

Console.WriteLine(____handle_mmmm);
if(____toggle==true) Console.WriteLine("PostMessage succ!!");
else Console.WriteLine("PostMessage fail!!");

Thread.Sleep(____thread_sleep_time);
____time_tick_mmmm();

index=0;
}
void ____time_tick_mmmm()
{
IntPtr ____result=IntPtr.Zero;
bool ____toggle;
string handleCaption="Windows Internet Explorer";

____handle_mmmm=FindWindow(null, handleCaption);
____toggle=PostMessage(____handle_mmmm, WM_KEYDOWN, VK_ENTER, 0);

Console.WriteLine(____handle_mmmm);
if(____toggle==true) Console.WriteLine("PostMessage succ!!");
else Console.WriteLine("PostMessage fail!!");
}
}

class Program
{
public static void Main()
{
TouchMessageHooking nm = new TouchMessageHooking();
nm.running();
}
}




/*File Attach*/

 

daily_check.txt
0.00MB

 

____check.cs
0.00MB

 

 

 

https://open.kakao.com/o/sleUyWBd

using System.Drawing;
using System.Drawing.Drawing2D;

void drawforeground(int xx,int yy,int width,int height,int ____hatchstyle)
{
HatchStyle hs = (HatchStyle)____hatchstyle;//0-52까지 가능
Brush myBrush = new HatchBrush(hs, System.Drawing.Color.SteelBlue);
Pen myPen = new Pen(System.Drawing.Color.LightGray, 1);

System.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillRectangle(myBrush, new Rectangle(xx, yy, width, height));
formGraphics.DrawRectangle(myPen , xx, yy, width, height);
}
void drawforeground(int xx,int yy,int width,int height,int ____hatchstyle)
{
HatchStyle hs = (HatchStyle)____hatchstyle;//0-52까지 가능
Brush myBrush = new HatchBrush(hs, System.Drawing.Color.LightYellow);
Pen myPen = new Pen(System.Drawing.Color.LightGray, 1);

System.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillRectangle(myBrush, new Rectangle(xx, yy, width, height));
formGraphics.DrawRectangle(myPen , xx, yy, width, height);
}

ex31.cs
0.00MB
ex11.cs
0.02MB

 

1. Hexa,ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1. Horizon Direction
2. Vertical Direction
3. LeftToRight Direction
4. LightToLeft Direction

2. Tettris,ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1. Horizon Direction

파일첨부

frm_common.cs
0.02MB




LINQ 쿼리 소개(C#)

쿼리 는 데이터 소스에서 데이터를 검색하는 식입니다. 
쿼리는 일반적으로 특수화된 쿼리 언어로 표현됩니다. 
관계형 데이터베이스에는 SQL이 사용되고 XML에는 XQuery가 사용되는 것처럼 시간에 따라 다양한 형식의 데이터 소스에 대해 서로 다른 언어가 개발되었습니다. 
따라서 개발자는 지원해야 하는 데이터 소스의 형식이나 데이터 형식에 따라 새로운 쿼리 언어를 배워야 했습니다. 
LINQ는 다양한 데이터 소스 및 형식에 사용할 수 있는 일관된 모델을 제공함으로써 이러한 상황을 단순화합니다. 
LINQ 쿼리에서는 항상 개체를 사용합니다. 
XML 문서, SQL 데이터베이스, ADO.NET 데이터 세트, .NET 컬렉션 및 LINQ 공급자를 사용할 수 있는 다른 모든 형식에서 데이터를 쿼리하고 변환하는 데 동일한 기본 코딩 패턴을 사용합니다.

쿼리 작업의 세 부분
모든 LINQ 쿼리 작업은 다음과 같은 세 가지 고유한 작업으로 구성됩니다.

1. 데이터 소스 가져오기.(Data Source)
2. 쿼리 만들기.(Query)
3. 쿼리 실행.(Query Execution)


ex)

using System.Linq;
using System;

class IntroToLINQ
{
    static void Main()
    {
        // The Three Parts of a LINQ Query:
        // 1. Data source.
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // 2. Query creation.
        // numQuery is an IEnumerable<int>
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // 3. Query execution.
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }
    }
}

 

/*execution display
D:\tmp\console>ex200
0 2 4 6
D:\tmp\console>
D:\tmp\console>
D:\tmp\console>
*/

WinForms와 WPF의 한가지 가장 큰 차이점은 WinForms는 단순히 Standard Windows Control(e.g a TextBox)의 최상단 레이어인 반면에 WPF는 맨처음부터 거의 모든 경우에 Standard Windows Control에 의존하지 않도록 만들어졌다.

# winform이 먼저 발표되었습니다.

마소(마이크로소프트)에서 개발한 윈도우 환경에서 개발자들이 프로그램을 개발하기 위해서는 기계어를 알아야 했지만, 개발 생산성을 올리기 위해서 다양한 프레임워크가 탄생하게 되었는데요. 그중에서 .Net Framework가 있고, 그 중에서 C#으로 개발하는데 사용되는 UI 개발도구로 Winform과 Wpf가 있습니다.

Winform의 경우 .Net 1.0 부터 지원되었고, 이는 드레그 앤 드롭 방식으로 자신이 생성하고 싶은 컨트롤을 UI 개발창에 올리면 자동으로 코드가 생성되고, 결과는 개발자가 볼 수 있는 방식이였습니다. 이는 매우 직관적이고 초보자도 쉽게 개발 할 수 있다는 장점이 있었습니다. 

이런식으로 버튼 하나를 선택해서 원하는 위치에 올리면 Control이 생성되는 방식입니다. 이때 해당 Form에는 디자인코드와 소스코드가 생성되는데요. 디자인코드는 코드보기를 선택하여 해당 Form의 디자인코드를 볼 수 있습니다. 

하지만 이 디자인 코드는 자동으로 생성이 되기 때문에 별도로 수정을 하지 않아도 어느정도 자신이 원하는 컨트롤을 만들 수 있습니다. 

Wpf의 경우 .Net 3.0 부터 지원이 되었고, Winform이 갖고 있던 다양한 한계를 해결하고 만들어졌습니다. 그래서 Winform에 비해서 더 다양한 기능과 확장성을 갖고 있습니다. 

Winform에서는 Form이라면 Wpf에서는 Control이 있습니다. Control을 상속 받아서 다양한 Control이 생성되는데요. Window, UserControl, Button 처럼 다양한 Control을 만들 수 있습니다. 

처음 Wpf 프로젝트를 생성하면 MainWindow.xaml 이라는 것을 볼 수 있는데요. 이는 C# 코드와 xaml 코드가 합쳐진 형태입니다. 그래서 xaml 코드를 이용해서 디자인 작업을 하고 C# 코드를 이용해서 필요한 기능을 구현하기도 합니다. 

위쪽이 C# 코드이고 아래쪽이 xaml 코드입니다. 실제로 xaml 코드는 다양한 곳에서 사용되는데요. 여기서 xaml은 Extensible Application Markup Language 의 약자로 흔히 마크업 언어라고 불리는 언어들 중에 하나인데요. 인터넷 브라우저에서 F12를 누르면 나오는 코드들과 비슷한 형태의 코드라고 보시면 됩니다. 

WPF는 Winform의 한계를 극복하기 위해서 그리고 더 다양한 확장성을 갖기 위해서 만들어진 UI 개발 프레임워크인데요. 처음 WPF와 Winform을 접하는 분들에게는 Winform 더 직관적이고 쉬울 수 있으나, 실제 실무에서는 Winform 보다는 Wpf를 더 많이 사용하고 있고, 다양한 클라이언트의 요구를 만족시키기 위해서라도 Wpf가 더 좋은 선택이라고 생각하는데요. 한번 배우는데, 오래 걸리고 MVVM이나 Binding, DependencyProperty 와 같은 생소한 개념들이 있기 때문에 거부감이 들 수 있지만, 이러한 기능들은 개발자의 편의를 위해서 개발된 기능이기 때문에 충분히 익힌다면, 오히려 도움이 될 것이라고 생각합니다. 


In C#,,,,,,,,

When Owner draw Control ,,,,,,,,,,,,

ex105.cs
0.00MB

#create
alias exe='cd /usr2/sinfo/exe/'
alias shell='cd /usr2/sinfo/exe/shell'
alias src='cd /usr2/sinfo/src/'
alias log='cd /usr2/sweb/logs/receive/'
alias manage='cd /usr2/sweb/data/manage/'

source ~/.bashrc

etc>
-bash-3.00$ source .bashrc_backup
-bash: .bashrc_backup: line 7: syntax error: unexpected end of file


-bash-3.00$ file /home/www/work/.bashrc
/home/www/work/.bashrc: ASCII text, with CRLF line terminators



-bash-3.00$ perl -pi -e "s/\r//g" .bashrc
-bash-3.00$ file .bashrc
.bashrc: ASCII text
-bash-3.00$ source .bashrc


#delete
unalias exe
unalias shell
unalias src
unalias log
unalias manage

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

...

/// <summary>
/// 메시지 보내기
/// </summary>
/// <param name="windowHandle">윈도우 핸들</param>
/// <param name="message">메시지</param>
/// <param name="wParam">WORD 파리미터</param>
/// <param name="lParam">LONG 파라미터</param>
/// <returns>처리 결과</returns>
[DllImport("User32.dll")]
public static extern Int64 SendMessage(IntPtr windowHandle, uint message, IntPtr wParam, IntPtr lParam);

...

/// <summary>
/// WM_PAINT
/// </summary>
private const int WM_PAINT = 0x000f;

...

#region ForcePaint(form)

/// <summary>
/// 강제로 칠하기
/// </summary>
/// <param name="form">폼</param>
public void ForcePaint(Form form)
{
    SendMessage(form.Handle, WM_PAINT, IntPtr.Zero, IntPtr.Zero);
}

#endregion


설명) Form에 테트리스게임이 수행되고 인는중이라도, 백그라운드로 쓰레드 2개가 현재 동작하는 모습을 나타냅니다.
여러모로 실전활용가능한 모델입니다.

1. Form Activate & Other Statistic Possible(Threading Background)
2. BackgroundWorker
3. Form Drawing
4. Data set,get
5. Tris
6. Form - WM_PAINT Logic

basic !!

ex11.cs
0.01MB

Background class
Tris class divide!!!

ex12.cs
0.01MB

static class ----> #define instead!!

ex13.cs
0.01MB

design pattern various!!

ex14.cs
0.01MB

/*
 * BackgroundWorker 사용법 : Form 혹은 Console이 사라지면 함께 작동을 멈춘다.
 * BackgroundWorker 클래스
   네임스페이스: System.ComponentModel
 */


using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

public class Program : Form
{
int toggle=0;

public Program()
{
this.Text="BackgroungWorker Thread Process!!";
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
         switch (keyData)
         {
         case Keys.S:
             break; 
         case Keys.F5:
             break; 
         case Keys.Enter:
             Application.Exit();
             break;
         case Keys.Tab:
             break;
         default:
             break;
         }
     }
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

try
{
switch(m.Msg)
{
default:
if(toggle==0)
{
BackgroundMakeCls nm = new BackgroundMakeCls();
nm.running();

toggle=100; //Form이 실행시에 오직 한번만 수행하도록 한다.
}
break;
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Program());
}
}

public class BackgroundMakeCls
{
BackgroundWorker recvWorker = new BackgroundWorker();
BackgroundWorker sendWorker = new BackgroundWorker();

public void running()
{
recvWorker.DoWork += new DoWorkEventHandler(recvWorker_DoWork);
recvWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(recvWorker_RunWorkerCompleted);

sendWorker.DoWork += new DoWorkEventHandler(sendWorker_DoWork);
sendWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(sendWorker_RunWorkerCompleted);

recvWorker.RunWorkerAsync();
}
void recvWorker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine(">>>>recvWorker_DoWork");
}
void recvWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
Console.WriteLine(">>>>recvWorker_RunWorkerCompleted");

try
{
if(! sendWorker.IsBusy) sendWorker.RunWorkerAsync();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
void sendWorker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine(">>>>recvWorker_DoWork");
}
void sendWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine(">>>>recvWorker_RunWorkerCompleted");

try
{
if(! recvWorker.IsBusy) recvWorker.RunWorkerAsync();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

[Redis] BLPOP

Blocking 된 상태에서 list를 pop 하는 것을 말한다. LPOP의 blocking 버전이라고 할 수 있다.
BLPOP가 호출이 되면, list의 헤더에 있는 key 값이 호출된다.

redis> BLPOP list1 list2 list3 0

list1, list2, list3에 존재하는 키 값중 가장 먼저 쓰여진 list1에 저장된 키 값 하나를 pop 한다.
list1에 값이 없다면 list2의 값을 pop 한다.
만약 list1, list2, list3 모두 값이 없다면 redis는 다른 client에서 해당 list에 값을 입력하기 전까지는 block 된다.
(맨 마지막 0은 timeout 파라미터로써 0일 경우엔 INFINITE, 그 외엔 초단위의 타임 아웃 값을 가짐)

redis> RPUSH list1 a b c d e
(integer) 5
redis> RPUSH list2 1 2 3 4 5
(integer) 5
redis> BLPOP list1 list2 0
1)"list1"
2)a
redis> BLPOP list2 0
1)"list2"
2)1

C#)

DataEncoding ____dataEncode = new DataEncoding();
try
{
byte[][] jsonByte = null; jsonByte=____receiveRedis.BLPop("KEYNAME",10);
for(ii=1; ii<jsonByte.Length; ii++)
{
byte[] jsonEachByte = new byte[jsonByte[ii].Length];
Console.WriteLine(____dataEncode.EncodingByteToStr(jsonEachByte));
}
}

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;
using System.Runtime.InteropServices;


class Program
{
public static void Main(string[] args)
{
ContinueNoLoginCls nm = new ContinueNoLoginCls();
nm.running();
}
}

class ContinueNoLoginCls
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

[DllImport("User32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll")]
public static extern IntPtr FindWindowEx(int hWnd1, int hWnd2, string lpClassName, string lpWindowName);

const uint WM_KEYDOWN = 0x0100;
const uint WM_KEYUP = 0x0101;
const uint WM_CHAR = 0x0102;
const int VK_TAB = 0x09;
const int VK_ENTER = 0x0D;
const int VK_UP = 0x26;
const int VK_DOWN = 0x28;
const int VK_RIGHT = 0x27;
const int VK_F5 = 0x74;
const int VK_F6 = 0x75;
 
//According to SPY++ in IE

//ENTER key is
// P KEYDOWN
// P CHAR
// S CHAR
// P KEY_UP

//TAB key is
// P KEYDOWN
// P KEYUP

//DOWN, UP, RIGHT, LEFT is
// P KEYDOWN
// S KEYDOWN
// P KEYUP

//Letters is
// P KEYDOWN
// S KEYDOWN
// P CHAR
// S CHAR
// P KEYUP

IntPtr tailHandle = IntPtr.Zero;
IntPtr Handle_1 = IntPtr.Zero;
IntPtr Handle_2 = IntPtr.Zero;
//const string captionmsg="파일 탐색기";
//const string captionmsg="명령 프롬프트";
const string captionmsg="네이버 부동산 - Microsoft Edge";

public void running()
{
Console.Title = "";
tailHandle = FindWindow(null, captionmsg);

ConsoleKeyInfo keyinfo;

while(true)
{
keyinfo=Console.ReadKey(true);

debug(">>>>KEY:[" + keyinfo.Key.ToString() + "]");

if(keyinfo.Key==ConsoleKey.Enter)
{
debug(">>>>SendTab() method call!!");
SendTab();
}
else if(keyinfo.Key==ConsoleKey.RightArrow)
{
debug(">>>>SendArrowKey() method call!!");
SendChar(VK_F5);
}
else if(keyinfo.Key==ConsoleKey.Spacebar)
{
debug(">>>>SendArrowKey() method call!!");
SendArrowKey(VK_F5);
}

else if(keyinfo.Key==ConsoleKey.Escape)
{
debug(">>>>Quit() method call!!");
break;
}
}
}

void debug(string str)
{
Console.WriteLine(str);
}

    private void SendEnter()
    {
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
        PostMessage(tailHandle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
        SendMessage(tailHandle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)VK_ENTER, IntPtr.Zero);
    }

    private void SendTab()
    {
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)VK_TAB, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)VK_TAB, IntPtr.Zero);
    }

    private void SendArrowKey(int key)
    {
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
        SendMessage(tailHandle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)key, IntPtr.Zero);
    }

    private void SendChar(int key)
    {
        //Keydown wParam values are 0x020 less than WM_CHAR wParam
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
        SendMessage(tailHandle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
        PostMessage(tailHandle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
        SendMessage(tailHandle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)(key - 0x020), IntPtr.Zero);
    }
}



Assembly.LoadFrom() : DLL 활용하여, Form을 띄우기
/*----------------------------------------------------------------------
Description : 클래스라이브러리로 생성되어진 폼을 띄울때에 사용되어진다.(폼형태만 가지고 인는것을 폼처럼 만들어서 띄울수있다.)
ex) 
1. frm's name : UAPDBMQ0010
2. dll's name : DBM.DLL
----------------------------------------------------------------------*/

sample code>>

string formName = "UAPDBMQ0010";
string dllName = formName.Substring(3,3); //DBM.DLL
string assembly = dllName + ".DLL";
string classname = dllName + "." + formName;

Assembly asm = Assembly.LoadFrom(assembly);
object o = asm.CreateInstance(classname);
var doc = (Form)o;

Form frm = doc;
frm.Tag = assembly;
if(frm == null) return null;

frm.MdiParent = this; //MDI CASE
frm.FormBorderStyle = FormBorderStyle.None; //NEW FORM
frm.Dock = DockStyle.Fill //POPUP, WHEN DELETE

frm.Text="";
frm.TopLevel=false;
frm.Parent=this;
frm.Show();

>>>>> .bashrc 와 .bash_profile 의 차이

1) bash 쉘(Shell) 이란?
쉘(Shell)은 운영체제에서 **사용자가 입력하는 명령을 읽고 해석하여 대신 실행해주는 프로그램**입니다. 
운영체제 상에서 다양한 운영체제 기능과 서비스를 구현하는 인터페이스를 제공하며, 사용자와 운영체제의 내부(커널)` 사이의 인터페이스를 감싸는 층이기 때문에 셸이라는 이름이 붙었습니다. 
쉘은 운영체제에서 필수적으로 존재합니다.

운영체제는 로그인한 사용자가 없다면 하나의 쉘도 실행되지 않은 상태이며, 
사용자가 로그인을 시도하면 운영체제는 ID와 패스워드를 받아들이는 로기은 프로그램을 실행하고, 
사용자가 입력한 ID와 패스워드를 검증한 후 인증된 사용자라면 쉘을 실행하여 사용자 세션을 쉘에게 전달합니다.

쉘의 역할은 사용자가 입력한 명령을 해석하여 대신 실행해주는 것입니다. 
쉘의 내부 명령어라면 스스로 실행한 뒤 화면에 표시해주고 내부 명령어가 아니라면 PATH 환경변수에 
지정된 경로에서 입력받은 명령과 같은 파일을 찾아 exec() 시스템콜을 호출하여 실행한 뒤 
키보드와 마우스 등의 입력장치와 모니터에 해당하는 표준 출력장치의 제어권을 해당 프로그램에 넘겨준 뒤 프로그램이 끝날 때 까지 대기하는 역할을 합니다.

bash 쉘은 유닉스에서 사용하는 커맨드 쉘의 일종으로 GNU 프로젝트를 위해 만들어졌습니다. 
초기의 유닉스 쉘인 본 쉘(Bourne Shell)과 새로 태어났다는 뜻의 영어 ‘born again’을 합쳐 **본 어게인 쉘(Bourne-again Shell)**이라고 불렸으나, 
일반적으로 bash로 줄여 부릅니다.

2) Login Shell 과 Non-Login Shell

Login Shell
Login은 ID와 패스워드를 입력해서 Shell을 실행하는 것을 말합니다. 따라서 ssh로 접속하거나 로컬에서 GUI를 통해 Shell을 실행하는 것은 Login Shell 입니다.
.profile, .bash_profile 이 두 파일은 Login할 때 로드되는 파일입니다. .profile은 꼭 bash가 아니더라도 로그인하면 로드되며, .bash_profile은 꼭 bash로 로그인 할 때만 실행됩니다.

Non-Login Shell
Non-Login Shell은 로그인 없이 실행하는 Shell을 말합니다. ssh로 접속하고 나서 다시 bash를 실행하는 경우나, GUI 세션에서 터미널을 띄우는 것도 여기 해당합니다. ‘sudo bash’나 ‘su’같은 것도 해당합니다.

.bashrc 와 .bash_profile 의 차이
.bashrc
이미 로그인 한 상태에서 새 터미널 창을 열 때마다 로드됩니다. (Non-Login Shell에서 실행됩니다.)

.bash_profile
시스템에 로그인할 때마다 로드됩니다. (Login Shell에서 실행됩니다.) 대부분 개별 사용자에 대한 설정에 대한 코드들이 들어갑니다. 예를 들면 nvm(Node Version Manager)은 기본적으로 nvm을 사용하지 않고 Node를 설치할 때와는 다르게 각 사용자의 경로에 설치되게 되는데, 이럴때 nvm의 PATH를 .bash_profile 파일에 기재합니다.

.profile
로그인할 때 로드됩니다. 개별 사용자에 대한 설정 코드들 중 bash와는 관계없는 부분을 기재합니다.

만약 Mac에서 새 터미널 창을 열 때마다 .bashrc를 로드하고 싶다면 .bash_profile에서 .bashrc를 로드하면 됩니다.

# Source bashrc
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

[C#] PDB(*.pdb) 파일(?)

PDB 파일이란 무엇이며 솔루션을 다시 빌드 할 때 릴리스 폴더에서 PDB 파일을 어떻게 제외시킬 수 있습니까?

PDB 파일에는 디버거가 작업 할 정보가 들어 있습니다. 
릴리스 빌드에는 디버그 빌드보다 정보가 적습니다. 
그러나 전혀 생성하지 않으려면 프로젝트의 빌드 속성으로 이동하여 릴리스 구성을 선택하고 “고급 …”을 클릭 한 다음 
"디버그 정보"에서 "없음"을 선택하십시오.

오늘까지는 Exception.StackTrace예외를 해결하는 데 필요한 파일 및 줄 번호 정보가없는 메시지 상자에 왜 누락 되었는지 알아 내려고 시도 할 때까지 모든 것이 제대로 작동했습니다 . 
이 게시물을 다시 읽고 중요한 정보를 발견했습니다 
.PDB는 앱을 실행하는 데 필요하지 않지만 파일과 줄 번호가 StackTrace문자열 에 있어야 합니다. 
PDB 파일을 실행 가능 폴더에 포함 시켰으며 이제는 모두 정상입니다.

PDB 는 P rogram D ata B ase 의 약자입니다. 
이름에서 알 수 있듯이 프로그램을 디버그 모드로 실행하는 데 필요한 정보를 유지 관리하는 저장소 (데이터베이스와 같은 영구 저장소)입니다. 
여기에는 코드를 디버깅하는 동안 (Visual Studio에서) 디버거가 Visual Studio에서 중단 될 것으로 예상되는 지점을 삽입 한 지점과 같은 중요한 관련 정보가 많이 포함되어 있습니다.

*.pdb디버그 폴더에서 파일 을 제거하면 Visual Studio가 중단 점에 여러 번 실패하는 이유 입니다. Visual Studio 디버거는 파일을 사용하여 스택 추적에서 예외가 발생한 정확한 줄 번호의 코드 파일을 알려줄 수도 *.pdb있습니다. 따라서 효과적으로 pdb 파일은 프로그램을 디버깅하는 동안 개발자에게 큰 도움이됩니다.

일반적으로 *.pdb파일 생성을 제외하지 않는 것이 좋습니다 . 
프로덕션 릴리스 관점에서해야 할 일은 pdb 파일을 작성하지만 제품 설치 프로그램의 고객 사이트에는 제공하지 않는 것입니다. 
생성 된 모든 PDB 파일을 필요한 경우 나중에 사용 / 참조 할 수있는 기호 서버에 보존하십시오. 
특히 프로세스 충돌과 같은 문제를 디버깅하는 경우에 적합합니다. 
크래시 덤프 파일 분석을 시작하고 *.pdb빌드 프로세스 중에 만들어진 원본 파일이 유지되지 않으면 Visual Studio에서 크래시를 일으키는 정확한 코드 줄을 만들 수 없습니다 .

PDB 파일은 디버거에 의해 사용되는 정보가 포함되어 있습니다. 
응용 프로그램을 실행할 필요가 없으며 릴리스 된 버전에 포함시킬 필요가 없습니다.

Visual Studio에서 pdb 파일이 생성되지 않도록 설정할 수 있습니다. 
명령 행 또는 스크립트에서 빌드하는 경우 /Debug스위치 를 생략하십시오.


C#프로젝트를 빌드하면, exe 혹은 dll파일과 함께 pdb파일도 함께 나오는 것을 종종 확인하셨을 것입니다.
pdb파일은 프로그램을 디버깅할 때 필요한 파일입니다.
pdb파일 속에는 디버깅에 필요한 정보들이 포함되어 있습니다.
이 말을 뒤집으면 프로그램을 배포할 때에는 pdb파일이 있어선 안 되겠죠.
그래서 혹시 배포 패키지에 pdb파일이 섞여 들어가는 것을 막기 위해 빌드 옵션을 설정할 수가 있습니다.
그럼 지금부터 pdb파일을 나오게 하는 법, 안 나오게 하는법에 대해 알아보도록 하겠습니다.

>>>>PDB파일 안나오게 하는 법

1. 프로젝트 우클릭 2. Properties 클릭 3. 좌측의 Build 클릭 4. Advanced 클릭 5. Debugging information을 Pdb-only로 설정

 

+ Recent posts