기본 콘텐츠로 건너뛰기

UWP 지원 종료 확정? 2025년 이후 WinUI3 전환해야 하는 이유

UWP 를 접한 계기는 마이크로소프트 스토어 때문이었다. 앱을 개발하고 소소한 수익이라도 만져볼 생각이었지만 2024년 11월 UWP에 대한 지원 중단에 대한 포스팅을 발견했고, WinUI 를 접하게 되었다. 둘 다 마이크로소프트 윈도우의 UI 프레임워크지만 UWP 지원을 중단하는 큰 이유는 개발자들의 참여도가 상대적으로 적은 것이 원인이었다. UWP의 지원이 중단되면서 대체재는 무엇일까? 했지만, 마이크로소프트는 WinUI를 권장하고 있다. WinUI는 윈도우 계열의 UI 프레임워크로 간단한 앱은 기존의 WPF , UWP와 흡사하기 때문에 이미 WPF나 UWP에 익숙해져 있다면 WinUI로 빠르게 옮기는 것도 방법일 듯 싶다. 마이크로소프트 UWP 지원 중단과 WinUI 3 권장 UI 프레임워크 UWP 앱, 지금 당장 이전해야 할까? 결론부터 말하면, 모든 UWP 앱을 지금 즉시 WinUI 3로 옮길 필요는 없다. 하지만 “어떤 앱이냐”에 따라 판단은 완전히 달라진다. 아래 중 하나라도 해당된다면, UWP 유지보수는 장기적으로 리스크가 된다. 신규 기능 추가 계획이 있는 앱 Windows 최신 UI/기능을 활용해야 하는 앱 1년 이상 운영 예정인 서비스형 앱 기업/업무용으로 장기 지원이 필요한 앱 반대로, 단순 내부 도구이거나 기능 추가 계획이 없는 경우라면, 단기적으로는 UWP 유지도 가능하다. 중요한 건, ‘지금 이전하느냐’보다 ‘이전을 전제로 설계하고 있느냐’다. UWP 극복하지 못한 비운의 UI 프레임워크 UWP를 처음 접했을 때는 마이크로소프트 스토어 때문이었다. 소소한 윈도우 앱으로 소소한 수익을 기대한 것이지만, 상당히 불편했다. `윈폼보다 못한 기능` 이 한가지만 해도 이미 모든 것을 말해준다. 심지어 WPF보다도 못했다. ( 다행인건 개발환경은 비슷했다는 점에 있다.) 윈도우 계열의 모든 기기에서 사용할 수 있는 `원소스-멀티코드`가 목적이었지만, 욕심이 과했던 것인지 내부의 문제였던 것인지, 문제를 제기해도 UWP에 대한 지원은 미미했다. ...
최근 글

챗지피티 GPTs와 구글 Gems 차이 | 공유와 비용의 차이

AI를 사용하면 중복된 프롬프트를 꾸준히 만들게 된다. 챗지피티-GPTs 혹은 제미나이-Gems를 사용하면 중복된 프롬프트를 하나의 AI 서비스처럼 만들어 사용할 수 있다. 본인의 경우 GPTs 를 먼저 사용해 보고 익숙한 경우 Gems 까지 만들어 같이 사용하고 있지만, 이 둘의 차이가 있다. 사용자의 이용 범위이다. 결론적으로 챗지피티의 GPTs의 경우 모든 사용자가 사용할 수 있지만, GPTs를 만들고자 한다면 PLUS 사용자로 유료 결제가 필요하다. 하지만, 구글 제미나이 Gems의 경우 무료 사용자가 사용할 수 있는 장점이 있다. 1. GPTs와 Gems . 2. 나만의 개인화 AI 비서를 만들고 공유하자. . 3. 차이점 / 비용의 문제 . 4. 만들면 편하다 .

C언어 정수형 숫자 입력과 평균 계산 하기

. #include <stdio.h> #include <math.h> /* 함수 선언 */ void Call_Expression(int param1, int param2, int param3, int param4, int param5); /* 프로그램 시작 */ int main(void) { printf("\n----- Start 20-Input-Number-Average-Calculation \n\n"); int arg1 = 0; int arg2 = 0; int arg3 = 0; int arg4 = 0; int arg5 = 0; printf("5개 숫자 입력 : "); scanf_s("%i %i %i %i %i", &arg1, &arg2, &arg3, &arg4, &arg5); Call_Expression(arg1, arg2, arg3, arg4, arg5); printf("\n----- End \n"); /* 정상 종료 */ return 0; } void Call_Expression(int param1, int param2, int param3, int param4, int param5) { double average = (param1 + param2 + param3 + param4 + param5) / 5; printf("\n입력된 숫자: %i, %i, %i, %i, %i, 평균 : %f\n", param1, param2, param3, param4, param5, average); } . 코드 실행 결과 .

C언어 정해진 수식의 숫자 입력과 계산하기

