글 목록 보기

Lyn
조회 수 2121 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

컴퓨터의 발전과 함께 발전해온 것 중 하나가 바로 폰트(Font) 이다.

컴퓨터를 초창기에는 계산용으로 사용했고, 그 다음으로 컴퓨터가 널리 보급 된 이유는 역시나 사무용이다. 타자기를 대체하기 위한 WordProcessor 라는 프로그램이 등장 한 이후, 압도적인 수정/복제의 편리함으로 타자기를 순식간에 밀어내고 컴퓨터가 널리 쓰이게 되었는데, 타자기에서 절대 흉내낼 수 없었던 워드프로세서의 장점 중 하나가 바로 다양한 폰트를 사용 할 수 있다는 것이다.

 

당연히 많은 폰트가 개발 되어 왔고, 프로그래머들은 그 폰트를 담을 파일 포맷 역시 설계해야 했다.
 

초창기에는 컴퓨터 모니터의 해상도가 워낙 낮았고, PC 성능또한 처참했기에 폰트 하나하나를 픽셀로 표현하는 방법을 사용했다. 바로 비트맵 폰트 라고 하는 녀석인데, 이것은 FON 확장자를 사용한다.
하지만 출력물의 해상도는 당시에도 모니터보다 훨씬 높았기 때문에(이것은 현재에도 대부분의 경우 마찬가지다. 자세한것 후술) 비트맵 폰트로는 좋은 출력물을 얻을 수 없었으며, 그 연구의 결과물이 바로 Adobe 가 만든 PostScript 포맷이다.
 

그 이후 애플이 Adobe에 대응하기 위해 새 포맷을 만들었는데, 바로 트루타입 폰트이다. PS 와 한가지 다른 특징을 가지고 있는데, 바로 2차원 베지어 곡선을 이용한다는 점이다. 이는 용량,속도에서 장점이 있고, 해상도가 낮은 모니터에서도 비교적 깔끔하게 보이는 특징이 있다. 나중에 LCD 같은 고정밀도의 디스플레이에 대응하기 위해 힌팅이 추가되었다(MS에서는 ClearType 이란 이름으로 XP 이후부터 지원한다). 확장자는 TTF 를 사용한다. TTF는 패밀리 폰트(이탤릭, 굵게 등등..) 을 넣을 수 없으므로, TTF 여러개를 묶는 컨테이너 포맷이 등장하게 되는데 이 포맷의 확장자는 TTC를 사용한다.

 

90년대 들어와서 MS는 새 파일 포맷을 만드는데, PS와 TTF 의 장점만을 취한 포맷으로 확장자는 OTF이다. PS 처럼 3차원 베지어 곡선을 사용하고, 자체적으로 패밀리 폰트를 지원한다. 3차원 베지어 곡선을 사용하므로 속도가 느리고 용량도 크며, 모니터에서는 곡선의 복잡도로 인해 제대로 표현히 되지 않는다는 단점이 존재한다. 주로 PS와 마찬가지로 출력물에서 사용한다.

 

그 외 HFT 같은 한컴에서 만든 폰트 포맷도 존재한다.
 

