카테고리 없음2023. 2. 5. 15:00

답: 한영전환키를 누를때마다 Alt 를 누른것처럼 동작한다. (한영전환이 안된다)

 

 

이경우 아래에 있는 방식으로 수정하시거나, 한영전환안될때~~~.reg 라는 파일을 싱행하면 된다.

 

한글 키보드를 가지고 있는데 우니도우를 설치할때 표준 키보드를 선택했다면?

 

이경우는 별 문제는 안되지만 오른쪽 ALT 나 Ctrl 키를 특수키를 사용하는 게임(거의 없다)이나 특수한 프로그램(VirtualBox 는 오른쪽 Ctrl 키를 HOST 키로 사용함)에 경우 문제가 될 수 있다.

 

이때는 한글키보드변경.reg 파일을 받아서 실행하면 된다.

 

 

 

해결법.

Windows키 + R

 

regedit

 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters]  의 키 값을 수정

 

LayerDriver JPN = KBD101.dll → KBD101A.dll

LayerDriver KOR = KBD103.dll → KBD103A.dll

OverrideKeyBoardldentifier : PCAT_103KEY → PCAT_103AKEY 

OverrideKeyBoardType : 8

OverrideKeyBoardSubtype : 6 → 3 

Posted by dngchn
dngchn's [C]2020. 12. 4. 14:24

printf를 사용하여 컬러로 콘솔창에 문자를 출력하는 방법은 많이 나와있으나,

따라해도 안될때가 있다.

같은 PC에서 되는 프로젝트는 되고, 안되는건 안되고...

특히나, 콘솔창에 출력하고 바로 창이 닫히는 놈도 있고, 계속하려면 한번더 아무 키나 눌러야 하는 경우도 있고...

...

뭔가 다른데, 아무리 코드를 단순화 시키고 동일하게 두 프로젝트를 맞춰봐도 여전히 양상은 다르다.

...

프로젝트 파일(*.vcxproj)를 까서 되는놈하고 안되는놈하고 한줄한줄 비교하다가 차이를 찾았다.

...

<Link>

    <SubSystem>Console</SubSystem>

</Link>

</ItemDefinitionGroup>

 

위 부분이 있고, 없고 차이..

있으면 콘솔타입으로 컬러로 출력도 되고, 프로그램 끝나고 키입력 대기한다.

없으면 컬러 출력도 안되고 끝나면 자동으로 닫혀버린다. (디버깅 옵션에, 콘솔창 자동 닫기 옵션도 안 먹음)

...

무튼, 차이는 프로젝트가 처음 생성될때 콘솔타입으로 되었으면 잘되고,

빈 프로젝트로 생성되었으면, 위에 부분이 프로젝트에 포함되어 있지 않아 안되는 거임.

...

하.. 오늘도 하나 배움..

Posted by dngchn
dngchn's [Life]2018. 4. 14. 09:32

윈도우7 터치가능 장비에서 뭔가 입력하려면, 키패드 큰 아이콘이 옆에 떠서 귀찮게 하는 것을 없애려면

제어판-tabletpc설정-기타 탭에가서 [입력판 설정]가서 체크박스에 적절히 체크하라.

Posted by dngchn
dngchn's [WPF]2017. 9. 1. 15:36

ListView를 알람 컨테이너로 사용한다.

각 row가 하나의 알람 항목이 되도록.


알람이니만큼, 빨간 램프를 두었다. 깜빡이면 좋을 듯 하여, 애니메이션을 주었다.

알람이 추가될 때마다 깜빡질을 한다.



위와 같다. 각 알람 항목은 추가될 때마다 램프가 깜빡이기 시작한다.

두어개까지는 괜찮지만, 항목이 많아지다보니, 여기저기서 깜빡꺼리며 난잡하다. 보기 싫다. 거슬린다.


각 깜빡임을 어떻게 하면 동기화 할 수 있을까.

알람이 추가되는 타이밍이 다르니, 깜빡이는 동작의 주기도 다를진데...


(깜빡임의 구현은 해당 이미지의 Opacity를 Doubleanimation을 주어 바뀌도록 했다.)


처음 생각은 시간 동기화.

animation의 시작 시간을 현재 시간의 초를 기준으로 한다면 어떨까..

WPF Double animation의 시작에 대해 이벤트를 통해 할 수 있을 듯 하지만, 막상 어떻게 해야할지 감이 안선다.


