출처 : Fehu, Gebo (http://blog.naver.com/PostView.nhn?blogId=kst7132&logNo=140165075952)


메시지 박스는 사용자에게 짧은 문자열 메시지를 출력하는 조그만 대화상자로서 안내문이나 에러, 간단한 질문 등을 할 수 있다. 메서드 호출문 하나로 사용자에게 정보를 출력할 수 있는 가장 간단한 장치이다. 또한 실행중에 변수나 프로그램의 현재 상태를 확인하고 제어의 흐름을 잠시 차단할 수 있어 디버깅용으로도 흔히 애용된다.

메시지 박스는 MessageBox 클래스로 표현한다. 이 클래스는 생성자가 없기 때문에 객체를 생성할 수 없고 프로퍼티나 이벤트도 가지지 않으며 오로지 Show 정적 메서드 하나만 가진다. 아주 간단한 클래스라고 할 수 있는데 대신 Show 메서드가 무려 21개나 오버로딩되어 있다. 이중 다음 형태가 가장 자주 사용된다.

 

public static DialogResult Show (string text [,string caption,MessageBoxButtons buttons])

 

첫 번째 인수 text는 메시지 박스의 중앙에 표시할 메시지 문자열이며 두 번째 인수 caption은 메시지 박스의 타이틀 바에 출력할 캡션 문자열이다. 세 번째 인수는 메시지 박스에 나타날 버튼의 종류를 지정하는데 생략시 확인 버튼만 나타난다. 첫 번째 인수는 반드시 전달해야 하며 나머지 인수는 필요없을 경우 생략할 수 있다. 다음이 호출 예이다.

 

MessageBox.Show("사용자에게 전달할 메시지입니다.");

MessageBox.Show("사용자에게 전달할 메시지입니다.", "알립니다");

 

메시지 내용은 동일하며 caption 인수 지정 여부만 다르다. 두 실행문에 의해 다음과 같은 메시지 박스가 각각 출력된다.

<v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f><o:lock v:ext="edit" aspectratio="t"></o:lock> 

메시지 문자열만 지정하면 타이틀 바에 아무 것도 출력되지 않지만 두 번째 인수에 캡션을 출력하면 타이틀 바에 이 문자열이 나타난다. 메시지 박스의 타이틀 바를 썰렁하게 비워두는 것보다는 보통 "에러", "경고", "알림" 등 메시지의 의미에 대한 짧은 문자열이나 또는 메시지를 출력하는 응용 프로그램의 이름을 쓰는 것이 좋다.

이런 메시지 박스는 확인 버튼만 나타나기 때문에 사용자에게 정보를 제공할 수만 있으며 질문을 할 수는 없다. 사용자는 단지 메시지 내용을 읽고 확인 버튼을 누르기만 할 수 있다. Show 메서드의 세 번째 인수 buttons를 지정하면 메시지 박스에 어떤 버튼들이 나타날 것인가를 지정할 수 있다. 버튼의 종류는 MessageBoxButtons 열거형으로 지정하며 다음과 같은 멤버들이 정의되어 있다.

 

열거 멤버

설명

OK

확인 버튼만 나타난다.

OKCancel

확인취소 버튼이 나타난다.

YesNo

아니오 버튼이 나타난다.

YesNoCancel

아니오취소 버튼이 나타난다.

RetryCancel

재시도취소 버튼이 나타난다.

AbortRetryIgnore

중단재시도무시 버튼이 나타난다.

 

이 인수에 따라 메시지 박스에 나타나는 버튼의 묶음이 달라지는데 질문의 종류에 맞게 버튼을 배치하면 된다. 예를 들어 질문을 통해 긍정 또는 부정의 응답을 받고 싶다면 YesNo 버튼을 배치하면 되고 여기에 취소 응답도 가능하다면 YesNoCancel 버튼을 배치하면 된다. Show 메서드는 사용자가 어떤 버튼을 눌렀는가를 나타내는 DialogResult 열거형 값중 하나를 리턴한다.

 

열거 멤버

설명

OK

확인 버튼을 눌렀다.

Cancel

취소 버튼을 눌렀다.

Yes

 버튼을 눌렀다.

No

아니오 버튼을 눌렀다.

Abort

중지 버튼을 눌렀다.

Ignore

무시 버튼을 눌렀다.

Retry

재시도 버튼을 눌렀다.

Nothing

아무 버튼도 누르지 않았다대화상자가 계속 실행중이다.

 

이 리턴값을 조사해 보면 사용자가 질문에 어떻게 응답했는지를 알 수 있다. 메시지 박스로 질문을 했다면 리턴값을 점검해야 하므로 Show 메서드는 보통 if문과 함께 사용된다. 다음 코드는 사용자에게 질문 후 그 응답 결과에 따라 처리를 달리한다.

 


  // using System.Windows.Forms;


       if (MessageBox.Show("안녕하세요?", "질문", MessageBoxButtons.YesNo)  == DialogResult.Yes)

            {

                // 네

            }

            else

            {

                // 아니요

            }

 

이 코드에 의해 다음과 같은 메시지 박스가 출력된다.

메시지 문자열이 중앙에 출력되어 있고 캡션에는 메시지의 의미를 짧게 설명하는 "질문"(사실 협박이라고 써도 될 것 같다) 문자열이 출력되어 있다. 그리고 메시지의 아래쪽에는 예, 아니오 두 개의 버튼을 배치하여 사용자가 두 버튼 중 하나를 눌러 질문에 답할 수 있도록 한다. Show 메서드 호출 결과 사용자가 누른 버튼이 Yes일 때와 그렇지 않을 때 응답에 따라 다르게 처리할 수 있다.

이 정도면 사용자에게 정보를 전달할 수 있고 질문도 할 수 있으므로 일반적인 용도로 메시지 박스를 활용하는 데는 충분하다. 좀 더 다양한 형태의 메시지 박스를 쓰고 싶다면 훨씬 더 복잡한 형태의 Show 메서드를 사용해야 한다. 가장 인수가 많고 완벽한 Show 메서드를 보자.

 

public static DialogResult Show (

     IWin32Window owner,

     string text,

     string caption,

     MessageBoxButtons buttons,

     MessageBoxIcon icon,

     MessageBoxDefaultButton defaultButton,

     MessageBoxOptions options,

     string helpFilePath,

     HelpNavigator navigator,

     Object param

)

 

무려 10개의 인수를 취하는데 부모 윈도우를 지정할 수 있고 메시지 박스에 아이콘을 표시할 수도 있다. 특정 버튼을 디폴트 버튼으로 지정하여 Enter키만 누르면 이 버튼을 누른 것처럼 만들 수도 있고 도움말 파일의 경로를 지정하여 사용자가 메시지 자체에 대해 도움말을 요청할 때 이 파일을 열도록 할 수도 있다. C#에 디폴트 인수 기능이 없기 때문에 Show 메서드가 과다하게 오버로딩되어 있는 편이다.

신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

출처 : 쇼크리더님 http://ramses8.tistory.com/

         베베님 : http://blog.stevex.net/string-formatting-in-csharp/

         월화수목금금금 : http://dps-r.tistory.com/36



1. 원하는 길이로 좌측/우측 정렬시킨후 나머지 공간을 다른 문자로 채우기 (기본은 공백)


String.PadLeft(길이, [문자]);         String.PadRight(길이, [문자]);

예) string str1 = "asdf";

     string str2 = str1.PadLeft(10);    -->  str2 = "      asdf"

     string str3 = str1.PadRight(6, '-');  -->  str3 = "asdf--"


