C#2011. 2. 19. 22:25
#. MD5란?
 - MD5는 입력 데이터 (길이에 상관없는 하나의 메시지)로부터 128 비트 메시지 축약을 만듦으로써 데이터 무결성을 검증하는데 사용되는 알고리즘입니다. 대게 선택한 파일이나 문자열에 대해 오류가 있는지 없는지 체크할 때 주로 사용 합니다.

#. 사용방법.
 - 아래 사용 방법은 특정파일에 대한 MD5 생성 방법 입니다.

using System.Security.Cryptography;


private string GetMD5OfFile(string filepath)
        {
            StringBuilder strMD5 = new StringBuilder();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            byte[] byteResult = (new MD5CryptoServiceProvider()).ComputeHash(fs);
            fs.Close();

            for (int i = 0; i < byteResult.Length; i++)
            {
                strMD5.Append(byteResult[i].ToString("X2"));
            }

            return strMD5.ToString();
        }

참고로 MD5 signature는 총 128비트(16byte)의 길이가 됩니다.

출처 - 구글링
Posted by 쿵캉켕
C#2011. 2. 9. 11:45


#. panel에서 AutoScroll을 true로 설정할 경우 스크롤 표현이 가능합니다. 하지만 이 스크롤은 마우스 휠로 컨트롤이 안되는데요. 다음 클래스를 추가하면 마우스 휠로 컨트롤할 수 있습니다.

#. 추가할 클래스 - ScrollPanelMessageFilter 클래스를 프로젝트에 추가합니다.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MouseWheel
{
    /// <summary>
    /// panel에 표시된 스크롤을 마우스 휠로 움직일 수 있도록 하는 클래스
    /// </summary>
    public class ScrollPanelMessageFilter : IMessageFilter
    {
        int WM_MOUSEWHEEL = 0x20A;
        Panel panel;
        bool panelHasFocus = false;
        [DllImport("user32.dll")]
        static extern bool GetCursorPos(ref Point lpPoint);
        [DllImport("User32.dll")]
        static extern Int32 SendMessage(int hWnd, int Msg, int wParam, int lParam);

        public ScrollPanelMessageFilter(Panel panel)
        {
            this.panel = panel;
            //Go through each control on the panel and add an event handler.
            //We need to know if a control on the panel has focus to prevent sending
            //the scroll message a second time
            AddFocusEvent(panel);
        }

        private void AddFocusEvent(Control parentControl)
        {
            foreach (Control control in parentControl.Controls)
            {
                if (control.Controls.Count == 0)
                {
                    control.GotFocus += new EventHandler(control_GotFocus);
                    control.LostFocus += new EventHandler(control_LostFocus);
                }
                else
                {
                    AddFocusEvent(control);
                }
            }
        }

        void control_LostFocus(object sender, EventArgs e)
        {
            panelHasFocus = false;
        }

        void control_GotFocus(object sender, EventArgs e)
        {
            panelHasFocus = true;
        }


        #region IMessageFilter Members
        public bool PreFilterMessage(ref Message m)
        {
            //filter out all other messages except than mousewheel
            //also only proceed with processing if the panel is focusable,
            //no controls on the panel have focus
            //and the vertical scroll bar is visible

            if (m.Msg == WM_MOUSEWHEEL && panel.CanFocus && !panelHasFocus && panel.VerticalScroll.Visible)
            {
                //is mouse cordinates over the panel display rectangle?
                Rectangle rect = panel.RectangleToScreen(panel.ClientRectangle);
                Point cursorPoint = new Point();
                GetCursorPos(ref cursorPoint);

                if ((cursorPoint.X > rect.X && cursorPoint.X < rect.X + rect.Width) &&
                    (cursorPoint.Y > rect.Y && cursorPoint.Y < rect.Y + rect.Height))
                {
                    //send the mouse wheel message to the panel.
                    SendMessage((int)panel.Handle, m.Msg, (Int32)m.WParam, (Int32)m.LParam);
                    return true;
                }
            }

            return false;
        }
        #endregion

    }
}

