IMessageFilter 상속하여 새로운 Class 생성


Interface 된 함수를 생성하여 그안에 


KeyUp =>0x101,  KeyDown => 0x100


MouseDown, Up, Move 등 


제어하고자하는 Event를 등록한 후,


프로그램 실행시


Application.AddFilterMessage( IMessageFilter로 상속하여 만든 Class 객체 );


종료시에 RemoveFilterMessage해서 삭제해주도록 한다.


Alt는 동작되지 않음...



Sample Code

InputController.zip


메시지를 필터링하고 디스패치되지 않게 하려면 true이고 다음 필터 또는 컨트롤에 계속 사용하려면 false입니다.



일반적으로 사용하는 ProcessCmdKey를 재사용하면


KeyDown 이벤트는 정상적으로 동작하나


KeyUp은 동작 하지 않는다.



Event, w.Msg

WM_NULL 0
WA_INACTIVE 0
WM_CREATE 1
WA_ACTIVE 1
WM_DESTROY 2
WA_CLICKACTIVE 2
WM_MOVE 3
WM_SIZE 5
WM_ACTIVATE 6
WM_SETFOCUS 7
WM_KILLFOCUS 8
WM_ENABLE 10
WM_SETREDRAW 11
WM_SETTEXT 12
WM_GETTEXT 13
WM_GETTEXTLENGTH 14
WM_PAINT 15
WM_CLOSE 16
WM_QUERYENDSESSION 17
WM_QUIT 18
WM_QUERYOPEN 19
WM_ERASEBKGND 20
WM_SYSCOLORCHANGE 21
WM_ENDSESSION 22
WM_SHOWWINDOW 24
WM_WININICHANGE 26
WM_SETTINGCHANGE 26
WM_DEVMODECHANGE 27
WM_ACTIVATEAPP 28
WM_FONTCHANGE 29
WM_TIMECHANGE 30
WM_CANCELMODE 31
WM_SETCURSOR 32
WM_MOUSEACTIVATE 33
WM_CHILDACTIVATE 34
WM_QUEUESYNC 35
WM_GETMINMAXINFO 36
WM_PAINTICON 38
WM_ICONERASEBKGND 39
WM_NEXTDLGCTL 40
WM_SPOOLERSTATUS 42
WM_DRAWITEM 43
WM_MEASUREITEM 44
WM_DELETEITEM 45
WM_VKEYTOITEM 46
WM_CHARTOITEM 47
WM_SETFONT 48
WM_GETFONT 49
WM_SETHOTKEY 50
WM_GETHOTKEY 51
WM_QUERYDRAGICON 55
WM_COMPAREITEM 57
WM_GETOBJECT 61
WM_COMPACTING 65
WM_COMMNOTIFY 68
WM_WINDOWPOSCHANGING 70
WM_WINDOWPOSCHANGED 71
WM_POWER 72
WM_COPYDATA 74
WM_CANCELJOURNAL 75
WM_NOTIFY 78
WM_INPUTLANGCHANGEREQUEST 80
WM_INPUTLANGCHANGE 81
WM_TCARD 82
WM_HELP 83
WM_USERCHANGED 84
WM_NOTIFYFORMAT 85
WM_CONTEXTMENU 123
WM_STYLECHANGING 124
WM_STYLECHANGED 125
WM_DISPLAYCHANGE 126
WM_GETICON 127
WM_SETICON 128
WM_NCCREATE 129
WM_NCDESTROY 130
WM_NCCALCSIZE 131
WM_NCHITTEST 132
WM_NCPAINT 133
WM_NCACTIVATE 134
WM_GETDLGCODE 135
WM_SYNCPAINT 136
WM_NCMOUSEMOVE 160
WM_NCLBUTTONDOWN 161
WM_NCLBUTTONUP 162
WM_NCLBUTTONDBLCLK 163
WM_NCRBUTTONDOWN 164
WM_NCRBUTTONUP 165
WM_NCRBUTTONDBLCLK 166
WM_NCMBUTTONDOWN 167
WM_NCMBUTTONUP 168
WM_NCMBUTTONDBLCLK 169
WM_KEYFIRST 256
WM_KEYDOWN 256
WM_KEYUP 257
WM_CHAR 258
WM_DEADCHAR 259
WM_SYSKEYDOWN 260
WM_SYSKEYUP 261
WM_SYSCHAR 262
WM_SYSDEADCHAR 263
WM_KEYLAST 264
WM_IME_STARTCOMPOSITION 269
WM_IME_ENDCOMPOSITION 270
WM_IME_KEYLAST 271
WM_IME_COMPOSITION 271
WM_INITDIALOG 272
WM_COMMAND 273
WM_SYSCOMMAND 274
WM_TIMER 275
WM_HSCROLL 276
WM_VSCROLL 277
WM_INITMENU 278
WM_INITMENUPOPUP 279
WM_MENUSELECT 287
WM_MENUCHAR 288
WM_ENTERIDLE 289
WM_MENURBUTTONUP 290
WM_MENUDRAG 291
WM_MENUGETOBJECT 292
WM_UNINITMENUPOPUP 293
WM_MENUCOMMAND 294
WM_CTLCOLORMSGBOX 306
WM_CTLCOLOREDIT 307
WM_CTLCOLORLISTBOX 308
WM_CTLCOLORBTN 309
WM_CTLCOLORDLG 310
WM_CTLCOLORSCROLLBAR 311
WM_CTLCOLORSTATIC 312
WM_MOUSEMOVE 512
WM_MOUSEFIRST 512
WM_LBUTTONDOWN 513
WM_LBUTTONUP 514
WM_LBUTTONDBLCLK 515
WM_RBUTTONDOWN 516
WM_RBUTTONUP 517
WM_RBUTTONDBLCLK 518
WM_MBUTTONDOWN 519
WM_MBUTTONUP 520
WM_MBUTTONDBLCLK 521
WM_MOUSEWHEEL 522
WM_PARENTNOTIFY 528
WM_ENTERMENULOOP 529
WM_EXITMENULOOP 530
WM_NEXTMENU 531
WM_SIZING 532
WM_CAPTURECHANGED 533
WM_MOVING 534
WM_POWERBROADCAST 536
WM_DEVICECHANGE 537
WM_MDICREATE 544
WM_MDIDESTROY 545
WM_MDIACTIVATE 546
WM_MDIRESTORE 547
WM_MDINEXT 548
WM_MDIMAXIMIZE 549
WM_MDITILE 550
WM_MDICASCADE 551
WM_MDIICONARRANGE 552
WM_MDIGETACTIVE 553
WM_MDISETMENU 560
WM_ENTERSIZEMOVE 561
WM_EXITSIZEMOVE 562
WM_DROPFILES 563
WM_MDIREFRESHMENU 564
WM_IME_SETCONTEXT 641
WM_IME_NOTIFY 642
WM_IME_CONTROL 643
WM_IME_COMPOSITIONFULL 644
WM_IME_SELECT 645
WM_IME_CHAR 646
WM_IME_REQUEST 648
WM_IME_KEYDOWN 656
WM_IME_KEYUP 657
WM_MOUSEHOVER 673
WM_MOUSELEAVE 675
WM_CUT 768
WM_COPY 769
WM_PASTE 770
WM_CLEAR 771
WM_UNDO 772
WM_RENDERFORMAT 773
WM_RENDERALLFORMATS 774
WM_DESTROYCLIPBOARD 775
WM_DRAWCLIPBOARD 776
WM_PAINTCLIPBOARD 777
WM_VSCROLLCLIPBOARD 778
WM_SIZECLIPBOARD 779
WM_ASKCBFORMATNAME 780
WM_CHANGECBCHAIN 781
WM_HSCROLLCLIPBOARD 782
WM_QUERYNEWPALETTE 783
WM_PALETTEISCHANGING 784
WM_PALETTECHANGED 785
WM_HOTKEY 786
WM_PRINT 791
WM_PRINTCLIENT 792
WM_HANDHELDFIRST 856
WM_HANDHELDLAST 863
WM_AFXFIRST 864
WM_AFXLAST 895
WM_PENWINFIRST 896
WM_PENWINLAST 911
WM_USER 1024
WM_APP 32768


