Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Win32 API의 UnionRect를 닷넷 BCL의 Rectangle.Union으로 바꿀 때 주의 사항

Win32 API의 UnionRect와 닷넷 BCL의 Rectangle.Union은 같은 역할을 합니다. 그런데, 한가지 차이점이 있습니다. 결론부터 말하면 BCL의 Union은 대상이 되는 Rectangle의 Width, Height가 0이어도 좌표에 따른 Union을 해버리는 반면 Win32 API의 UnionRect는 무시해 버립니다.

코드로 말해 볼까요? ^^

닷넷의 경우, Width 또는 Height가 0이어도,

{
    Rectangle rect1 = new Rectangle(0, 0, 0, 0);
    Rectangle rect2 = new Rectangle(1920, 0, 1920, 1080);

    Console.WriteLine(Rectangle.Union(rect1, rect2));

    // 출력 결과: {X=0,Y=0,Width=3840,Height=1080}
}

위와 같이 rect1의 Width (또는 Height)가 0이지만 rect1의 Left 좌표를 받아들여 Union 시킨 결과에 반영합니다.

반면 Win32 API의 UnionRect는,

{
    RECT rect1 = { 0, 0, 0, 0 };
    RECT rect2 = { 1920, 0, 1920 * 2, 1080 };

    UnionRect(&rect1, &rect1, &rect2);

    printf("X = %d, Y = %d, Width = %d, Height = %d\n", rect1.left, rect1.top, rect1.right - rect1.left,
        rect1.bottom - rect1.top);

    // 출력 결과: X = 1920, Y = 0, Width = 1920, Height = 1080
}

위와 같이 Width = 0 (또는 Height = 0)인 rect1 사각형을 무시해 버립니다.




따라서, C++로 만들어진 소스 코드를 C#으로 포팅할 때 UnionRect에 대해서는 다음과 같은 조치를 취해야 합니다.

public static Rectangle UnionRect(Rectangle rect1, Rectangle rect2)
{
    if (rect1.Width == 0 || rect1.Height == 0)
    {
        if (rect2.Width == 0 || rect2.Height == 0)
        {
            return Rectangle.Empty;
        }

        return rect2;
    }

    if (rect2.Width == 0 || rect2.Height == 0)
    {
        return rect1;
    }

    return Rectangle.Union(rect1, rect2);
}




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 12/13/2017]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  [190]  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
303정성태7/20/200621167Team Foundation Server: 12. 사용자 계정 재생성에 따른 Version Control 영향
302정성태8/21/200623022Team Foundation Server: 11. TFS Team Build와 VC++ Project 설정
299정성태7/23/200622684개발 환경 구성: 5. VMWare - VM 생성 화면 캡쳐
300정성태7/15/200628118    답변글 개발 환경 구성: 5.1. VMWare 오류 유형 - The handle is invalid.
301정성태7/18/200622858    답변글 개발 환경 구성: 5.2. VMWare - 사용 후기.
298정성태7/14/200622594개발 환경 구성: 4. VMWare Server를 64bit 운영체제에 설치 시 주의 사항 [2]
296정성태7/10/200631800.NET Framework: 73. [ASP.NET] HTC(DHTML Control Behavior)를 WebResource.axd로 제공하는 방법 [3]
295정성태7/1/200625173VC++: 25. Microsoft National Language Support Downlevel APIs 1.0 사용 방법파일 다운로드1
294정성태6/30/200621665.NET Framework: 72. XSDObjectGen.EXE 기능 개선
293정성태6/29/200623542Team Foundation Server: 10. TFS 버전 컨트롤(TFVC)에 참여시킨 프로젝트의 로컬 경로를 옮기는 방법
290정성태6/26/200620903Team Foundation Server: 9. HTTPS를 통한 Team Server 접근 - 두 번째 이야기 [1]
291정성태6/26/200622335    답변글 Team Foundation Server: 9.1. [선행 작업] HTTPS 를 통한 Team Server 접근 - 두번째 이야기 [1]
292정성태6/26/200621871    답변글 Team Foundation Server: 9.2. TF30177 오류 발생
307정성태8/3/200623843    답변글 Team Foundation Server: 9.3. Team Server 접근 이름을 바꾸는 방법 [1]파일 다운로드1
308정성태2/18/200723639        답변글 Team Foundation Server: 9.4. Team Server HTTPS 접근 완료. ^^ [1]
288정성태6/26/200638120오류 유형: 10. error MSB6006: "aspnet_merge.exe" exited with code 1
286정성태6/23/200626062웹: 4. 웹 사이트 식별자(Identifier) 값 변경
285정성태6/20/200626445오류 유형: 9. [TFS] Report 관련 서비스를 조회할 때 rsErrorImpersonatingUser 오류 메시지 발생 [1]
284정성태6/19/200624070VS.NET IDE: 40. FxCop - IDE 에서 제공해 주는 SuppressMessage 코드
283정성태1/19/200725387Team Foundation Server: 8. 소스 세이프에서 TFS SourceControl 로 마이그레이션 [2]
279정성태12/27/200631371개발 환경 구성: 3. VS.NET 원격 디버깅 [1]
280정성태6/12/200630274    답변글 개발 환경 구성: 3.1. VS.NET 2003 원격 디버깅 설정
281정성태8/11/200631772    답변글 개발 환경 구성: 3.2. VS.NET 2005 원격 디버깅 설정
315정성태8/11/200632413        답변글 개발 환경 구성: 3.3. VS.NET 2005 원격 디버깅 설정 - ASP.NET F5 디버깅
278정성태6/11/200628577오류 유형: 8. [Outlook] 0x8004011D 에러 - "Exchange over the Internet" 환경
276정성태6/7/200621824Team Foundation Server: 7. 외부 빌드 머신 구성
... 181  182  183  184  185  186  187  188  189  [190]  191  192  193  194  195  ...