#. 사용법.
 - Form 의 Activated, Deactivate 이벤트에서 아래와 같이 구현 하여 줍니다.

    public partial class Form1 : Form
    {
        private ScrollPanelMessageFilter filter;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Activated(object sender, EventArgs e)
        {
            filter = new ScrollPanelMessageFilter(panel);
            Application.AddMessageFilter(filter);
        }

        private void Form1_Deactivate(object sender, EventArgs e)
        {
            Application.AddMessageFilter(filter);
        }
    }


네이년 블로그를 뒤져서 찾았습니다.

Posted by 쿵캉켕
C#2011. 1. 26. 16:00

#. 중복실행을 방지하기 위한 Mutex 클래스의 사용법 입니다.



using System.Threading;    // Mutex 클래스를 사용하기 위한 네임 스페이스

[STAThread]
        static void Main(string[] args)
        {
            bool bnew;

            // 프로그램명은 WinForm.Text 명을 말합니다.
            Mutex mutex = new Mutex(true, "실행하는 프로그램명", out bnew);

            try
            {
                if (bnew)
                {
                    Application app = new Application();
                    app.Run(new "실행할 프로그램");

                    //mutex 해제
                    mutex.ReleaseMutex();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "MAIN");
            }
            finally
            {
                mutex.Close();
            }

Posted by 쿵캉켕
C#2010. 11. 30. 10:08
※. 알고 나면 유용할 것 같은 단축키들을 모아봤습니다. 출처는 인터넷을 돌아다니다가 어느 블로거님의 자료를 참조했구요. 만약 문제가 된다면 삭제하겠습니다.

<Visual C++의 유용한 단축키> : Help->Keyboard Map 참고

줄넘버 보여주기 :

도구 > 옵션 > 텍스트편집기 > 모든언어 > 자동줄번호 선택.

 

<이동>-------------------------------------------------

Ctrl + F2               현재 라인에 북마크 지정/해제

F2                       지정된 다음 북마크로 이동

Ctrl + Shift + F2      지정된 모든 북마크를 해제

Ctrl-K, Ctrl-H         바로가기 설정. ( 작업목록 창에서 확인가능 )

Ctrl-K,K                북마크 설정 / 해제

Ctrl-K,L                북마크 모두 해제

Ctrl-K,N                북마크 다음으로 이동

Ctrl-K,P                북마크 이전으로 이동

Ctrl-K,C                선택한 블럭을 전부 코멘트

Ctrl-K,U                선택한 블럭을 전부 언코멘트(코멘트 해제)

Ctrl + ] 또는 E        {괄호의 짝을 찾아줌

Ctrl + J, K              #ifdef #endif의 짝을 찾아줌

Ctrl+ -, Ctrl+Shift+ -

현재 커서를 기억하는 Ctrl+F3(VS6에서), Ctrl+K,K(VS7에서) 와는 달리 사용자가 별도로 입력을 해주는건 없고, 단지 이전에 커서가 있었던곳으로 위 키를 누를 때마다 이동된다. (shift를 이용하면 역순)

 

Ctrl-F12                커서위치 내용의 선언(.h)으로 이동

F12                      커서위치 내용의 정의(.cpp)로 이동

Shift+Alt+F12         빠른기호찾기

 

Ctrl-Shift-G           #include "파일명" 파일로 바로 직접이동

F8                       After a build failure hit

Shift+F8            거꾸로

Ctrl + D                툴바의 찾기 Editbox로 이동 

 

<편집>-------------------------------------------------

Ctrl-F                   찾기 대화상자

Ctrl-H                  바꾸기 대화상자

Ctrl-Shift-F           파일들에서 찾기 대화상자

Ctrl-Shift-H           파일들에서 바꾸기 대화상자

Ctrl-G                  해당 줄로 가기 (별로 필요없음)

Ctrl-K,Ctrl-F          선택된 영역 자동 인덴트 (VS6 Alt-F8기능)

Ctrl-Shift-Spacebar             함수와매개변수설명이 안나올경우, 강제로 나오게

Ctrl+Alt+T

Ctrl+Spacebar       멤버목록 팝업창이 나타납니다

Ctrl+Shift+R           (키보드 레코딩)

             가끔 연속된 연속기만으로는 부족한경우가 있다.

             이때 Ctrl+Shift+R 을 누르고, 원하는 동작들을 수행후,

다시 Ctrl+Shift+R을 눌러 종료한다. 

이 중간동작을 원하는 위치에서 반복하고 싶다면

             Ctrl+Shift+P 를 누른다.

 

Ctrl+Shift+V           (히스토리 붙이기)

Ctrl-Z                  이전으로 되돌리기

Ctrl-Shift-Z           되돌렸다, 다시 복구하기

Ctrl + I                  문자열 입력, 점진적으로 문자열 찾기

Ctrl + F3               현재 커서에 있는 문자열 찾기

Ctrl+Shift+F3          거꾸로 찾기

F3                       찾은 문자열에 대한 다음 문자열 (Next Search)

Ctrl + H                 문자열 찾아 바꾸기 (Replace)

Ctrl + Left/Right     단어 단위로 이동

Ctrl+[Delete|Backspace] 단어 단위로 삭제

Ctrl + L                 한 라인을 클립보드로 잘라내기

Ctrl + Shift + L       한 라인을 삭제

Alt + Mouse          세로로 블록 설정하기 (마우스로)

Ctrl + Shift + F8      세로로 블록 설정하기 (키보드로),

취소할 때는 Esc키를 눌러야 함

블록설정>>Tab       선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab)