그러나 2015년 현재 시점에는 굉장히 아이러니한 상황이 벌어졋는데, MS Windows 에서 가장 많이 쓰는 포맷이 Apple 이 만든 TTF 이고, Apple OSX 에서 가장 많이 사용하는 포맷이 MS가 만든 OTF이다 (....) 
또 디스플레이도 상황이 많이 달라졋는데, "일반적인" 출판물의 DPI 는 지금도 300정도로 변함이 없지만, 스마트폰의 경우 500이 넘는 무식한 PPI를 지원하는 녀석들이 등장했다. 마찬가지로 PC에서도 250PPI를 넘는 디스플레이들이 많이 등장했는데, 당장 지금 본인이 쓰는 노트북만 해도 13.9인치 크기에 3200*1800 해상도를 자랑한다. 비교적 "저해상도" 를 지원하기 위한 기술들이 디스플레이가 고해상도화 되면서 난감한 상황이 된것. 이 상황이 오면서 가장 치명타를 입은게 MS Windows 인데, Windows 는 속도와 가독성 양쪽을 다 잡기 위해 2차원베지어곡선을 이용하는 TTF 포맷을 쓰면서 강력한 힌팅 알고리즘과 데이터를 이용해 가독성을 올리는 방법을 택했기 때문이다. 하지만 그대로 해상도가 깡패인 (...) 환경에서 이런 알고리즘은 도움이 되지 않았고, OS의 폰트가 전체적으로 예쁘지 않게 보이는 결과를 낳게 되었다(구형 맥을 보면 생각보다 폰트가 안이쁜걸 알 수 있다... 폰트가 정말 이뻐진건 레티나 디스플레이 장착한 머신 부터. 논리 해상도를 1440*900으로 1/4토막을 내면서 까지 극단적으로 폰트의 미려함을 추구한 OS이다). Windows 8 이후 추가된 UWA(윈도우 10 이전엔 Modern UI 라고 불럿다)에서는 결국 다른 방법으로 랜더링한다. ClearType 은 낮은 해상도에서 높은 가독성을 얻기 위함이지 높은 해상도에 최적화된 방법이 아니었기때문에..

?

2015.04.20 14:08

Resharper C++ 사용기 - 1

Lyn
조회 수 3417 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

코드의 네이밍 스타일을 지정하는 옵션입니다.
 

1.png2.png

 

더블클릭하면 스타일을 지정 할 수 있게 되어있습니다.
기본은 C++표준에서 자주 쓰이는 전부소문자 형태이네요. 전 Windows API 에서 주로 쓰는 Pascal 스타일을 주로 쓰니 본격적으로 쓰기 시작하면 바꿔놔야 할 것 같습니다

 

 

아래는 특정 코드 패턴에 대해 색으로 표시를 해 주는 기능입니다(보통 정적분석이라고들 부르죠)
목록을 보면 boost를 사실상 표준 라이브러리 취급을 해줘 버리는 느낌이네요. boost 라이브러리 관련 기능도 들어 있습니다.
사실 저도 굉장히 많이 씁니다. 특히 boost::format 같은건. stringstream 은 정말 극혐이라서요.


어쨋든 잘못된 패턴의 코드에 눈에 띄게 색을 입혀준다는것은 코딩 실수를 방지하기 위해 아주 좋은 방법이지요. 몇가지만 테스트 해 보겠습니다.

5.png

 

아래처럼 구형 C스타일의 캐스팅을 사용하면 녹색으로 밑줄이 그어지면서 전구 모양의 아이콘이 생깁니다.
어떤 문제로 전구가 떳는지 알려며, 아래같은 경우는 Use static_cast 를 클릭하면 자동적으로 C++ 스타일의 캐스팅 연산자를 쓰도록 변환됩니다

6.png

 

 

아래처럼 printf(위 메뉴목록을 보시면  알겠지만 boost::format 도 지원 합니다) 의 파라메터가 잘못된것은 빨간줄로 나타납니다.
이 줄 색은 등급을 어떤것으로 해 놓았냐의 문제인데, 기본 옵션에서 format string이 잘못된 것은 error 취급하게 되어 있으므로 빨간줄입니다.11.png

 

잘못된 format string에 커서를 갖다 대면 빨간 전구 아이콘이 뜨고, 클릭하면 %s를 %d로 자동으로 변환 해 줍니다.

12.png

 

의외로 모르는 사람이 많은 부분인데 64bit 정수의 경우 %d로 출력할 수 없고 %lld 를 사용해야 합니다.(gcc의 경우 %I64d를 사용합니다)
이 부분에 대해서도 정확히 처리를 해 주고 있습니다.

20.png

 

한가지 아쉬운것은 error로 세팅을 하더라도 빌드 자체는 문제 없이 진행됩니다.
오류 메세지를 띄워서 빌드를 막아줫으면 좀더 좋지 않았을까 하는 아쉬움이 있습니다

13.png

 