str2 웹에서 보면 빈칸이 안나오기에 그냥 asdf로 나오지만 Length 해보면 10값 나옴



2. 


 예시 결과 

 String.Format("->{0,10}<-", "Hello"); ->   Hello<-

 String.Format("->{0,-10}<-", "Hello"); ->Hello    <-




3. 


String.Format("{0:$#,##0.00; ($#,##0.00); Zero}", value);


이것은 만약 1243.50을 전달하면, "$1,240.00"을 반환할 것입니다. 만약 -값이 전달된다면, 괄호안에 같은 형태의 결과값이 반활될 것입니다.("($1,240.00)") 만약 0이 전달된다면 "Zero"가 반환될 것입니다.


String.Format({0:(###) ###-####}", 8005551212);


이것은 "(800) 555-1212"를 반환할 것입니다.




4.      Console.WriteLine("number 1 : {0:000##}", number1);             // number1 : 00001

            Console.WriteLine("number 2 : {0:0000#}", number2);             // number2 : 00123

            Console.WriteLine("number 3 : {0}", number3.ToString("00000")); // number3 : 01234




5. 소숫점 몇 자리


double aOverB = 1.234567;


Console.WriteLine("{0:F4}",aOverB);


신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요


OpenCV는 오픈소스 영상처리 라이브러리입니다.

현업에서 사용하는 다양한 유료 라이브러리에 비해 기능이나 정확성, 처리속도 면에서 아쉬운 점이 없지는 않겠지만,

코드가 공개되어 언제든지 편리하게 사용할 수 있게 해 준다는 건 개발자에게 매우 고마운 일인 것 같습니다

(얼굴을 좀 못잡긴 하죠? ㅋㅋ)

 


학부때 소개했다가 파장을 불러일으켰던 (교수님의 눈빛을 흔들리게 했던) 그 라이브러리!!

그중에서도 얼굴 검출 Haar알고리즘을 사용하기 쉽도록 소스만 올립니다(Dll링크 등의 환경설정이 필요없음. 이미지 경로만 수정해 주세요)


OpenCV예제.zip

 

OpenCV를 이용한 영상 처리를 해보시고 싶으신 분은 오픈CV Sharp 홈페이지를 참조하세요

 

https://code.google.com/p/opencvsharp/

 

 

라이브러리는 버젼이 많으나 환경설정도 어렵고 호환이 안되는 경우가 많은데 아래 버젼(dll)이 저는 잘 되었구요 

 

C#_OpenCv설정파일.alz

 

 

 

자세한 설정과 구현방법은 들로네 (tramper2)님 블로그를 참조하세요. 잘 정리 되어 있습니다.


http://blog.naver.com/tramper2?Redirect=Log&logNo=100070916543

 

 

 

전체 소스는 OpenCV 샘플코드를 조금 수정하였습니다.

 

 

using System;
using System.Windows.Forms;
using OpenCvSharp;

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

    //아래 경로를 수정 해 주세요

            IplImage img = new IplImage("c:\\c.jpg", LoadMode.Color);

            Face fac = new Face();
            IplImage imgHarr = fac.FaceDetect(img);

            pictureBoxIpl2.ImageIpl = imgHarr;

            return;
        }

        class Face : IDisposable
        {
            IplImage FindFace;
            public IplImage FaceDetect(IplImage src)
            {
                // CvHaarClassifierCascade, cvHaarDetectObjects
                // 얼굴을 검출하기 위해서 Haar 분류기의 캐스케이드를 이용한다
                CvColor[] colors = new CvColor[]{
                new CvColor(0,0,255),
                new CvColor(0,128,255),
                new CvColor(0,255,255),
                new CvColor(0,255,0),
                new CvColor(255,128,0),
                new CvColor(255,255,0),
                new CvColor(255,0,0),
                new CvColor(255,0,255),
            };
                const double scale = 1.04;
                const double scaleFactor = 1.139;
                const int minNeighbors = 2;
                using (IplImage img = src.Clone())
                using (IplImage smallImg = new IplImage(new CvSize(Cv.Round(img.Width / scale), Cv.Round(img.Height / scale)), BitDepth.U8, 1))
                {
                    // 얼굴 검출용의 화상의 생성
                    using (IplImage gray = new IplImage(img.Size, BitDepth.U8, 1))
                    {
                        Cv.CvtColor(img, gray, ColorConversion.BgrToGray);
                        Cv.Resize(gray, smallImg, Interpolation.Linear);
                        Cv.EqualizeHist(smallImg, smallImg);
                    }
                    using (CvHaarClassifierCascade cascade = CvHaarClassifierCascade.FromFile(Application.StartupPath + "\\" + "haarcascade_frontalface_alt.xml"))

                    using (CvMemStorage storage = new CvMemStorage())
                    {
                        storage.Clear();
                        // 얼굴의 검출
                        CvSeq<CvAvgComp> faces = Cv.HaarDetectObjects(smallImg, cascade, storage, scaleFactor, minNeighbors, 0, new CvSize(30, 30));
                        // 검출한 얼굴에 원을 그린다
                        for (int i = 0; i < faces.Total; i++)
                        {
                            CvRect r = faces[i].Value.Rect;
                            CvPoint center = new CvPoint
                            {
                                X = Cv.Round((r.X + r.Width * 0.5) * scale),
                                Y = Cv.Round((r.Y + r.Height * 0.5) * scale)
                            };
                            int radius = Cv.Round((r.Width + r.Height) * 0.5 * scale);
                            img.Circle(center, radius, colors[i % 8], 15, LineType.AntiAlias, 0);
                        }
                    }
                    FindFace = img.Clone();
                    return FindFace;
                }
            }

            public void Dispose()
            {
                if (FindFace != null) FindFace.Dispose();
            }
        }
    }
}