블록설정>>Shift + Tab선택된 블록의 문자열을 일괄적으로 내어쓰기

Alt+F8>> [Tab|Shift + Tab]

                          들여쓰기 자동 조정

Ctrl + T                 현재 커서에 있는 변수/함수에 대한 Type

Tooltip 힌트 창에 나타남

Ctrl + Alt + T          멤버 변수/함수 목록에 대한 팝업 창이 나타남

Ctrl + Shift + T       공백/콤마/파이프/괄호 등을 기준으로

좌우 문자열을 Swap시킴

Ctrl + Shift + 8       문단기호 표시/감추기 :

Tab ^, Space .으로 표시

Ctrl + D                 툴바의 찾기 Editbox로 이동

Ctrl + Up/Down      커서는 고정시키고 화면만 스크롤 시키기

CTRL+SHIFT+T       커서 위치의 단어와 앞 단어가 서로 교체

ALT+SHIFT+T         커서 위치의 한줄과 윗줄이 서로 교환

Ctrl + Shift + U       소문자가 대문자로 둔갑.

Ctrl + U                 대문자를 소문자로 변경

Ctrl + Shift + F8      블럭설정

Ctrl + C, C                          That copies the current line.

Ctrl+K, Ctrl+C                      Automatically commented.

Ctrl+K, Ctrl+U                      Uncommented.

 

<디버그/빌드>-------------------------------------------

F5                       디버그 시작

F9                       디버그 브렉포인트 지정/해제

Ctrl-F9                 현위치 설정된 브렉포인트 해제

Ctrl-Shift-F9         현재 소스파일에 지정된 모든 Breakpoint 해제

Shift-F5               디버그 빠져나오기

Ctrl-F10                커서가 있는곳까지 실행

Shift-F11                           현 함수를 빠져나감.

 

Shift+Ctrl+B           전체 빌드(프로젝트가 여러개있을경우 모두 빌드)

Alt+B, C                해당 프로젝트만 정리.

Alt+B, U                해당 프로젝트만 빌드.

Ctrl-F7                 현 파일만 컴파일    : 현 프로젝트만 빌드

Ctrl-F5                 프로그램 시작

Shift + F9                           디버그 모드에서 추가하고픈 변수나 등등

앞에 커서를 위치 시킨후 Shift+F9를 누르면

Watch Window에 자동으로 추가.

 

<창관련>-----------------------------------------------

Shift+Alt+Enter       전체 창 (토글 됨)

F4                       속성창 보여준다.

Ctrl+Alt+X                           리소스에디터 툴박스창

Ctrl+Alt+K              작업목록 창.

Ctrl + Tab                           Edit하고 있는 Child Window 간의 이동

Ctrl + F4               현재 Edit하고 있는 Child Window를 닫기

Ctrl-M, Ctrl-L         소스파일의 함수헤더만 보이기 (구현부는 감추고)

