/*
    protected override void WndProc(ref Message m)
    {
       base.WndProc(ref m);
       switch(m.Msg)
       {
           case WM_KEYDOWN :
           {
                int ____keyCode=m.WParam.ToInt32();
                if(____keyCode==VK_RIGHT) { // }
           }
        }
     }
     */

    public const int VK_0            = 0x30;
    public const int VK_1            = 0x31;
    public const int VK_2            = 0x32;
    public const int VK_3            = 0x33;
    public const int VK_4            = 0x34;
    public const int VK_5            = 0x35;
    public const int VK_6            = 0x36;
    public const int VK_7            = 0x37;
    public const int VK_8            = 0x38;
    public const int VK_9            = 0x39;
    public const int VK_A            = 0x41;
    public const int VK_B            = 0x42;
    public const int VK_C            = 0x43;
    public const int VK_D            = 0x44;
    public const int VK_E            = 0x45;
    public const int VK_F            = 0x46;
    public const int VK_G            = 0x47;
    public const int VK_H            = 0x48;
    public const int VK_I            = 0x49;
    public const int VK_J            = 0x4A;
    public const int VK_K            = 0x4B;
    public const int VK_L            = 0x4C;
    public const int VK_M            = 0x4D;
    public const int VK_N            = 0x4E;
    public const int VK_O            = 0x4F;
    public const int VK_P            = 0x50;
    public const int VK_Q            = 0x51;
    public const int VK_R            = 0x52;
    public const int VK_S            = 0x53;
    public const int VK_T            = 0x54;
    public const int VK_U            = 0x55;
    public const int VK_V            = 0x56;
    public const int VK_W            = 0x57;
    public const int VK_X            = 0x58;
    public const int VK_Y            = 0x59;
    public const int VK_Z            = 0x5A;
    public const int VK_BACK      =    0x08;
    public const int VK_TAB       =    0x09;
    public const int VK_CLEAR     =    0x0C;
    public const int VK_RETURN    =    0x0D;
    public const int VK_SHIFT     =    0x10;
    public const int VK_CONTROL   =    0x11;
    public const int VK_MENU      =    0x12;
    public const int VK_PAUSE     =    0x13;
    public const int VK_CAPITAL   =    0x14;
    public const int VK_KANA      =    0x15;
    public const int VK_HANGEUL   =    0x15;
    public const int VK_HANGUL    =    0x15;
    public const int VK_JUNJA     =    0x17;
    public const int VK_FINAL     =    0x18;
    public const int VK_HANJA     =    0x19;
    public const int VK_KANJI     =    0x19;
    public const int VK_ESCAPE    =    0x1B;
public const int VK_SPACE     =    0x20;
    public const int VK_CONVERT   =    0x1C;
    public const int VK_NONCONVERT=    0x1D;
    public const int VK_ACCEPT    =    0x1E;
    public const int VK_MODECHANGE=    0x1F;
    public const int VK_PRIOR     =    0x21;
    public const int VK_NEXT      =    0x22;
    public const int VK_END       =    0x23;
    public const int VK_HOME      =    0x24;
    public const int VK_LEFT      =    0x25;
    public const int VK_UP        =    0x26;
    public const int VK_RIGHT     =    0x27;
    public const int VK_DOWN      =    0x28;
    public const int VK_SELECT    =    0x29;
    public const int VK_PRINT     =    0x2A;
    public const int VK_EXECUTE   =    0x2B;
    public const int VK_SNAPSHOT  =    0x2C;
    public const int VK_INSERT    =    0x2D;
    public const int VK_DELETE    =    0x2E;
    public const int VK_HELP      =    0x2F;
    public const int VK_LWIN      =    0x5B;
    public const int VK_RWIN      =    0x5C;
    public const int VK_APPS      =    0x5D;
    public const int VK_SLEEP     =    0x5F;
    public const int VK_NUMPAD0   =    0x60;
    public const int VK_NUMPAD1   =    0x61;
    public const int VK_NUMPAD2   =    0x62;
    public const int VK_NUMPAD3   =    0x63;
    public const int VK_NUMPAD4   =    0x64;
    public const int VK_NUMPAD5   =    0x65;
    public const int VK_NUMPAD6   =    0x66;
    public const int VK_NUMPAD7   =    0x67;
    public const int VK_NUMPAD8   =    0x68;
    public const int VK_NUMPAD9   =    0x69;
    public const int VK_MULTIPLY  =    0x6A;
    public const int VK_ADD       =    0x6B;
    public const int VK_SEPARATOR =    0x6C;
    public const int VK_SUBTRACT  =    0x6D;
    public const int VK_DECIMAL   =    0x6E;
    public const int VK_DIVIDE    =    0x6F;
    public const int VK_F1        =    0x70;
    public const int VK_F2        =    0x71;
    public const int VK_F3        =    0x72;
    public const int VK_F4        =    0x73;
    public const int VK_F5        =    0x74;
    public const int VK_F6        =    0x75;
    public const int VK_F7        =    0x76;
    public const int VK_F8        =    0x77;
    public const int VK_F9        =    0x78;
    public const int VK_F10       =    0x79;
    public const int VK_F11       =    0x7A;
    public const int VK_F12       =    0x7B;
    public const int VK_F13       =    0x7C;
    public const int VK_F14       =    0x7D;
    public const int VK_F15       =    0x7E;
    public const int VK_F16       =    0x7F;
    public const int VK_F17       =    0x80;
    public const int VK_F18       =    0x81;
    public const int VK_F19       =    0x82;
    public const int VK_F20       =    0x83;
    public const int VK_F21       =    0x84;
    public const int VK_F22       =    0x85;
    public const int VK_F23       =    0x86;
    public const int VK_F24       =    0x87;
    public const int VK_NUMLOCK   =    0x90;
    public const int VK_SCROLL    =    0x91;