신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요


폼 닫을때 세이브 메소드를 넣고 싶어서



출처: http://bytes.com/forum/thread256124.html


Alt+F4 버튼으로 폼을 닫아버리면 안 되도록 설정해야 하는 경우가 종종 있습니다.

최근에 프로그래밍을 하다보니 멀티쓰레딩으로 작업하다가 Alt+F4버튼을 눌러서 닫아버리면 오류가 나더군요..

왜 오류가 날까? 라는 생각보다 Alt+F4 버튼을 막아야 겠군! 이라는 생각이 먼저 들더군요 ㅡㅡ;

그래서 여러 가지 생각을 해 봤는데요..

1. 예전에 쓴 방법 중 하나는 다른 폼으로 무조건 포커스를 옮기는 것이었습니다.

그 때는 하나의 폼에만 포커스가 있으면 되는 경우였으니까 가능했지만. 포커스를 유지하면서 Alt+F4를 막으려면 다른 방법을 써야 했죠~

많은 분들이 사용하는 방법 중 하나는..

2. OnClosing() 메써드를 오버라이드 해서 닫히는 이벤트를 Cancel 시키는 방법입니다.

이 방법의 단점은 Close() 메써드로 창을 닫으려고 해도 안 닫힌다는 것입니다.

즉 창을 닫을 수가 없다는 것??? ㅡㅡ;;

