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

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
12994정성태3/8/20227182오류 유형: 798. WinDbg - Failed to load data access module, 0x80004002
12993정성태3/4/20226962.NET Framework: 1172. .NET에서 Producer/Consumer를 구현하는 기초 인터페이스 - IProducerConsumerCollection<T>
12992정성태3/3/20228352.NET Framework: 1171. C# - BouncyCastle을 사용한 암호화/복호화 예제파일 다운로드1
12991정성태3/2/20227597.NET Framework: 1170. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 transcode_aac.c 예제 포팅
12990정성태3/2/20227176오류 유형: 797. msbuild - The BaseOutputPath/OutputPath property is not set for project '[...].vcxproj'
12989정성태3/2/20226758오류 유형: 796. mstest.exe - System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.VisualStudio.QualityTools.Tips.WebLoadTest.Tip
12988정성태3/2/20225710오류 유형: 795. CI 환경에서 Docker build 시 csproj의 Link 파일에 대한 빌드 오류
12987정성태3/1/20227141.NET Framework: 1169. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 demuxing_decoding.c 예제 포팅
12986정성태2/28/20227989.NET Framework: 1168. C# -IIncrementalGenerator를 적용한 Version 2 Source Generator 실습 [1]
12985정성태2/28/20227881.NET Framework: 1167. C# -Version 1 Source Generator 실습
12984정성태2/24/20226982.NET Framework: 1166. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 filtering_video.c 예제 포팅
12983정성태2/24/20227075.NET Framework: 1165. .NET Core/5+ 빌드 시 runtimeconfig.json에 설정을 반영하는 방법
12982정성태2/24/20227012.NET Framework: 1164. HTTP Error 500.31 - ANCM Failed to Find Native Dependencies
12981정성태2/23/20226660VC++: 154. C/C++ 언어의 문자열 Literal에 인덱스 적용하는 구문 [1]
12980정성태2/23/20227361.NET Framework: 1163. C# - 윈도우 환경에서 usleep을 호출하는 방법 [2]
12979정성태2/22/20229922.NET Framework: 1162. C# - 인텔 CPU의 P-Core와 E-Core를 구분하는 방법 [1]파일 다운로드2
12978정성태2/21/20227254.NET Framework: 1161. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 resampling_audio.c 예제 포팅
12977정성태2/21/202210982.NET Framework: 1160. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 qsv 디코딩
12976정성태2/21/20226620VS.NET IDE: 174. Visual C++ - "External Dependencies" 노드 비활성화하는 방법
12975정성태2/20/20228384.NET Framework: 1159. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 qsvdec.c 예제 포팅파일 다운로드1
12974정성태2/20/20226513.NET Framework: 1158. C# - SqlConnection의 최소 Pooling 수를 초과한 DB 연결은 언제 해제될까요?
12973정성태2/16/20228744개발 환경 구성: 639. ffmpeg.exe - Intel Quick Sync Video(qsv)를 이용한 인코딩 [3]
12972정성태2/16/20228015Windows: 200. Intel CPU의 내장 그래픽 GPU가 작업 관리자에 없다면? [4]
12971정성태2/15/20229657.NET Framework: 1157. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 muxing.c 예제 포팅 [7]파일 다운로드2
12970정성태2/15/20227796.NET Framework: 1156. C# - ffmpeg(FFmpeg.AutoGen): Bitmap으로부터 h264 형식의 파일로 쓰기 [1]파일 다운로드1
12969정성태2/14/20226440개발 환경 구성: 638. Visual Studio의 Connection Manager 기능(Remote SSH 관리)을 위한 명령행 도구 - 두 번째 이야기파일 다운로드1
... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...