'Programming > C#' 카테고리의 다른 글

Virtual, Abstract, Interface  (0) 2017.11.06
DataSource Binding 방법  (0) 2017.10.31
Dictionary 탐색중 삭제하기  (0) 2017.08.17
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

Interface - 여러클래스에 공통적인 기능을 추가 하기 위해 사용 

              (파생클래스에서 구현해야함 <interface에 정의된 것 전부>)


Abstract - 파생클래스에서 공유할 기본클래스의 공통적인 정의 제공하기 위해 사용

              (파생클래스에서 구현해야함 <Abstract 선언된 것>)


Virtual   - 메서드,속성, 인덱서 또는 이벤트 선언을 한정하는데 사용

             (파생클래스에서 Override 하여  따로 사용할 수 있음)




=> Virtual은 Override 하지 않아도 사용 가능한 완전한 class (그대로 사용가능)

     Virtual한정자가 달린 것들을 재정의하여 사용 가능.


=> abstract는 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의만

    하고 ,파생클래스에서 abstract 한정자가 달린 것을 모두 재정의 해야함.


=> Interface는 abstract와 비슷하지만 멤버변수를 사용할 수 없다.



예제 소스

Oriented.zip

'Programming > C#' 카테고리의 다른 글

Input을 전체적으로 Control 하고싶은 경우  (1) 2017.12.26
DataSource Binding 방법  (0) 2017.10.31
Dictionary 탐색중 삭제하기  (0) 2017.08.17
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