#In Form Draw & In WndProc Event
#In Form Draw & In WndProc Event
#In Form Draw & In WndProc Event

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace ConsoleForm
{
    public class ____ConsoleDraw : Form
    {
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_PAINT = 0x000F;

        static int toggle=0;
        static int index=0;

        public ____ConsoleDraw()
        {
            //
        }
        protected override void WndProc(ref Message m) //해당 overrride 메소드에서 그래픽관련 핸들을 얻어야 합니다.
        {
            base.WndProc(ref m); 

            index++;
            Console.Write("Window Message Event:" + index.ToString("000000") + "/" + m.Msg + "/");
            Console.WriteLine("0x"+Convert.ToString(m.Msg, 16) + "/");

            switch(m.Msg)
            {
                case WM_PAINT:
                if(toggle==0)
                {
                    this.Size = new Size(800,600);
                    this.Text = "HatchStyle Window Information";
                    toggle=100;
                }
                break;
                case WM_KEYDOWN : 
                    Console.WriteLine("WM_KEYDOWN"); 

                    if (m.Msg == WM_KEYDOWN)
                    {
                        Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

                        switch (keyCode)
                        {
                        case Keys.F1:
                        case Keys.F2:

                        MessageBox.Show("Control.PreProcessMessage: '" +
                          keyCode.ToString() + "' pressed.");
                        break;
                        }

                        if(Keys.F1 == keyCode)
                        {
                            Application.Exit();
                        }
                        if(Keys.F2 == keyCode)
                        {
                            Console.WriteLine("F2 Key Pressed!!");

                            Graphics graphics = CreateGraphics();
                            Pen pen = new Pen(Color.Black);
                            graphics.DrawLine(pen,10,10,50,10);
                            graphics.DrawLine(pen,50,10,50,50);

                            graphics.Dispose(); // Graphics에서 사용하는 리소스를 모두 해제합니다.
                        }
                        if(Keys.F3 == keyCode)
                        {
                            Graphics graphics = CreateGraphics();
                            Font font = new Font("고딕", 12, FontStyle.Bold);

                            //1.
                            for (int h = 0; h <= 52; h++)
                            {
                                HatchStyle hs = (HatchStyle)h;
                                Brush hb = new HatchBrush(hs, Color.White);
                                graphics.FillRectangle(hb, new Rectangle((h/26)*250, (h%26)*20, 50, 20));
                                graphics.DrawString(hs.ToString(), font, Brushes.DarkGreen, (h/26)*250+50, (h%26)*20);
                            }
 
                            //2.
                            Brush brush = new SolidBrush(Color.Green);
                            graphics.FillRectangle(brush, new Rectangle(500, 20, 50, 20));
                            graphics.DrawString("SolidBrush - Green", font, Brushes.Green, 550, 20);
 
                            //3.
                            Brush tb = new TextureBrush(image);
                            graphics.FillRectangle(tb, new Rectangle(500, 40, 50, 20));
                            graphics.DrawString("TextureBrush - myimage", font, Brushes.Green, 550, 40);
                        }
                    }
                    break;
                }
            }

            [STAThread]
            static void Main(string[] args)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new ____ConsoleDraw());
            }
      }//end of class
}//end of namespace 

 