. #include <stdio.h> #include <math.h> /* 함수 선언 */ void Call_Expression(int arg1, int arg2); /* 프로그램 시작 */ int main(void) { printf("\n----- Start 18-Square-and-Arithmetic-Modulo \n\n"); int arg1; int arg2; printf("1번째 숫자 입력 : "); scanf_s("%i", &arg1); printf("2번째 숫자 입력 : "); scanf_s("%i", &arg2); Call_Expression(arg1, arg2); printf("\n----- End \n"); /* 정상 종료 */ return 0; } void Call_Expression(int param1, int param2) { printf("\n결과 : 5 * %i + 10 * %i = %i\n", param1, param2, 5 * param1 + 10 * param2); } . 코드 실행 결과 .

C언어 문자열 버퍼 설정과 출력 방법 | buffer 변수와 sprintf_s 함수 사용하기

. #include <stdio.h> #include <string.h> /* 함수 선언 */ void Call_SafeStringBufferOutput(void); /* 프로그램 시작 */ int main(void) { printf("\n----- Start 17.Safe_String_Buffer_Output \n\n"); Call_SafeStringBufferOutput(); printf("\n----- End \n\n"); /* 정상 종료 */ return 0; } void Call_SafeStringBufferOutput(void) { char input_text_1st[255]; char input_text_2nd[255]; char input_buffer[255]; printf("scanf_s 1번째 입력 : "); printf("=> "); fgets(input_text_1st, sizeof(input_text_1st), stdin); input_text_1st[strcspn(input_text_1st, "\n")] = '\0'; printf("scanf_s 2번째 입력 : "); printf("=> "); fgets(input_text_2nd, sizeof(input_text_2nd), stdin); input_text_2nd[strcspn(input_text_2nd, "\n")] = '\0'; sprintf_s(input_buffer, sizeof(input_buffer), "%s %s", input_text_1st, input_text_2nd); printf("\n버퍼 문...

C언어 제곱 수식과 사칙연산 나머지 연산자 사용 방법 | 수식 만들기와 연산자 사용하기

. #include <stdio.h> #include <math.h> /* 함수 선언 */ void Call_Addition(int arg1, int arg2); void Call_Subtraction(int arg1, int arg2); void Call_Multiplication(int arg1, int arg2); void Call_Division(int arg1, int arg2); void Call_Modulo(int arg1, int arg2); /* 프로그램 시작 */ int main(void) { printf("\n----- Start 11-Arithmetic-Modulo-Operators \n\n"); int arg1; int arg1_sqrt; int arg2; int arg2_sqrt; printf("1번째 숫자 입력 : "); scanf_s("%i", &arg1); arg1_sqrt = arg1 * arg1; printf("2번째 숫자 입력 : "); scanf_s("%i", &arg2); arg2_sqrt = arg2 * arg2; Call_Addition(arg1_sqrt, arg2_sqrt); Call_Subtraction(arg1_sqrt, arg2_sqrt); Call_Multiplication(arg1_sqrt, arg2_sqrt); Call_Division(arg1_sqrt, arg2_sqrt); Call_Modulo(arg1_sqrt, arg2_sqrt); printf("\n----- End \n"); /* 정상 종료 */ return 0; } void Call_Addition(int param1, int param2) { ...

다빈치 리졸브에서 배경 화면 색상 변경 방법|검정, 흰색, 투명 배경 색상 바꾸기

다빈치 리졸브의 배경 화면 색상은 Effects 효과 패널의 Solid Color와 Inspector 설정으로 배경 화면 색상을 변경할 수 있다. 다빈치 리졸브에서 투명한 이미지의 경우 검은색으로 표현되는 경우들이 있다. 다른 영상 위에 올라가는 경우라면 상관이 없지만, 그렇지 않은 경우 난감해 진다. 이런 경우 Effects 에서 배경을 강제로 설정하면 투명한 이미지의 배경 또한 변경이 가능해 진다. 다빈치 리졸브 배경색 설정 / Effects > Solid color Effects 와 Inspector 다빈치 리졸브에는 클립( Clip )들이 존재하고, 어떤 효과를 주고 싶을 것이다. 클립은 다빈치 리졸브에서 편집할 영상, 이미지, 사운드 등과 같은 것들을 의미한다. 이런 클립들에 어떤 효과를 주기 위해 사용하는 것이 Effects와 Inspector를 사용하면 된다. 다빈치 리졸브가 무료임에도 불구하고, 풍부한 효과를 제공한다. 먼저, 단어의 뜻을 보자. Effects 와 Inspector 의 순수한 영어 뜻은 Effect는 효과, Inspector는 점검자, 검사자란 뜻을 가진다. Effect : 효과 Inspector : 점검자, 검사자 위의 단어는 다빈치 리졸브에서 Effects의 경우 효과 패널 창을 의미하고, Inspector의 경우 클립의 세부 속성과 같은 것들에 대한 패널 창을 의미한다. 패널창은 단순히 정보창 정도로 이해하자. 배경 화면 색상 변경 방법 다빈치 리졸브에서 배경 화면의 색상을 변경하기 위해선 Effects 효과에서 Solide Color를 선택하여 사용하면 된다. 특히, 배경이 투명한 이미지를 사용하는 꽤나 유용하다. 다빈치 리졸브의 미디어 풀( Media Pool )에 배경이 투명한 이미지를 불러온다. 불러온 이미지를 타임라인에 추가한다. 화면 좌측 상단의 Effects를 선택한다. 화면 좌측 하단의 Effects 패널의 Toolbox > Titles > Generators를 선택한다. 우측에 나타나는 것들 ...

