#WndProc & Message(WM_MOVE) 예제




        // 윈도우 메시지 처리 함수
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            // 메시지 콘솔 출력
            Console.WriteLine(m.Msg);
            Console.WriteLine("----------------------0x"+Convert.ToString(m.Msg, 16));
            switch(m.Msg)
            {
                case WM_MOVE : 
                    Console.WriteLine("WM_MOVE Message Occured!!");
                    break;
            }
        }

 

message_sh.cs
0.03MB

using System;
using System.Net;
using System.IO;

namespace NetKingdom
{
    class Program    
    {
        static WebRequest request;
        static WebResponse response;
        static Stream dataStream;
        static StreamReader reader;

        static void Main(string[] args)
        {
            request = WebRequest.Create("https://news.naver.com");//URL ADDRESS
            request.Method = "GET";
                
            response = request.GetResponse();
            dataStream = response.GetResponseStream();
            reader = new StreamReader(dataStream);
 
            string responseFromServer = reader.ReadToEnd();
 
            Console.WriteLine(responseFromServer); // response 출력
 
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    }
}

#메시지 처리 함수 (WndProc)
메시지 처리 함수(WndProc) 란 WinMain에 메시지 루프에서 전달된 메시지를 처리해주는 함수입니다. 
이 WndProc 함수는 WinMain에서 호출하는것이 아닌 운영체제에서 호출합니다. 
이렇게 운영체제에서 호출하는 함수를 콜백 함수라고 합니다.
WinMain 내에 메시지 루프는 메시지를 전달하는 역활만 하고 
메시지 처리는 모두 이 WndProc 함수에서 처리가 됩니다.

DOS에서는 main 함수만 있으면 프로그램을 작성할 수 있지만
WINAPI에서는 특별한 경우를 제외하고는 메인 함수와 메시지 처리 함수 이 두 함수가 있어야 한다.

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    switch(m.Msg)
    {
        case APMApiPublic.UWM_CHANGE_HANDLE:,,,,,,,
        case APMApiPublic.WM_COPYDATA:,,,,,,
    }
}

이렇게 전달된 메시지를 프록시함수는 스위치 문으로 처리합니다.
WM_PAINT , WM_KEYDOWN 등등 전달된 메시지의 종류에 따라 다르게 처리를 합니다.
프로그램 종료 버튼을 누르면 WM_DESTROY 메시지가 실행이 되고
PostQuitMessage(0) 함수가 호출되는데 이 함수는 WM_QUIT 메시지를 생성시켜
프로그램을 종료하게됩니다.

스위치 문을 통과한 뒤 DefWindowProc() 함수를 리턴하게 되는데
이 함수는 메뉴 최소화, 최대화 ,윈도우 이동, 등을 프로그래머가 집적 손대지 않아도
운영체제가 알아서 처리해주는 함수입니다.

비고) Window c를 이용하는 프로그램에서 자주 다루어 졌던 내용입니다.

#region을 사용하면 #endregion으로 지시문을 종료해야 합니다. Visual Studio에서 #region에서 바로 다음으로 나오는 #endregion까지의 코드를 확대, 축소하며 작업을 할 수 있습니다. 

 

아래의 그림 1이 위 설명을 코드로 나타낸 것 입니다. 

[그림 1]

 

[그림 2]



비고)
#region을 쓰면 안될 때..
짜임새 있게 짜여지지 못한 코드의 경우 region으로 더 복잡해 질 수 있습니다.

 

 