정말 닫을 수 없는지 고민해 보지는 않아서 확신은 못 하지만.. 일단 Close()로는 안 닫히는 것 같더군요

3. 그래서 KeyDown 이벤트를 사용하는 방법을 추천합니다!

우선은 KeyPreview 속성을 true로 설정해 주시고

KeyDown 이벤트 안에.. Alt+F4 가 눌릴 때 e.Handled = true;로 설정해 주기만 하면 됩니다.

e.Handled = true; 의 기능은... 이미 키가 눌린 이벤트가 다 처리되었으니 신경쓰지 말아라~ 라는 뜻입니다.

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Alt && e.KeyCode == Keys.F4)
                e.Handled = true;
        }

 이렇게 적어주면 되겠죠? ㅎ



신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

좋네요 냠냠..


[출처] textbox 에서 ctrl + a 했을때 전체선택|작성자 inno



c#에서 textbox 에서 ctrl + a 했을때 전체선택되게 하는 소스이다.

 

textbox1.selectall();

 

같은것도 있지만...

 

키이벤트도 처리해줘야하고 번거로움이 있다..

 

그래서 그걸 해결하는게.. 아래의 소스!!

 

소스코드에 아래의 소스만 추가하면 된다.

 

수정 같은거 안해도 된다... 그냥 추가만 하자!

 

protected override bool ProcessDialogKey(Keys keyData)
  {
   switch (keyData)
   {
    case Keys.A | Keys.Control:
     if (this.ActiveControl is TextBox)
     {
      TextBox txt = (TextBox)this.ActiveControl;
      txt.SelectionStart = 0;
      txt.SelectionLength = txt.Text.Length;
      return true;
     }
     break;
   }
   return base.ProcessDialogKey(keyData);
  }


신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요


CDragFileOut.zip



국 끓일 때 다싯물 먼저 내는 밑작업 마냥, 코딩에서 프로토 타입으로 만들어지는 프로그램은 텍스트 파일(혹은 엑셀, MP3, 동영상 등)을 읽는 기능 부터 구현하게 되는 경우가 왕왕 생기지요. 오늘 포스팅에서는 [텍스트 파일을 드래그로 폼에 넣어, 내용을 콘솔에 출력하는 프로그램]을 만들어 보려고 합니다 