하지만 처음부터 하는게 아니라 프로젝트 중간에 툴을 도입하여 코드를 정리하려고 하면 눈으로 일일히 찾으려면 고생좀 해야 할텐데요...

Next Issue in File 을 클릭하면 이슈를 하나 하나 추적해서 고쳐나갈 수 있습니다.

14.png

아래는 코드를 ReFormatting 할때 사용할 옵션들입니다.
거의 모든 경우의 옵션을 다 지원 합니다... 만 이미 VS2013의 Format 옵션도 충분히 다양해져서 그리 큰 의미가 있어 보이진 않습니다.
 

코드가 어떻게 바뀌는지 미리보기 하는 기능도 VS 자체에서 이미 제공되는 기능입니다.

 

3.png

 

그나마 장점이라면 VS에 내장된 옵션의 불성실한(....) 미리보기 화면과 달리 유저가 실제로 보게 되는것과 같은 코드 색을 입혀준 정도의 장점이 있겠습니다.
옵션도 아주 쬐금 더 다양하구요. 유명한 프리셋을 몇 종류 제공한다는것도 일단 장점이라면 장점입니다(애초에 편의성때문에 사용하는 툴이니까)

21.png

 

Source Reformat 은 영역 선택으로도 가능하고, 파일 전체 역시 가능합니다.
이 역시 원래 VS 내장 기능으로도 제공되던 부분입니다.

10.png

뭐 별로 눈에 띄지 않는 헤더 자동완성입니다.

8.png

 

만약 헤더를 못찾을 경우 붉은 밑줄을 그어 주며, 자신이 어디에서 include를 시도했는지 알려줍니다.

7.png

 

이거 굉장히 맘에 들었던 기능인데... 사용 하지 않는 헤더를 어둡게 처리 해 줍니다.
다른 언어에선 많이들 지원되는 기능인데(주로 VM 언어들에서...) C++ 에서는 쓰는지 안쓰는지 잘 몰라서 그냥 냅둔 경우가 많았습니다.
안그래도 다른 언어에 비해 거지같이 컴파일 느린 C++인데 쓸데없는 헤더를 제거하는것으로 조금이나마 컴파일 속도를 올릴 수 있다면 그것만으로도 유용하겟죠 

9.png

 

제가 굉장히 많이 쓰는 기능중 하나인, 헤더 선언하고 구현부 자동생성하는 기능입니다.

15.png

 

이부분이 Visual Assist 대비 장점이 있는데, VA 는 여러번 클릭하면 컴파일이 되던말던 중복생성 (....) 해 주는 무식한 짓을 하는데 비해, Resharper 의 경우 즉시 아이콘이 navigate 로 바뀝니다.

16.png

 

흔히 사용하는 Extract Method 기능입니다.
뭐 대부분의 툴과 비슷해서 별로 설명할게 없습니다.

17.png

 

Refactoring 기능은 좀 많이 아쉽습니다.
코드가 어떻게 바뀌는지 전혀 미리 보여주지 않습니다. 실수하기전에 체크할수 없고 바뀐 뒤에 한번 더 코드를 눈으로 확인해야합니다.

18.png

 

 

아래 기능은 코드 자동생성 기능인데... 뜬금없이 닷넷용 소스 생성 기능이 들어 있습니다.
문제는 이 글을 쓰기 위해 새로 세팅한 VM위에 달랑 VS2013과 Resharper C++만 설치해 놓은 상태인데도 이게 뜹니다 (....) 절대로 닷넷용 Resharper 가 설치되어 있는 상황이 아닙니다. 심지어 C++/CLI 는 없고 vb.net 과 C#만 있습니다;

4.png

 

 

 

PS. Resharper 는 생각하는 중입니다 (....)

19.png

 

PS2. 가격은 Visual Assist 279달러 Resharper C++ 229달러로 50달러 쌉니다.
가격을 생각하면 선택 해 볼만한 툴중 하나입니다.

 