/*------------------------------------------------------------------------
 double value;

 value = 123;
 Console.WriteLine(value.ToString("00000"));
 Console.WriteLine(String.Format("{0:00000}", value));
 // Displays 00123

 value = 1.2;
 Console.WriteLine(value.ToString("0.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                   "{0:0.00}", value));
 // Displays 1.20

 Console.WriteLine(value.ToString("00.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:00.00}", value));
 // Displays 01.20

 CultureInfo daDK = CultureInfo.CreateSpecificCulture("da-DK");
 Console.WriteLine(value.ToString("00.00", daDK));
 Console.WriteLine(String.Format(daDK, "{0:00.00}", value));
 // Displays 01,20

 value = .56;
 Console.WriteLine(value.ToString("0.0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0.0}", value));
 // Displays 0.6

 value = 1234567890;
 Console.WriteLine(value.ToString("0,0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0}", value));
 // Displays 1,234,567,890

 CultureInfo elGR = CultureInfo.CreateSpecificCulture("el-GR");
 Console.WriteLine(value.ToString("0,0", elGR));
Console.WriteLine(String.Format(elGR, "{0:0,0}", value));
 // Displays 1.234.567.890

 value = 1234567890.123456;
 Console.WriteLine(value.ToString("0,0.0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0.0}", value));
 // Displays 1,234,567,890.1

 value = 1234.567890;
 Console.WriteLine(value.ToString("0,0.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0.00}", value));
 // Displays 1,234.57

------------------------------------------------------------------------*/
usnig System;
usnig System.IO;
usnig System.Timers;
usnig Kingdom;

namespace Kingdom
{
  class Program
  {
    static void Main(string[] args)
    {
      Episode pro=new Episode();
      pro.running();
    }
  }

  class Episode
  {
    DateTime now;
    ConsoleKey key;
    ConsoleKeyInfo keyinfo;
    Timer timer;
    int xpos,ypos;

    public void elapsed_time_func(object sender, ElapsedEventArgs e)
    {
      ypos++;
      Logging("Time");
    }

    public void running()
    {
      timer=new Timer();
      timer.Interval=1000;
      timer.Elapsed += new ElapsedEventHandler(elapsed_time_func);
      timer.Start();

      Logging("Start");

      while(true)
      {
        key=Console.ReadKey(true).Key;
        //keyinfo=Console.ReadKey(true);

        if(key==ConsoleKey.RightArrow) xpos++;
        else if(key==ConsoleKey.LeftArrow) xpos--;
        else if(key==ConsoleKey.DownArrow) ypos--;
        else if(key==ConsoleKey.Escape) break;

        /*if(keyinfo.KeyChar=='+')
        {
          timer.Stop();
          timer.Interval += 10;
          timer.Start();
        }
        else if(keyinfo.Key==ConsoleKey.RightArrow) xpos++*/
        Logging("Key");
      }
      timer.Stop();
      Logging("Stop");
   }

   public void Logging(string msg)
   {
      now=DateTime.Now;
      Console.WriteLine("Debug>>" + "Pos[" + ypos.ToString("0000") + "," + xpos.ToString("0000") + "]   Time:" + now.ToString("yyyy-MM-dd hh:mm:ss") + "    Event:" + msg);
   }
  }
}

/*
 * namespace(c#) & package(java)
 * java에서 package는 c#에서 namespace와 같은 keyword이다.
 * direct make class에서 direct make class를 호출(public,static 주의)
 */

/* ConsoleKeyInfo 클래스를 사용할경우
   ConsoleKeyInfo keyInfo;

   keyInfo=Console.ReadKey(true);

   if(keyInfo.Key==ConsoleKey.RightArrow) xpos++;
   if(keyInfo.KeyChar=='+') timer.Interval += 10;
   if(keyInfo.KeyChar=='-') timer.Interval -= 10;
*/


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

namespace Kingdom
{
  class Program
  {
    static void Main(string[] args)
    {
      episode pro = new episode();
      pro.running();
    }
  }

  class episode
  {
    DateTime now;
    ConsoleKey key;
    Timer timer;
    int xpos,ypos;

    public void running()
    {

      int toggle=0;

      timer=new Timer();
      timer.Interval=1000; /*1 Second*/
      timer.Elapsed += new ElapsedEventHandler(time_elapsed_func);
      timer.Start();

      xpos=ypos=0;

      WriteLog("Start");
      while(true)
      {
        key=Console.ReadKey(true).Key;
        if(key==ConsoleKey.RightArrow) xpos++;
        else if(key==ConsoleKey.LeftArrow) xpos--;
        else if(key==ConsoleKey.UpArrow) ypos++;
        else if(key==ConsoleKey.DownArrow) ypos--;
        else if(key==ConsoleKey.Escape) break;
        else if(key==ConsoleKey.Enter)
        {
          if(toggle==0)
          {
             timer.Stop();
             toggle=100;
             WriteLog("Time stop");
         }
         else
         {
             timer.Start();
             toggle=0;
             WriteLog("Time restart");
         }
       }
       WriteLog("Key");
      }//end of while
      WriteLog("Stop");
      timer.Stop();
    }