(음악 파일을 읽어 재생하는 기능 응용 예 :  http://topnanis.tistory.com/167 )






1. 솔루션탐색기 -> 응용프로그램 속성은 "콘솔 응용프로그램" 으로 바꾸어 Console.write("Hello, world");를 콘솔화면에서 확인 할 수 있도록 해주세요




2. 폼 속성 -> 이벤트추가 -> DragEnter와 DragDrop 두개 항목을 자동 추가 해서 코드를 넣어 주세요



3. 폼 속성 -> Allow Drop 는 True 로 변경




메소드는 마우스 드래그를 시작할 때(DragEnter), 드래그를 놓을 때(DragDrop), 처리(Parser) 세개 만으로 구성됩니다.

이 코드에는 폼과 콘솔을 스레드로 나누어 돌려주며, 텍스트 라인을 20줄씩 보여주게 됩니다.


using System;

using System.Windows.Forms;

using System.IO;

using System.Threading;


namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {      

        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_DragDrop(object sender, DragEventArgs e)

        {

            if (e.Data.GetDataPresent(DataFormats.FileDrop))

            {    

                string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);


                foreach (string str in file)

                {

                    Console.WriteLine(str);


                    Thread thread = new Thread(() => Parser(str));


                    thread.Start();

                }

            }

        }


        private void Form1_DragEnter(object sender, DragEventArgs e)

        {

            if (e.Data.GetDataPresent(DataFormats.FileDrop))

            {

                e.Effect = DragDropEffects.Copy | DragDropEffects.Scroll;

            }

        }


        public void Parser(string path)

        {

            string strSaveFilePath = path;

        

            StreamReader SRead = new StreamReader(strSaveFilePath, System.Text.Encoding.Default /* .UTF8*/);


            string strFileLine = string.Empty;


            int page = 0;


            while ((strFileLine = SRead.ReadLine()) != null)

            {

                Console.WriteLine(strFileLine);


                //20줄씩 끊어서 보여줌

                if (page > 20)

                {

                    Console.ReadLine();

                    page = 0;

                }

                else page++;

            }

        }

    }

}


신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

출처 : Kwang's : http://xmlangel2.blogspot.kr/


Invoke 를 써서 델리게이트를 간단히 하는 방법이 있다고 한다.


1곳에서만 메인쓰레드의 권한이 필요할경우, 이 방법을 쓰면 좋다고 한다.


만약 그렇지 않다면, 쓰는데마다 저렇게 선언을 해줘야한다고 한다.


 참고 해보길 바란다.


 

출처 윈폼기반 프로그래밍을 할때 Invoke() 이쁘게쓰기!

이 포스트를 보고있는 여러분들은, 모두 닷넷 프로그래밍에 관심이 있으시고,


현재도 개발툴로 사용중인 분이실 것이다. 쓰레드기반 프로그래밍을 할때(.Net)에서


폼(엄밀히 말하면 윈도우)의 Child컨트롤(요곳도 윈도우)들의 멤버변수들을 조작


하기 위해서는, 메인쓰레드의 권한이 필요하다. 따라서, 메인쓰레드의 권한이 필요


할경우, this.Invoke() 메서드를 쓰게되는데, 이때 이 메서드를 쓰면, 별별놈의


Delegate를 선언해줘야 하고, 또 선언한 델리게이트의 인스턴스를 할당해, 사용


해야해서 코드가 매우 더러워지는것을 느꼈을것이다.


 


예전에 아는 동생녀석의 C#코드를 보고있던 중. this.Invoke()를 아주 이쁘게


잘 써놓은 것을 발견했다. 물론 그놈은.. 예전부터 프로그래밍을 해왔던지라,


모르는 언어도 없고, 시스템 프로그래밍을 가지고 노는애였다.(__)


아무튼 내가 닷넷프로그래밍을 처음배울때, 그놈에게 C#.Net으로된 채팅서버


및 클라이언트 프로그램의 소스를 봐서, Invoke()메서드를 이쁘게 잘쓰는방법을


우연히 터득하게 되었다. 보통의 사람들이라면 Delegate 선언, 인스턴스할당,


Delegate변수명명 까지의 귀찮은 일을 모두 하겠지만, 이 포스트를 봤다면,


이제부터 그렇게 하지말자^^;


 


일단 사용하는 방법은 아주 간단하다. 그냥 this.Invoke()메서드 인자부분에


new MethodInvoker( delegate() { 코드 })를 써주면 끝이다. 이렇게 처리하게


되면, 저런 귀찮은 방법을 사용하지 않고, 그냥 저기안에 코드만 쓰면된다^^;


물론 저렇게 일자로 쓰면, 안이쁘겠지만, 적절히 엔터누질러주시면,


엄청 이쁜코드가 된다. ^^; 동생녀석이 썼던 코드를 보여주겠다.


 


             this.Invoke(new MethodInvoker(

                 delegate()

                 {

                     ///실행할 내용

                     lstLog.Items.Add(new ListViewItem(strData));

                 }

                 )

            );

 