PS3. 전체적으로 Visual Assist 는 결과가 좀 이상하더라도 일단 빨리 보여주는 쪽으로 개발이 되어있는-0-;; 느낌이 강하게 나는데(코드 분석하는 동안엔 정말 말도 안되는 결과도 가끔 보여주죠....) 이쪽은 확실히 정확한 결과를 보여줍니다. 단지 분석이 좀 느리네요

 

PS4. 사실 치명적인문제는... 베타시절보단 많이 빨라 졋지만 그래도 느립니다.
제가 예전에 작업하던 중대형 프로젝트(프로젝트 크기가 약 25만라인)를 열어 봤는데... 이건 머 코딩이 불가능할 정도입니다. 정말 심각하게 느려요.
사실 전 툴이 느리다고 불평하는 사람한텐 똥컴쓰지 말고 장비좀 좋은거 쓰라고 하는데(특히 맥북에어 쓰면서 느리다고 징징대는놈들한테....) 이건 뭐 답이 안나옵니다.

이클립스랑 IntelliJ 느린건 뭐 애교로 보이는 수준으로 툴이 느려집니다.
컴퓨터를 업그레이드 하려고 해도 제가 저 프로젝틀을 열어봣던 장비가 Intel i7 4770K이 달려있어서.. 더이상 딱히 올릴 방법도 없는 상태구요

 

가장 골때리는건 Visaul Assist 처럼 Enable/Disable 전환이 그리 쉽지 않아서 필요할때만 켜는것도 좀 애매하단 겁니다... 차기 버전에서 속도 개선이 필수적으로 이루어 져야 겠네요. 뭐 중규모 정도의 프로젝트라면 별 문제 없어 보입니다만...

 

일단 어차피 생겼으니 더 써보면서 두번째 글 올려보겠습니다.

TAG •
?

Lyn
조회 수 2663 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

https://www.jetbrains.com/resharper-cpp/

구매 해서 사용해보고 후기 한번 올려 보겠습니다.

 

과연 Visual Assist 를 대체할수 있을까?

?

Lyn
조회 수 9612 추천 수 0 댓글 0
Atachment
첨부 '10'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

nuget이 뭔가 하니... 

java의 maven, ruby의 gem, node.js 의 npm 같은 패키지 저장소입니다. ms가 만든거죠


필요한 라이브러리를 매번 찾아서 세팅하려면 귀찮으니 인터넷에서 받아서 자동설치 하자... 의 개념입니다.
저도 C#으로 개발할 때는 매우 잘 이용하고 있었는데... 멍청하게도 이게 C++을 지원한다는걸 모르고있었습니다.

얼마전 알게된 김에 한번 테스트 해 보았습니다.


모든 스크린샷은 최근에 무료 배포되는 VS2013 Community Edition입니다.


그럼 새 Console 프로젝트를 하나 만들고, 

Project -> Manage Nuget Packages... 를 클릭합니다


1.png



그리고 Serch Online 텍스트박스에 설치하고자 하는 패키지명을 넣습니다.
전 흔히 쓰는 boost로 해 보겠습니다


2.png


VC++ 2013 는 버전으로는 12.0 이므로 boost-vc120 을 선택하여 설치합니다

3.png


install을 누르면 설치되는데 속도는 꽤 빠릅니다.
boost가 5분정도만에 설치 되더군요


4.png


설치가 끝나면 프로젝트에 패키지 파일하나만 달랑 추가됩니다. 깔끔하네요

5.png


그럼 정말 잘 되는지 테스트를 해야겟죠?

boost::shared_array 를 사용한 후 빌드를 해 봤습니다


6.png


깔끔하게 잘 진행 되네요.


그럼 패키지 파일들은 어디에 저장 되는지 궁금해 지는데,

솔루션 폴더(프로젝트가 아님!) 내의 package 폴더에 저장됩니다


7.png



그런데 이상한점이 있는데, 프로젝트 옵션 어디에도 저 Path에서 lib나 include 를 하고 있지 않습니다.
그럼 대체 어떻게 include 와 링크가 성공하는걸까요?

9.png


해답은 프로젝트파일에 있습니다.