    public void time_elapsed_func(object sender, ElapsedEventArgs e)
    {
        ypos++;
        WriteLog("Time");
    }

    public void WriteLog(string msg)
    {
      now=DateTime.Now;
      Console.Write(now.ToString("yyyy-mm-dd hh:mm:ss") + "  Event:" + msg + "----------------");
      Console.WriteLine("Index;["+ypos+","+xpos + "]");
    }
  }
}//end of namespace;

/*
#KeyBoard를 이용한 xpos,ypos 증감 프로그램
- 1초당 ypos가 1씩 증가한다.
- LEFT,RIGHT Key를 이용해서 xpos를 1씩 증감한다.
*/

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

namespace SimpleConsole
{
  class Program
  {
    const int FAIL=-1;
    const int SUCC=1;
    static int xpos,ypos;
    static System.Timers.Timer timer;

    static void Main(string[] args)
    {
      int ii,kk,ff,rc;

      timer=new System.Timers.Timer();
      timer.Interval=1000;
      timer.Elapsed += new ElapsedEventHandler(time_elapsed_func);
      timer.Start();

      ConsoleKey key=ConsoleKey.NoName;
      Init();
      while(true)
      {
        key=Console.ReadKey(true).Key;

        if(key==ConsoleKey.Escape)
        {
          timer.Stop();        
          break;
        }
        else if(key==ConsoleKey.RightArrow) xpos=xpos+1;
        else if(key==ConsoleKey.LeftArrow) xpos=xpos-1;
        else if(key==ConsoleKey.Enter)
        {
          //
        }
        DrawHexa(100);
      }
    }

    static void DrawHexa(int ____event)
    {
      int ii,kk,ff,rc;

      DateTime now=DateTime.Now;

      if(____event==100)
      Console.WriteLine(">>>>NowEvent[Key ]:"+now.ToString("yyyy-MM-dd HH:mm:ss") + "    INDEX:["+ypos+","+xpos+"]");
      else 
      Console.WriteLine(">>>>NowEvent[Time]:"+now.ToString("yyyy-MM-dd HH:mm:ss") + "    INDEX:["+ypos+","+xpos+"]");
    }
    
    static void Init()
    {
      xpos=0;
      ypos=0;
    }

    static int DownPossible()
    {
      ypos=ypos+1;
      //
      return SUCC;
    }

    static void time_elapsed_func(object sender, ElapsedEventArgs e)
    {
      int ii,kk,ff,rc;

      DrawHexa(200);

      rc=DownPossible();
      if(rc==FAIL)
      {
        if(ypos==0) timer.Stop();
        else
        {
          //INIT
        }
      }
    }
  } //End OF Program Class
} //End Of NameSpace

 

키를 입력하지 않으면, 1초마다 ypos가 1씩 증가하는 구조임.
키를 입력하면, 이벤트가 발생되어서, 그때 로직을 추가해서 사용할수 있음. 위의 예제는 LEFT,RIGHT시에 xpos증감.
헥사게임을 만들게 되면, 일정 시간후에 ypos가 1씩 증가하는 구조를 가지는 시스템에 적당한 프레임예제임.

 

s_frame.cs
0.00MB

 

#Tettris by c# console program(4*4 배열의 모양)

테트리스모양이 4*4의 모습이다.

전버젼인 3*3에서 4*4로 숫자만 바뀐거뿐, 특별히 달라진건 없다.

확장성는 3->4로 바꾸는것일뿐^

        static int[, ,] design = new int[, ,]
        {
            {{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
            {{0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0}},
            {{0,0,0,0},{0,1,0,0},{1,1,1,0},{0,0,0,0}},
            {{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
            {{0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}},
            {{0,0,0,0},{0,1,0,0},{0,1,1,1},{0,0,0,0}},
            {{0,0,0,0},{0,1,1,1},{0,1,0,0},{0,0,0,0}}
        };

 

c_t_tris_4_4.cs
0.01MB

+ Recent posts