GridView에서 특정 Data를 Binding하려면



그리드뷰에 DataBindings -> 고급



DataSource로 변경하고 바인딩할 데이터와 업데이트 모드를 설정한 다음


바인딩 해주면 해당 Data로 바인딩되어 Grdview에 자동적으로 출력한다.




List는 최초 한번만 GridView에 업데이트 되고 ReBinding하여도 

    Update되지 않음

  < 따라서, List => BindingList 를 써야 한다. >

   

'Programming > C#' 카테고리의 다른 글

Input을 전체적으로 Control 하고싶은 경우  (1) 2017.12.26
Virtual, Abstract, Interface  (0) 2017.11.06
Dictionary 탐색중 삭제하기  (0) 2017.08.17
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

Dictionary<Key, Value> 형태로 쓰게되는데


Key값으로 Loop(반복문)를 돌리고


해당Key만 삭제하면 된다.



foreach(string sKey in Dictionary.Keys.ToList())

{

      // Dictionary.Keys[sKey] == value;  <- Key로 찾은 Value

      Dictionary.Remove(sKey);           <- Key를 이용해서 Value 삭제

}



'Programming > C#' 카테고리의 다른 글

Virtual, Abstract, Interface  (0) 2017.11.06
DataSource Binding 방법  (0) 2017.10.31
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
Enum에서 정한 Name을 index로 가져오기  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

캐스팅 as, is

Programming/C# 2017. 6. 30. 15:37

개체는 다형성이므로 기본 클래스 형식의 변수는 파생 형식을 가질 수 있습니다. 


파생 형식의 메서드에 액세스하려면 값을 파생 형식으로 다시 캐스팅해야 합니다. 그러나 이러한 경우 단순한 캐스팅을 시도하려면 <xref:System.InvalidCastException>이 throw될 수 있는 위험을 감수해야 합니다. 


이 때문에 C#은 is 및 as 연산자를 제공합니다. 이러한 연산자를 사용하면 예외를 throw시키지 않고 캐스트 성공 여부를 테스트할 수 있습니다. 

일반적으로 캐스트가 성공하면 실제로 캐스트 값을 반환하는 as 연산자가 훨씬 효율적입니다.


 is 연산자는 부울 값만 반환합니다. 따라서 이 연산자는 개체 형식을 결정하고 실제로 캐스트하지는 않는 경우에 사용할 수 있습니다.


as를 사용했을때 int, double, float등에 Null값을 넣을수 없지만

int? a  = 변수면 as int?;

앞뒤로 ?를 붙여주면 변수에 null값이 들어가게 된다.