ExtensionTargets 을 추가해서 빌드 targets 파일을 추가 해 주는거죠

10.png


그래서 프로젝트에 파일이 등록되어 있지 않아도 정상적으로 include 와 link 가 가능해 집니다.


PS. 다른 라이브러리는 몰라도 boost는 nuget 안쓰는게 좋을지도...

5G 가 프로젝트 생성될때마다 추가되면 (.....)


#본격_SSD_용량_줄어드는_파일.jpg

8.png


TAG •
?

Lyn
조회 수 3603 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Devpia 에 질문 올라온김에 정리 해 두는데


크게 특별한 것이 아니라 ... 

http://www.jiniya.net/tt/788 여기 있는 내용 그대로다.
혹시 링크 깨졋으면 http://lunapiece.net/Article/27343 여길 봐라


하면안되는짓이 같은 이유는 InitInstance / ExitInstance  는 결국 DllMain 의 Reason 에 따라 분기하는 함수이기 때문


관련 자료는 아래 링크에서 찾을 수 있다 
https://msdn.microsoft.com/ko-kr/library/66f127e5.aspx


"MFC에서 제공하는 DllMain 함수는 DLL이 로드될 때 InitInstance를 호출하고, DLL이 언로드되기 전에 ExitInstance를 호출합니다"

TAG •
?

Lyn
조회 수 5256 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

업데이트 하다가 설정 꼬여서 오밤중에 쇼를 했구나 (...)


왜이리 웹서버 설정이 어려운거야...





근데 하고 나니 뭔가 좀 빨라진 느낌이 든...다?

?

Lyn
조회 수 1912 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

오오 멋지다...

안드로이드 허니콤 이후로는 블록킹 되는 네트워크 함수를 UI Thread에서 호출하면 android.os.NetworkOnMainThreadException 가 발생한다.

병신같은 코드를 양산하는 개발자들을 막기위해 플랫폼 차원에서 강제한것.



테스트 코드를 만들 때 조차 완전한 형태의 코드를 만들어야 해서 귀찮지만, 평균적인 App의 퀄리티를 올리기 위한 아주 좋은 선택이었다고 생각한다.
MS도 이런걸 해 줫으면 좋았을텐데.
TAG •
?

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

여러가지 jar을 가져다 쓰다 보면 안에 있는 License 관련 파일이 겹쳐서 충돌 나는 경우가 있다.

이 경우 Gradle 스크립트의 android 섹션에 


packagingOptions {

        exclude 'META-INF/DEPENDENCIES.txt'

        exclude 'META-INF/LICENSE.txt'

        exclude 'META-INF/NOTICE.txt'

        exclude 'META-INF/NOTICE'

        exclude 'META-INF/LICENSE'

        exclude 'META-INF/DEPENDENCIES'

        exclude 'META-INF/notice.txt'

        exclude 'META-INF/license.txt'

        exclude 'META-INF/dependencies.txt'

        exclude 'META-INF/LGPL2.1'

    }


를 추가해서 패키지에서 빼 주면 해결이 가능하다

TAG •
?

Lyn
조회 수 4246 추천 수 0 댓글 0
Atachment
첨부 '3'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