#form hexa created by console(WndProc)
#form hexa created by console(WndProc)

#IDE 필요없음, Windows10 csc로 개발가능(메모장으로 개발)
#IDE 필요없음, Windows10 csc로 개발가능(메모장으로 개발)
#IDE 필요없음, Windows10 csc로 개발가능(메모장으로 개발)


Caution)Semaphor Needed, Duplicate DrawHexa Execution Error!!!!
Caution)Semaphor Needed, Duplicate DrawHexa Execution Error!!!!
Caution)Semaphor Needed, Duplicate DrawHexa Execution Error!!!!

DrawStyle 1)
DrawStyle 2)


#기본 sample(base sample code)

namespace WindowForm
{
public class ____KingDom : Form
{
private const int WM_KEYDOWN = 0x0100;
private const int WM_PAINT = 0x000F;
static int toggle=0;

static System.Timers.Timer timer;

static Graphics graphics;
static Font font;

public ____KingDom()
{
//
}
// 윈도우 메시지 처리 함수
protected override void WndProc(ref Message m)
{
  base.WndProc(ref m);
  // 메시지 콘솔 출력
  Console.Write(m.Msg + "/");
  Console.Write("0x"+Convert.ToString(m.Msg, 16) + "/");

  switch(m.Msg)
  {
    case WM_PAINT:
    if(toggle==0)
    {
      this.Size = new Size(800,800);
      this.Text = "HEXA BY CONSOLE FORM";

      graphics = CreateGraphics();
      font = new Font("바탕체", 17, FontStyle.Bold);

      toggle=100;

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

      MessageBox.Show("HEXA START, Time Interval:" + timer.Interval);

      init(ref hexa, ref xpos, ref ypos, ref __design);
      DrawHexa(hexa);
    }
    break;
    case 0x0100 :
    Console.WriteLine("WM_KEYDOWN");

    if (m.Msg == WM_KEYDOWN)
    {
      int ____keyCode=m.WParam.ToInt32();
      if(____keyCode == VK_RIGHT) //RIGHT
      {
        kk = f_rightkey(ref hexa, ref xpos, ref ypos, ref __design);
      }
      if(____keyCode == VK_LEFT) //LEFT
      {
        kk = f_leftkey(ref hexa, ref xpos, ref ypos, ref __design);
      }
      if(____keyCode == VK_SPACE) //SPACE
      {
        kk = f_spacekey(ref hexa, ref xpos, ref ypos, ref __design);
      }
      }
      break;
      }
    }

    [STAThread]
    static void Main(string[] args)
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new ____KingDom());
    }
  }
}

f13.cs
0.03MB

#SendMessage by User Forced & When F1 KeyDown, Process example
#SendMessage by User Forced & When F1 KeyDown, Process example
#SendMessage by User Forced & When F1 KeyDown, Process example


KEY_DOWN시에, 강제로 Message를 Send 한다.
WM_KEYDOWN시에, F1이 눌리면 F1이 눌렸다고 표시한다.

private const int WM_KEYDOWN        = 0x0100;

protected override void WndProc(ref Message m)
{
  base.WndProc(ref m);

  Console.WriteLine(m.Msg); //10진수로 표시
  Console.WriteLine("0x"+Convert.ToString(m.Msg, 16)); //16진수로 표시

  switch(m.Msg)
  {
    case 0x0203 : 
      Console.WriteLine("WM_LBUTTONDBLCLK      "); 
      Console.WriteLine("QUIT--------------------------------"); 
      Application.Exit(); //강제종료
      break;
    case 0x0100 : 
    Console.WriteLine("WM_KEYDOWN ####           ---------------"); 
    ____KingDom.SendMessage(this.Handle, WM_COPYDATA, 1, 2);

    if (m.Msg == WM_KEYDOWN)
    {
      Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

      if(Keys.F1 == keyCode)
      {
        Console.WriteLine("F1 Key Pressed!!");
      }
    }
    break;
  }
}

 

send_msg.cs
0.03MB

#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으로 더 복잡해 질 수 있습니다.

 

+ Recent posts