두번째 생각은 알람이 추가될때마다 이전 추가된 알람들을 새로 한번에 다시 넣기.

-> 새로운 알람 추가마다, 리스트를 비우고 추가하는 로드는 차치하고서라도,

알람이 많아지면, 아무리 한번에 넣는다하더라도, 먼저 추가되는 것과, 맨 나중에 추가되는 놈의 시간차로

미세한 차이는 생길 듯 하다. 시도 하지 않았지만, 하면 될 듯은 한데, 별로 좋아 보이지 않음.


흠...

구글링 시작..

https://stackoverflow.com/questions/4725680/synchronize-wpf-coloranimation-across-several-controls

위에서 ColinE의 답변 참고.


샘플 코드는 없지만, 괜찮은 생각인 듯. 꼼수같지만, 그래서 더 재밌는 생각!

hidden으로 하나의 컨트롤을 감춰두고, 나머지 추가되는 모든 알람들은 animation에서 Opacity를 각자 시작하는 것이 아니라, WPF의 Element binding을 이용하여 감춰진 컨트롤의 Opacity로 바인딩 걸기.


감춰진 더미 컨트롤 코드

<Image Source="/Assets/red-circle.png" HorizontalAlignment="Center" Visibility="Hidden" x:Name="dummyImage">
    <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation To="0.2" Duration="0:0:0.5" Storyboard.TargetProperty="Opacity" RepeatBehavior="Forever" AutoReverse="True"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Image.Triggers>
</Image>


위 더미에 이름을 부여하고 본래 컬럼의 정의를 아래와 같이 바인딩 한다.

<GridViewColumn Width="25">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Image Source="/Assets/red-circle.png" HorizontalAlignment="Center" Margin="0" Opacity="{Binding ElementName=dummyImage, Path=Opacity}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>



효과 확인.



위와 같이 모든 램프가 동기화 되어 같이 밝아지고, 같이 어두워 진다.


난 이런 꼼수가 좋더라~



Posted by dngchn
dngchn's [WPF]2017. 9. 1. 15:18

ListView에 포함된 이미지에 animation을 주자.


<ListView x:Name="AlarmListView" Margin="0,0,0,8" ItemsSource="{Binding AlarmCollection}" HorizontalAlignment="Stretch">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Arised Time" Width="150" DisplayMemberBinding="{Binding ArisedTime}" />
            <GridViewColumn Width="25">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="/Assets/red-circle.png" HorizontalAlignment="Center" Margin="0">
                            <Image.Triggers>
                                <EventTrigger RoutedEvent="Loaded">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="0.2" Duration="0:0:0.5" Storyboard.TargetProperty="Opacity" RepeatBehavior="Forever" AutoReverse="True"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Image.Triggers>
                        </Image>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Message" DisplayMemberBinding="{Binding Message}" />
        </GridView>
    </ListView.View>
</ListView>


위와 같이 원하는 개체에 Triggers를 주며 구성해주면 된다.

RoutedEvent는 특별한 거 없이 항상 동작하기를 바라는 마음으로 Loaded를 주었다. 무조건 처음부터 시작하기.

그리고 RepeatBehavior과 AutoReverse를 주어 효과가 계속 반복되도록 하였음에 주의.

'dngchn's [WPF]' 카테고리의 다른 글

컨트롤 마다 animation 동기화(synchronization) 하기  (0) 2017.09.01
ListView Column Resize disable 시키기  (0) 2017.09.01
Listview에 이미지 넣기  (0) 2017.09.01
Convert image to SVG  (1) 2017.07.21
Modern UI for WPF (MUI)  (0) 2017.07.17
Posted by dngchn
dngchn's [WPF]2017. 9. 1. 15:11

ListView의 컬럼 사이즈 조정을 사용자가 하지 못하도록 막자.


<ListView x:Name="AlarmListView" Margin="0,0,0,8" ItemsSource="{Binding AlarmCollection}" HorizontalAlignment="Stretch">
    <ListView.View>
        <GridView>
            <GridView.ColumnHeaderContainerStyle>
                <Style BasedOn="{StaticResource {x:Type GridViewColumnHeader}}" TargetType="{x:Type GridViewColumnHeader}">
                    <Setter Property="IsHitTestVisible" Value="False"/>
                </Style>
          </GridView.ColumnHeaderContainerStyle>                                       
            <GridViewColumn Header="Message" DisplayMemberBinding="{Binding Message}" />
        </GridView>
    </ListView.View>