Ctrl-M, Ctrl-M        현재 커서가 위치한 함수를 접는다/편다. (토글 키)

Ctrl+R, Ctrl+R         Word Wrap

Ctrl+M+L               편집.전체개요표시숨기기

 

Ctrl+M+H           편집.선택영역숨기기

Ctrl+M+U           편집.현재숨기기중지

 

Alt + F7                Project Setting


출처: http://pmguda.com/100

Posted by 쿵캉켕
C#2010. 11. 10. 12:33
#. 콤보박스에 텍스트를 보여주고 뒤에 Tag처럼 히든으로 값을 숨겨서 ComboBox의 Item을 선택한 경우 해당 Item의 히든 값을 같이 가져오도록 하는 방법 입니다.

1. DataTable을 만든다.
ex)
text | value
----------
001 | abc
002 | def
.
.
.

대충 요런 구성으로 만드시면 됩니다. DataTable 만드는 법을 모르신다면 제 블로그에 있으니 찾아보세요~


2. DataTable을 ComboBox에 넣는다.
 - comboBox.DataSource = dataTable;

3. ComboBox에 표시할 부분을 설정한다.
 - comboBox.DisplayMember = "text" //컬럼 명

4. comboBox에 숨길 값을 설정한다.
 - comboBox.ValueMember = "value";

이러면 다 끝난 것입니다. 만약 ComboBox에서 선택한 item의 히든 값을 보고 싶으시다면
 - string aaa = (string)comboBox.SelectedValue; //히든 값이 string인 경우
요렇게 사용 하시면 되겠습니다. SelectValue가 object 객체 이기 때문에 가져 오실 때에는 형변환을 꼭 해주셔야 합니다.^^
Posted by 쿵캉켕
C#2010. 11. 10. 12:00
#. DataTable은 메모리에 있는 데이터로 구성된 테이블을 생성하는 것입니다. 데이터를 주고 받기 위한 용도로 자주 사용됩니다.아래 예시는 간단하게 DataTable을 만드는 방법 입니다.

#. 생성코드
  1. DataTable dt = new DataTable("TableName");  
 - 생성자의 인자는 테이블 이름입니다. 인자를 주지 않을 수도 있습니다.

#. 필드 정의 코드
  1. DataColumn col1 = new DataColumn();  
  2. col1.DataType = System.Type.GetType("System.Int32");  
  3. col1.ColumnName = "ID";  
  4. col1.AutoIncrement = true;  
  5. dt.Columns.Add(col1);  
  6.   
  7. DataColumn col2 = new DataColumn();  
  8. col2.DataType = System.Type.GetType("System.String");  
  9. col2.ColumnName = "Name";  
  10. col2.DefaultValue = "No Name";  
  11. dt.Columns.Add(col2);  
  12.   
  13. DataColumn col3 = new DataColumn();  
  14. col3.DataType = System.Type.GetType("System.Int32");  
  15. col3.ColumnName = "Age";  
  16. col3.DefaultValue = 0;  
  17. dt.Columns.Add(col3);
 - 각 필드에 대한 데이터 타입은 .NET의 Type을 그대로 사용할 수 있습니다.


#. 필드에 대한 레코두 추가 코드
  1. DataRow dr1 = dt.NewRow();  
  2. dr1["Name"] = "개똥이";  
  3. dr1["Age"] = 10;  
  4. dt.Rows.Add(dr1);  
  5.   
  6. DataRow dr2 = dt.NewRow();  
  7. dr2["Name"] = "소똥이";  
  8. dr2["Age"] = 13;  
  9. dt.Rows.Add(dr2);  
  10.   
  11. DataRow dr3 = dt.NewRow();  
  12. dr3["Name"] = "말똥이";  
  13. dr3["Age"] = 15;  
  14. dt.Rows.Add(dr3); 
 - 레코드에 해당되는 DataRow는 DataTable의 NewRow 매소드를 통해 생성해야 합니다.

#. Primary Key 지정 코드
  1. DataColumn[] key = new DataColumn[1];  
  2. key[0] = col1;  
  3. dt.PrimaryKey = key; 


Posted by 쿵캉켕