class SafeCasting { class Animal { public void Eat() { Console.WriteLine("Eating."); } public override string ToString() { return "I am an animal."; } } class Mammal : Animal { } class Giraffe : Mammal { } class SuperNova { } static void Main() { SafeCasting app = new SafeCasting(); // Use the is operator to verify the type. // before performing a cast. Giraffe g = new Giraffe(); app.UseIsOperator(g); // Use the as operator and test for null // before referencing the variable. app.UseAsOperator(g); // Use the as operator to test // an incompatible type. SuperNova sn = new SuperNova(); app.UseAsOperator(sn); // Use the as operator with a value type. // Note the implicit conversion to int? in // the method body. int i = 5; app.UseAsWithNullable(i); double d = 9.78654; app.UseAsWithNullable(d); // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } void UseIsOperator(Animal a) { if (a is Mammal) { Mammal m = (Mammal)a; m.Eat(); } } void UseAsOperator(object o) { Mammal m = o as Mammal; if (m != null) { Console.WriteLine(m.ToString()); } else { Console.WriteLine("{0} is not a Mammal", o.GetType().Name); } } void UseAsWithNullable(System.ValueType val) { int? j = val as int?; if (j != null) { Console.WriteLine(j); } else { Console.WriteLine("Could not convert " + val.ToString()); } } }

블로그 이미지

SherryBirkin

,

dgv.Columns[index].Frozen = true; 

가장좌측에 이름이 있고 스크롤했다면 어떤건지 파악하기가 어렵지만

Frozen하면 고정되기때문에 파악이 쉬움.


dbView.Columns[index].DividerWidth = 수치;

index이전과 이후 사이의 구분자가 커져서 구분하기가 쉬워짐.



블로그 이미지

SherryBirkin

,

(지정한Enum명)Enum.ToObject(typeof(지정한Enum명), Index);



블로그 이미지

SherryBirkin

,

컬럼헤더에 체크박스를 추가하고, 이벤트를 추가했다면

체크박스 이벤트에

foreach (DataGridViewRow dgvRow in 그리드뷰네임.Rows)

{

         dgvRow.Cells["헤더네임"].Value = ((CheckBox)sender).Checked;

}



하게되면 선택한 경우 SelectAll또는 DeSelectAll이 된다


하지만, 체크박스에 EditBegin상태가 유지되고있다면

체크값이 변하지 않는다.


그리드뷰네임.EndEdit();


EndEdit를 해서 Edit모드를 종료 한 후 위 코드를 사용하면 정상적으로

모든 체크박스가 바뀐다.

블로그 이미지

SherryBirkin

,

DataGridView의 이벤트중 CellPainting 나 Load이벤트에


if (e.ColumnIndex == 0 && e.RowIndex == -1)

                {

                    e.PaintBackground(e.ClipBounds, false);


                    Point pt = e.CellBounds.Location;the cell


                    int nChkBoxWidth = 15;

                    int nChkBoxHeight = 15;

                    int offsetx = (e.CellBounds.Width - nChkBoxWidth) / 2;

                    int offsety = (e.CellBounds.Height - nChkBoxHeight) / 2;


                    pt.X += offsetx;

                    pt.Y += offsety;


                    CheckBox cb = new CheckBox();

                    cb.Size = new Size(nChkBoxWidth, nChkBoxHeight);

                    cb.Location = pt;

                    cb.Checked = true;

                    cb.CheckedChanged += new EventHandler(dgvCheckBox_CheckedChanged);


                    ((DataGridView)sender).Controls.Add(cb);


                    e.Handled = true;

                }


해당코드 입력

넣고자 하는 컬럼헤더에 Check박스위치를 계산해서 새로 그려주는 코드와 체크박스 이벤트 추가하는 코드임



블로그 이미지

SherryBirkin

,

DataGridVeiw이벤트에 EditingControlShowing추가

e.Control.KeyPress이벤트 연결


KeyPress와 연결한 함수에서


if (((DataGridViewTextBoxEditingControl)sender).Text.Length >= 제한할 길이 수 

  && ((DataGridViewTextBoxEditingControl)sender).SelectedText.Length <= 0)

      e.Handled = true;


SelectedTextLength는 블록 지정했을때 수정이 가능하게끔 하기 위함



블로그 이미지

SherryBirkin

,