이렇게쓰면, 아주이쁘게 써진다, 또한, Form의 전역공간에 델리게이트를 선언할


필요도 없어져서, 전체적으로 코드가 안정적으로 보인다^^;


저 코드는, 채팅서버에서 로그를 추가하는 델리게이트를 기술하는 것이다^^;


물론 이방법은, 이런 델리게이트가 필요한 곳이 1곳일때만 쓰는것을 추천한다.


만약 그렇지 않다면, 쓰는데마다 저렇게 선언을 해줘야한다.(__)


하지만, 1곳에서만 메인쓰레드의 권한이 필요할경우, 저렇게 하는것이


더 바람직하고, 이쁘다^^;



신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

윈폼(via C#)으로 각종 툴, 어플리케이션을 만들 때 유저키덕후들을 위한 단축키가 필요할 수 있다. 마우스라는 혁신적인 입력 장치가 있더라도 숙련되면 키보드 이상가기 힘드니까 :)
언뜻 생각하기에는 System.Windows.Forms.Form 클래스에서 KeyDown 이벤트를 잡아서 처리를 하면 될 것 같아 해보았지만, 동작하지 않는다 ㅇㅂㅇ;;
Google신(MS는 Bing신...)에 문의 결과 ProcessCmdKey 메소드를 오버라이드 한다면 된다고 한다. 간단히 해보면 다음과 같다.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
        if (!base.ProcessCmdKey(ref msg, keyData)) // 위에서 처리 안했으면
        {
                // 여기에 처리코드를 넣는다.
                if (keyData.Equals(Keys.F1))
                {
                        // 이런 식으로 처리.
                        return true;
                }
                else
                {
                        return false;
                }
        }
        else
        {
                return true;
        }
 return base.ProcessCmdKey(ref msg, keyData);
}


위 코드에서 return false; 의 의미는 내가 처리를 안했으니 혹시나 자식 클래스에서 오버라이드 할꺼면 밑에서 처리해라~ 라는 의미이다. 반대로return true; 는 밑에서 처리하지 말라는 소리다. 마찬가지로  base.ProcessCmdKey가 거짓일 때만 처리하는 것도 부모 클래스에서 키입력에 대해서 처리를 했다면 처리를 하지 않는다는 의미이다.

아무튼, 이리하여 간단히 단축키를 구현할 수 있다.


출처 : http://zeru.kr/blog/539

신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

using System.Drawing;


// 오버라이딩이므로 이벤트를 별도 생성하실 필요 없이 코드에 붙이시면 됩니다

// MouseDown 시의 커서 위치를 저장해서, MouseMove 시에 Form의 Location에 반영하게 됩니다

 

        private Point mCurrentPosition = new Point(0, 0); //

   

       protected override void OnMouseDown(MouseEventArgs e)

        {

            base.OnMouseDown(e);

            if(e.Button == MouseButtons.Left)

                mCurrentPosition = new Point(-e.X, -e.Y);


        }


        protected override void OnMouseMove(MouseEventArgs e)

        {

            base.OnMouseMove(e);

            if (e.Button == MouseButtons.Left)

            {   

                this.Location = new Point(

                    this.Location.X + (mCurrentPosition.X + e.X),

                    this.Location.Y + (mCurrentPosition.Y + e.Y));// 마우스의 이동치를 Form Location에 반영한다.

            }

        }

신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

맨날 쓰는거..



[출처] 작성자 하동하동 : http://blog.naver.com/cookatrice?Redirect=Log&logNo=50042817178


  //파일 읽기

        private void FileRead(params string[] UserInfo)

        {

            FileStream fs = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Read);

            StreamReader st = new StreamReader(fs, System.Text.Encoding.UTF8);

            st.BaseStream.Seek(0, SeekOrigin.Begin);

            while (st.Peek() > -1)

            {

                string temp = st.ReadLine();

                //MessageBox.Show(aaa);

            }

            st.Close();

            fs.Close();

        }

 

        //파일쓰기

        private void FileWrite(string str)

        {

            FileStream fs = new FileStream(FileName, FileMode.Append, FileAccess.Write);

            //FileMode중 append는 이어쓰기. 파일이 없으면 만든다.

            StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);

            sw.WriteLine(str);

            sw.Flush();

            sw.Close();

            fs.Close();

        }



     

신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

티스토리 툴바