상당히 많은 언어가 예외 처리기를 가지고 있는데, 각각의 언어별로 특성이 있습니다.
try - catch - finally 를 모두 가지고 있는 언어(C#, Java 등) 도 있고

try - except (C 계열의 try - catch 에 대응) 와 try - finally 를 가지고 있지만 try - except 뒤에 finally 가 붙을 수 없어서 아래와 같이 중첩을 해야 하는 Pascal 계열의 언어(주로 Delphi 겠지만..) 도 있습니다


try

  try 

    //do something

  except

    //do something

finally

  //do something 


네 그리고 대망의 C++은.. finally 그런거 없습니다 (...)
C++ 표준협회에서는 stack 에 생성된 객체의 소멸자를 이용하라고 하는데 다른 언어의 코드를 C++로 옮기다가 보면 해제할것 하나하나마다 객체 만들어 주기도 보통 일이 아닙니다. 하지만 의외로 타 언어의 샘플을 C++로 옮기는게 자주 발생 하는 일이기도 하지요.


그래서 전 람다를 이용한 꼼수를 이용해서 코드를 옮길때 자주 써먹고 있습니다.
바로 아래와 같은 객체를 사용 해서요


class Finalizer
{
public:
    Finalizer()
    {

    }
    Finalizer(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
    ~Finalizer()
    {
        if (fPtr != nullptr) fPtr();
    }
    void SetFunction(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
private:    
    std::function<void(void)> fPtr;
};


소멸자에서 function 을 호출해 주느 매우 단순한 구조입니다.
이걸 어떻게 쓰냐면 


void test1()
{
    char* arr = new char[100];
    Finalizer final([&]
    {
        delete[] arr;
        wcout << L"Test1 : Delete Arr" << endl;
    });

    //do Something
    wcout << L"Test1 Code End" << endl;
    
    return;
}


이렇게 씁니다.

저 Finalizer 의 생성자로 lambda 를 넘겨서 finally 블록으로 삼는거죠.
그럼 포커스를 잃는순간 호출 되면서 실행 되게 됩니다.

final1.png


그럼 exception 이 발생 했을때는 어떨까요?
간단하게 아래와 같은 코드를 생각해 볼 수 있습니다


void test2()
{
    try
    {
        char* arr = new char[100];
        Finalizer final([&]
        {
            delete[] arr;
            wcout << L"Test2 : Delete Arr" << endl;
        });
        //do Something
        wcout << L"Test2 : Code End" << endl;
        
        throw L"Exception";
        
        return;        
    }
    catch (...)
    {
        wcout << L"Test2 : Exception" << endl;
    }    
}


하지만 이 코드는 문제가 하나 있는데, 코드 흐름이 다르다는겁니다

final2.png


블록을 빠져나오는것이 catch 로 넘어가는것보다 우선이기 때문에 finally 로 사용하려 했던 코드가 예외처리 코드보다 먼저 실행되어 버립니다.

이걸 해결하는건, C++은 블럭을 자유롭게 구성할 수 있다는걸 이용해서.. 바깥에 블록을 하나 더 만들어서 해결합니다




void test3()
{
    {
        Finalizer final;
        try
        {
            char* arr = new char[100];
            final.SetFunction([&]
            {
                delete[] arr;
                wcout << L"Test3 : Delete Arr" << endl;
            });
            //do Something
            wcout << L"Test3 : Code End" << endl;

            throw L"Exception";

            return;
        }
        catch (...)
        {
            wcout << L"Test3 : Exception" << endl;
        }
    }
}


위 코드는 어차피 저 코드밖에 없기 때문에 추가적인 블록이 필요 없긴 하지만... 일반적으론 그런 코드는 많지 않겠지요


final3.png


실행결과는 다음과 같습니다.
finally 블록이 다른 언어에서의 코드와 다르게 맨 뒤가 아닌 중간에 와야 하는게 맘에 들진 않는데...
대신 다른 언어에서 try 블록 내부에 선언된 변수를 finally 에서 쓸 수 없어 변수만 위쪽으로 옮기거나 하는 단점이 사라져 좋아진 것도 있습니다.


뭐 어차피 급하게 쓸때 쓰는 "꼼수" 라서요


PS. 테스트는 메모리 해제 코드로 했는데..... 메모리는 그냥 unique_ptr 이나 shared_ptr 계열 쓰세요 (...)

PS2. 더 좋은 방법 있으시면 좀 알려주세요.


아래는 전체 테스트 코드입니다

#include <iostream>
#include <functional>

using namespace std;

class Finalizer
{
public:
    Finalizer()
    {

    }
    Finalizer(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
    ~Finalizer()
    {
        if (fPtr != nullptr) fPtr();
    }
    void SetFunction(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
private:    
    std::function<void(void)> fPtr;
};


void test1()
{
    char* arr = new char[100];
    Finalizer final([&]
    {
        delete[] arr;
        wcout << L"Test1 : Delete Arr" << endl;
    });

    //do Something
    wcout << L"Test1 Code End" << endl;
    
    return;
}

void test2()
{
    try
    {
        char* arr = new char[100];
        Finalizer final([&]
        {
            delete[] arr;
            wcout << L"Test2 : Delete Arr" << endl;
        });
        //do Something
        wcout << L"Test2 : Code End" << endl;
        
        throw L"Exception";
        
        return;        
    }
    catch (...)
    {
        wcout << L"Test2 : Exception" << endl;
    }    
}

void test3()
{
    {
        Finalizer final;
        try
        {
            char* arr = new char[100];
            final.SetFunction([&]
            {
                delete[] arr;
                wcout << L"Test3 : Delete Arr" << endl;
            });
            //do Something
            wcout << L"Test3 : Code End" << endl;

            throw L"Exception";

            return;
        }
        catch (...)
        {
            wcout << L"Test3 : Exception" << endl;
        }
    }
}

void wmain()
{
    test1();
    wcout << endl;
    test2();
    wcout << endl;
    test3();
}
TAG •
?

Lyn
조회 수 3052 추천 수 0 댓글 0
Atachment
첨부 '4'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

네. 요즘 고해상도 디스플레이(맥북 프로 레티나 라거나, 4K 모니터 라거나, 아니면 Razer Blade나 Aorus X3 Plus 같은) 디바이스가 꽤 늘어 났습니다.

이런놈들 말이죠


dpi3.png


dpi4.png






하지만 윈도는 고해상도 지원 꽤 느린편이어서 Vista 부터 일단 지원은 햇지만 거의 쓰이지 않았고 본격적인 지원은 역시 8 부터라고 보이는데요. 뭐 사실 윈도 7이 나온 2009년보다도 한참 지난 2012년 맥북 프로 레티나 부터 PC/랩탑용 고해상도 디스플레이가 등장 했으니 그러려니 합니다.


어쨋든 중요한건 이제 저런 장비를 쓰는 사람들도 있고 하니 고 DPI 지원을 해야 한다는거겠지요.
그러려면 DPI 를 가져와야 하는데 그 방법중 하나인 Direct2D 를 이용한 방법을 간단히 정리 해 둡니다.


개발자 답게 코드부터 보자면 

#include <iostream>
#include <D2d1.h>

using namespace std;

#pragma comment(lib, "D2d1.lib")

void wmain()
{
    ID2D1Factory* pD2DFactory = nullptr;
    if (SUCCEEDED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory)))
    {
        float dpix, dpiy;
        pD2DFactory->ReloadSystemMetrics();
        pD2DFactory->GetDesktopDpi(&dpix, &dpiy);
        pD2DFactory->Release();

        wcout << L"X : " << dpix << endl << L"Y : " << dpiy << endl;
    }
    else
    {
        wcout << L"Direct 2D Create Error";
    }    
}

라는 대단히 심플 한 코드로 가져올 수 있습니다.

D2D 팩토리를 생성후 ReloadSystemMetrics 호출 후 GetDesktopDpi 를 통해서 가져오는 매우 심플한 방식인데, ReloadSystemMetrics  를 하지 않으면 팩토리 생성 후 변화된 Dpi 설정을 가져오지 못합니다(내부에서 캐시하는듯)


dpi1.png




위와 같은 실행 결과가 나옵니다. 윈도우의 기본 DPI(100%) 값은 96 으로서 이는 23인치 FullHD에 맞도록 세팅 된 값입니다(사실 "현재까지 쓰인 일반적인" 모니터의 크기와 해상도라면 대부분 매칭 됩니다. 17인치 1280*1024 도 96DPI 입니다)

그럼 125%로 바꿔서 한번 테스트 해 보겠습니다.

dpi2.png


 

네. 96 * 1.25 = 120 이니까 정확히 나오네요.

 

당연하겠지만 Direct2D 를 사용 한 방식이므로 Windows Vista Sp2 or Higher 를 요구합니다.

TAG •
?

Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13