</ListView>


위와 같이 IsHitTestVisible을 false로 하면 됨.

Posted by dngchn
dngchn's [WPF]2017. 9. 1. 15:07

ListView에 이미지를 넣어 보자.


ListView의 특정 컬럼에 이미지를 넣는다고 


<ListView x:Name="AlarmListView" Margin="0,0,0,8" ItemsSource="{Binding AlarmCollection}" HorizontalAlignment="Stretch">
    <ListView.View>
        <GridView>            
            <GridViewColumn Header="Arised Time" Width="150" DisplayMemberBinding="{Binding ArisedTime}" />
            <GridViewColumn Width="25">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="/Assets/red-circle.png" HorizontalAlignment="Center" Margin="0" Opacity="{Binding ElementName=dummyImage, Path=Opacity}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>                
            </GridViewColumn>                            
            <GridViewColumn Header="Message" DisplayMemberBinding="{Binding Message}" />
        </GridView>
    </ListView.View>
</ListView>


위와 같이 CellTemplate, DataTemplate를 정의하면 된다.

Posted by dngchn
dngchn's [WPF]2017. 7. 21. 14:06

이미지를 벡터타입으로 변환해서 WPF에서 이용하기


이미지를 WPF Xaml에서 Geometry, Path Data등으로 지정하여 사용하고 싶을 때가 있다.

이런 경우 이미지는 로고 등으로 단순하고, 단일 색상으로 이루어져있어야 좋다


구글링을 하며 여러 방법으로 이를 시도해보았다.


1. Microsoft Expression Design 4 이용하기

MS에서 무료로 다운로드 받아 설치/사용이 가능하다.

Import image 메뉴로 새문서에 원하는 이미지를 불러들인 후, Object - Image - Auto Trace Image... 메뉴를 이용하여, 이미지의 외각선을 딴다. 그 후 해당 오브젝트에 우클릭하여(또는 메뉴에서) Export를 선택하고, Format을 SVG나 XAML... 등으로 선택해서 export 시킨 후 해당 파일을 Visual Studio에서 불러낸다.


xaml 또는 SVG 파일 내용 중 <Path>의 d 또는 data 부분을 얻을 수 있다. (여러줄이라면, 끝에 Z를 빼고 이어 붙인다. 물론 마지막 Z는 필요)