다빈치 리졸브 타임라인 시작 시간 설정 방법 | 타임코드 00:00:00 으로 변경하기

다빈치 리졸브에서 타임라인은 기본적으로 01:00:00 이며, 시작 타임코드( Start Timecode )이다. 이 타임라인의 시간이 신경쓰이는 부분이긴 한데, 전문적인 영상에서 종사하는 분들이라면 이해하는 부분이다. 하지만, 타임라인의 타임코드가 01:00:00이 신경쓰인다면 미디어풀( medea pool )에서 타임라인 생성시 00:00:00 으로 설정해 주면 된다. 타임라인 시작시간 / 타임코드 00:00:00 설정하기 타임라인과 타임코드 `다빈치 리졸브`에서 타임라인과 타임코드가 무엇인지 간단히 언급해 본다. 타임라인은 편집할 영상, 이미지, 사운드 등을 배치하는 구간이며, 시간에 따라 어떻게 편집하면 되는지 보여주는 구간이다. 타임코드는 타임라인에 배치된 영상, 이미지, 사운드와 같은 것들의 시간적 위치를 표시한다. 추가로, 영상, 이미지, 사운드 등의 미디어 요소들은 다빈치 리졸브에서 통칭 `클립`이라 한다. 클립 영상, 이미지, 사운드 등의 미디어 요소들 타임라인 클립들을 배치. 타임코드 선택된 구간의 클립이 표시되는 시간 표시. 일단 화면부터 보면 다음과 같다. 다빈치 리졸브 / 타임라인과 타임코드 위의 이미지를 보면 빨간색의 큰 영역이 타임라인이다. 영상, 이미지, 사운드 등의 클립들을 배치하고 어떻게 표시되는지 알 수 있다. 클립들을 타임라인에 배치하면 아래와 같은 이미지처럼 보인다. 다빈치 리졸브 - 타임라인과 타임코드 위의 이미지는 영상, 이미지, 사운드와 같은 클립들을 타임라인에 배치된 모습이다. 캡첫, 브루와 같은 다른 영상 편집 프로그램과 유사하다. 다만, 차이점이 있다면, 다빈치 리졸브의 경우 영상 전문가들을 기준으로 맞춘 프로그램이기 때문에 타임코드의 기본값은 01:00:00이다. 유튜브와 같은 영상을 제작하는 사람들에게는 신경쓰이는 부분들이기도 하다. 타임코드 설정 순서 타임코드는 선택된 클립의 구간의 시간을 표시한다. 클립은 편집할 영상, 이미지, 사운드 등의 리소스를 의미한다. 이런 클립들이 영상의 어떤 시간대의 위치에 있...

C언어 문자열 결합과 출력 방법 | strcat_s 함수 사용하기

. #include <stdio.h> #include <string.h> /* 함수 선언 */ void Call_SafeStringConcatenationoutput(void); /* 프로그램 시작 */ int main(void) { printf("\n----- Start 15.format-specifier-text-oputput \n\n"); Call_SafeStringConcatenationoutput(); printf("\n----- End \n\n"); /* 정상 종료 */ return 0; } void Call_SafeStringConcatenationoutput(void) { char input_text_1st[255]; char input_text_2nd[255]; printf("scanf_s 1번째 입력 : "); printf("=> "); fgets(input_text_1st, sizeof(input_text_1st), stdin); input_text_1st[strcspn(input_text_1st, "\n")] = '\0'; printf("scanf_s 2번째 입력 : "); printf("=> "); fgets(input_text_2nd, sizeof(input_text_2nd), stdin); input_text_2nd[strcspn(input_text_2nd, "\n")] = '\0'; strcat_s(input_text_1st, sizeof(input_text_1st), " "); strcat_s(input_text_1st, sizeof(input_text_2nd), input_t...

C언어 서식 문자를 사용한 문자열 출력 방법 | %s 사용 방법

. #include <stdio.h> #include <string.h> /* 함수 선언 */ void ClearFormatSpecifierTextOutput(void); /* 프로그램 시작 */ int main(void) { printf("\n----- Start 14-text-input-output \n\n"); ClearFormatSpecifierTextOutput(); printf("\n----- End \n\n"); /* 정상 종료 */ return 0; } void ClearFormatSpecifierTextOutput(void) { char input_text_1st[255]; char input_text_2nd[255]; printf("scanf_s 1번째 입력 : "); printf("=> "); fgets(input_text_1st, sizeof(input_text_1st), stdin); input_text_1st[strcspn(input_text_1st, "\n")] = '\0'; printf("scanf_s 2번째 입력 : "); printf("=> "); fgets(input_text_2nd, sizeof(input_text_2nd), stdin); input_text_2nd[strcspn(input_text_2nd, "\n")] = '\0'; printf("\n서식 지정자 사용 문자열 출력 결과 : `%s %s`이다.\n", input_text_1st, input_text_2nd); } . 코드 실행 결과 .