2.  온라인에서 간단히 할 수 있다. (https://www.vectorizer.io/)

위에 접속하여 이미지를 upload하고 step별로 적절하게 지정해주면, SVG파일이 만들어지고 이를 다운로드 할 수 있다.

이렇게 얻어진 SVG는 1번에서 처럼 열어서 path부분을 연결해주면, 한줄짜리 path data를 얻어낼 수 있다.



이미지




Path Data


LogoData="M 1475 5097 c-55 -22 -74 -37 -99 -80 -32 -54 -40 -104 -27 -153 6 -22 142 -266 302 -544 160 -278 305 -530 322 -560 l32 -55 -40 24 c-22 13 -154 89 -292 169 -272 156 -307 169 -387 142 -144 -47 -183 -245 -69 -341 16 -13 154 -96 306 -184 l278 -160 -839 -5 -838 -5 -36 -24 c-50 -35 -80 -84 -86 -141 -7 -71 5 -116 40 -156 65 -74 0 -68 925 -74 l831 -5 -591 -340 c-334 -192 -606 -355 -627 -376 -69 -67 -77 -179 -19 -259 50 -69 146 -98 228 -69 17 6 285 157 594 336 601 347 622 359 614 346 -2 -4 -73 -127 -157 -272 -84 -146 -159 -279 -166 -297 -49 -117 37 -259 164 -272 88 -8 152 26 203 107 l29 45 0 457 0 457 -38 74 c-47 93 -65 168 -65 278 0 273 203 517 478 575 88 18 142 18 230 0 275 -58 478 -302 478 -575 0 -110 -18 -185 -65 -278 l-38 -74 0 -456 0 -456 176 -305 c97 -168 188 -319 202 -335 35 -37 97 -66 145 -66 72 0 149 48 185 115 23 45 20 131 -8 185 -12 25 -158 279 -323 565 -165 286 -302 524 -305 529 -3 5 -1 7 4 4 5 -3 137 -79 294 -169 l285 -164 67 0 c57 0 72 4 110 30 104 73 118 213 30 307 -14 15 -152 101 -308 190 l-282 163 831 5 c925 6 860 0 925 74 35 40 47 85 40 156 -6 57 -36 106 -86 141 l-36 24 -838 5 -839 5 597 344 c352 203 610 358 630 379 88 91 58 254 -58 313 -32 17 -55 20 -102 17 -59 -4 -77 -13 -656 -347 -327 -189 -599 -346 -603 -348 -12 -7 -6 4 160 291 163 281 173 303 173 358 0 110 -89 197 -202 198 -111 0 -133 -25 -329 -364 l-164 -285 -5 443 -5 442 -28 42 c-76 115 -258 115 -334 0 l-28 -42 -5 -442 -5 -443 -320 556 c-176 306 -333 569 -349 585 -53 54 -140 72 -211 45 z M 2445 3425 c-76 -31 -135 -91 -163 -168 -38 -100 -22 -206 43 -292 l35 -45 0 -1460 0 -1460 200 0 200 0 0 1460 0 1460 35 45 c93 122 83 289 -24 396 -86 87 -211 111 -326 64 z"




적용 모습




Posted by dngchn
dngchn's [C#]2017. 7. 20. 16:25

Code Snippet 만들어 사용하기


Code snippet이란 '코드 조각'으로, 반복되는 패턴의 코드 덩어리를 빠르게 입력할 수 있는 일종의 매크로 기능이다.


예를 들어, C#기준으로 설명하자면(VB나 Visual Studio에서 지원되는 다른 언어도 마찬가지, xml까지)

코드 중간에 prop 라고 치고 탭을 따닥 누르면(아주 빨리 누르지 않아도 됨),


public int MyProperty { get; set; }


위와 같이 자동 입력된다.

또한 코드조각이 입력된 후 상태가 int가 선택된 상태에서 커서는 int 앞에 위치해있게된다. 바로 원하는 대로 타입을 입력하고, 탭을 두번 누르면 다음으로 MyProperty에 위치한다. 마찬가지로 원하는 이름으로 변경 후, 엔터를 누르면,

삽입된 코드의 끝으로 나가게 된다.


prop이외에도 이미 많은 조각들이 내장되어 있다. 억지로 쓸 필요는 없지만, 이런게 있는 줄 모르고 안쓰는 것 보단,

어떤것들이 있는지 살펴본 후 필요할 때 적절히 활용하면 코딩 생산성을 높일 수 있고, 궁극적으로는 퇴근 시간을 앞당기어 개발자들이 원하는 저녁있는 삶을 추구하는데 도움을 줄 수도 있으리라...


사용은 이렇게 하면 된다. 특별히 내가 원하는 조각이 있다면, 직접 만들어 사용할 수 도 있다. 조금 까다롭게도 여겨지지만, 처음 부터 새롭게 만들기 보단, 이미 내장된 것 들을 잘 활용하면, 내가 원하는 것들을 손쉽게 만들어 쓸 수 있다.


검색을 해보면, Code Snippet Editor(http://snippeteditor.codeplex.com/)등과 같이 코드 조각을 만드는데 도움을 주는 도구들도 있겠지만, 편함을 위해 무언가 새로운 것의 도움을 받기 보단, 아래와 같은 방법으로 한번 따라해보면 손쉽게 만들어 쓸 수 있으니 개인적으로는 Editor까지 쓸필요는 없을 것 같다.


아래 예 대로만 따라하자.


1. Visual Studio에서 새로만들기 추가에서 xml을 선택한다.




2. 그럼 아래와 같이 기본 xml파일이 만들어 진다. 2번째 줄로 커서를 위치 시키고, Ctrl + K + S 를 누른다.




3. 그럼 아래와 같은 화면을 볼 수 있고, Snippet를 눌러 선택한다.



4. 그럼 아래와 같은 상태가 된다.



5. 위에서 title부터 description까지는 기본 정보이다. 적절하게 채워주자. 단 여기서 Shortcut에 해당하는 것이 위의 예에서 prop이다. 즉 코드 조각을 불러내는 단축단어이니 나중에 쉽게 생각나도록 짧고 강렬하게(?) 잘 짓자.


6. 아래쪽 Literal과 Code를 채워주는 것이 핵심이다. 이 부분은 기존 것을 불러내어 보면, 어떻게 입력해야 할지 감이 올 것이다. 이를 위해 Tool - Code Snippets Manager를 선택하여 창을 띄운다(영문메뉴 기준).




7. Code Snippets Manager에서 Language를 CSharp으로 하고 항목 중 Visual C#으로 선택하면 위와 같이 이미 내장된 많은 snippet들을 볼 수 있다. 위 snippet 목록은 실제 위의 파일 경로에 각각의 파일로 존재한다. 이해를 위해 propfull을 열어본다.




8. 위에서 Literal 부분을 보자. 정의된 3개의 Literal들인 type, property, field가 결국 아래 Code 부분에 미리 작성된 조각코드에 쓰이게 된다. 코드에서는 각각의 Literal들이 $가 앞뒤로 붙어 $type$, $property$, $field$와 같이 되어있다. 물론 이 이름들은 원하는대로 만들면 된다($end$는 코드의 끝을 의미한다. 그대로 두자).


9. 위의 코드 부분은 가능하면 복사하여 내가 만드는 코드 조각에 붙여넣자. 그래야 코드조각이 코드에 삽입되었을 때 줄바꿈과 들여쓰기 등을 깔끔하게 가져갈 수 있다(복사 후 Literal등 변경 부분만 수정하길 추천).


10. 마지막 Language부분이 csharp로 되어있음에 주의. 다른 언어라면 해당 언어대로 변경해줘야 한다.


11. 거의 다 되었다. 위에서 만든 .xml파일을 .snippet으로 확장자를 바꿔준다(내장 snippet과 마찬가지로 파일로 복사되어 관리되므로, 파일 이름도 적절히 짓자).


12. 다시 Code Snippets Manager로 와서 위에서 저장한 파일을 선택하여 import시켜준다.

import된 snippet는 Manager에서 My Code Snippets 폴더에 복사되어 관리된다.


13. 잘 되었는지 확인은, Code Snippets Manager에서 My Code Snippets 폴더에 잘 들어갔는지 확인하고,

최종적으로 코드창에서 내가 입력한 Shortcut을 적고 따닥~ 해보면 된다.

Posted by dngchn
dngchn's [WPF]2017. 7. 17. 18:41

Modern UI for WPF (MUI)

0.

https://mui.codeplex.com/ (15th, 2017까지만 오픈)

https://github.com/firstfloorsoftware/mui


2017.07.17 현재 공식 버전: 1.0.9 (https://github.com/firstfloorsoftware/mui/release 에서 다운로드)

(NuGet 설치시 1.0.11버전이 ModernUI.WPF.Xrm 이름으로 보이나 이는 공식버전 아닌 branch된 버전 임.


1.0.9버전을 다운로드 받으면, FirstFloor.ModernUI.App 이름으로 완벽한 샘플을 소스채 받을 수 있다.


1.

가장 처음, Hello, World 처럼, 손쉽게 MUI를 적용된 WPF창을 만드려면,

새로운 프로젝트 시작시, MUI Template을 선택하면 된다.

지원 Template이 Visual Studio 2013까지 있다.

https://marketplace.visualstudio.com/items?itemName=KoenZwikstra.ModernUIforWPFTemplates

2017버전을 쓰는 상태에서 설치하니, 뭔가 좀 이상한데..

Modern UI WPF Application과

Modern UI WPF Navigation Application 두개의 템플릿만 보인다.


첫번 째 것은 단일창 형태의 WPF Window를 MUI 스타일로 만들어 준다.

두번 째 것은 Group Menu를 두어 이동(navigate)가능한 형태의 앱을 만들어 준다.


2.

첨부된 'Modern UI for WPF 통합정리본'내에 '친절한 샘플들' 폴더의 솔루션을 살펴보면,

각각 간단한 창부터 mvvm까지 고려한 다양한 형태의 샘플들을 볼 수 있으며,

각각은 어떻게 코딩해야 하는지에 대해서 친절하게 UI에 그 설명을 나타내준다.


3.

1.0.9 최신 소스를 다운받아 솔루션을 열어보면, 다양한 컨트롤과 레이아웃 등에 대해 모든 소스를 제공한다.


4.

첨부의 'Waf와 결합본'에는 WPF Application Framework와 결합한 형태의 MUI 샘플을 제공한다(내가 만듦).






Posted by dngchn