<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>leeyk2121 님의 블로그</title>
    <link>https://leeyk2121.tistory.com/</link>
    <description>leeyk2121 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 16:57:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>leeyk2121</managingEditor>
    <item>
      <title>MFC(5) MFC SDI 프로그램 기본 구조 2</title>
      <link>https://leeyk2121.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuMMIC/btsLP7lDeLo/7wDxAzx1YkTHiAOX3U9Z0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuMMIC/btsLP7lDeLo/7wDxAzx1YkTHiAOX3U9Z0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuMMIC/btsLP7lDeLo/7wDxAzx1YkTHiAOX3U9Z0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuMMIC%2FbtsLP7lDeLo%2F7wDxAzx1YkTHiAOX3U9Z0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;782&quot; height=&quot;1079&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HelloMFC를 실행하면 해당 창이 뜨고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/puLKd/btsLQGuixqs/tof1wgZ2YIcig2kfekxOHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/puLKd/btsLQGuixqs/tof1wgZ2YIcig2kfekxOHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/puLKd/btsLQGuixqs/tof1wgZ2YIcig2kfekxOHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpuLKd%2FbtsLQGuixqs%2Ftof1wgZ2YIcig2kfekxOHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;405&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 분리가 된다는데.. 나는 안된다.. 왤까..&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;용어 정리&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Caption bar&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4TQyP/btsLQ7Svej4/2q2UC6t6afEki9KhBlNBI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4TQyP/btsLQ7Svej4/2q2UC6t6afEki9KhBlNBI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4TQyP/btsLQ7Svej4/2q2UC6t6afEki9KhBlNBI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4TQyP%2FbtsLQ7Svej4%2F2q2UC6t6afEki9KhBlNBI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;63&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저기 저 창닫기, 창크기 축소, 창 내리기 버튼, 아래 파일 편집 등등을 다 합쳐서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CFrameWnd라고 한다. 이놈은 부모가 된다. 이 밑에 자식을 가진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 자식중에 Toolbar라고 한다. 아래에 있는 그림이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uM6wb/btsLQMOEhjd/iGNWAb3PU0mWOg7oQ7wcC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uM6wb/btsLQMOEhjd/iGNWAb3PU0mWOg7oQ7wcC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uM6wb/btsLQMOEhjd/iGNWAb3PU0mWOg7oQ7wcC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuM6wb%2FbtsLQMOEhjd%2FiGNWAb3PU0mWOg7oQ7wcC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;403&quot; height=&quot;163&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CQmCw/btsLQRoM7KD/VKdLsehAqDVY1VMdZy01H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CQmCw/btsLQRoM7KD/VKdLsehAqDVY1VMdZy01H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CQmCw/btsLQRoM7KD/VKdLsehAqDVY1VMdZy01H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCQmCw%2FbtsLQRoM7KD%2FVKdLsehAqDVY1VMdZy01H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;262&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tool bar가 Caption bar에 도킹한다고 보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;status bar(빨간색 윤곽선)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ0vEk/btsLPyqu7IH/R60mkFTAXMauS9A6c6L5k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ0vEk/btsLPyqu7IH/R60mkFTAXMauS9A6c6L5k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ0vEk/btsLPyqu7IH/R60mkFTAXMauS9A6c6L5k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ0vEk%2FbtsLPyqu7IH%2FR60mkFTAXMauS9A6c6L5k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;240&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 원래 고정되어 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cview(자식..)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 윈도우에 사실상 겹치게 되는 놈(녹색 윤곽선)이 Cview&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDk3K3/btsLO6OzrZV/1XpZ8LV6ggzkhtsPZRgWH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDk3K3/btsLO6OzrZV/1XpZ8LV6ggzkhtsPZRgWH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDk3K3/btsLO6OzrZV/1XpZ8LV6ggzkhtsPZRgWH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDk3K3%2FbtsLO6OzrZV%2F1XpZ8LV6ggzkhtsPZRgWH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1334&quot; height=&quot;888&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Z order&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우가 겹첬을 때 누가 더 잘 보이게 하냐 이거다. 윈도우 보이게 하는 순서다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 기본적으로 FrameWnd는 최소 한개가 있어야 한다. 근데 child는 1~n개가 존재할 수 있다. view는 눈에 보이지 않지만 눈에 보이는 것은 시각화 된것으로 메모리에 정보가 담겨있다. 이 정보가 C Document다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;view가 여러개가 되면 Document가 여러개가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0fKks/btsLO8MqOQR/xXAstqY57BSaz5Jjhj4tY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0fKks/btsLO8MqOQR/xXAstqY57BSaz5Jjhj4tY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0fKks/btsLO8MqOQR/xXAstqY57BSaz5Jjhj4tY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0fKks%2FbtsLO8MqOQR%2FxXAstqY57BSaz5Jjhj4tY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1309&quot; height=&quot;614&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;break point를 사용해서 InitInstace()를 봐보면 wWinMain이 부른 것임을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9HtyM/btsLP5uyooc/Z27kEytzZWyUr6w2Kvk33K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9HtyM/btsLP5uyooc/Z27kEytzZWyUr6w2Kvk33K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9HtyM/btsLP5uyooc/Z27kEytzZWyUr6w2Kvk33K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9HtyM%2FbtsLP5uyooc%2FZ27kEytzZWyUr6w2Kvk33K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;440&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 양식을 생성하고 메인프레임 , view, document도 생성해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 InitInstance()함수가 SDI 기준에서 True 반환을 하면 이때부터 메시지 루프가 돌기시작한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메시지 루프가 돌때는 RUN 함수이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1857&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFcFMt/btsLQ42u95p/q9DEafNxoVTJ81zj1Fp8xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFcFMt/btsLQ42u95p/q9DEafNxoVTJ81zj1Fp8xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFcFMt/btsLQ42u95p/q9DEafNxoVTJ81zj1Fp8xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFcFMt%2FbtsLQ42u95p%2Fq9DEafNxoVTJ81zj1Fp8xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1857&quot; height=&quot;892&quot; data-origin-width=&quot;1857&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 저 CHelloMFCApp을 alt+enter를 누르면 속성창이 뜨고 재정의를 누른 후 RUN에가서 add Run을 하면 새로운 RUN함수가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CWinApp이 호출되는 순간 메시지 루프가 돌고 처리가 된다. 필요한걸 알고 재정의해서 내 코드를 적어야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출 전?후?에 할 것인지 잘 정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처]&lt;a href=&quot;https://www.youtube.com/watch?v=7jnrurlCGtM&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=7jnrurlCGtM&lt;/a&gt;&lt;/p&gt;</description>
      <category>널널한 개발자 tv #mfc</category>
      <author>leeyk2121</author>
      <guid isPermaLink="true">https://leeyk2121.tistory.com/6</guid>
      <comments>https://leeyk2121.tistory.com/6#entry6comment</comments>
      <pubDate>Fri, 17 Jan 2025 01:53:07 +0900</pubDate>
    </item>
    <item>
      <title>MFC(4) MFC SDI 프로그램 기본 구조 1</title>
      <link>https://leeyk2121.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKIgpD/btsLOYPqnwh/uWk5t0WpKXsYSRPVOfsSNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKIgpD/btsLOYPqnwh/uWk5t0WpKXsYSRPVOfsSNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKIgpD/btsLOYPqnwh/uWk5t0WpKXsYSRPVOfsSNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKIgpD%2FbtsLOYPqnwh%2FuWk5t0WpKXsYSRPVOfsSNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;453&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;F7 눌러서 빌드좀 하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmC9zX/btsLOXXfEet/wl1jveuElIVNwMIWjBULPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmC9zX/btsLOXXfEet/wl1jveuElIVNwMIWjBULPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmC9zX/btsLOXXfEet/wl1jveuElIVNwMIWjBULPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmC9zX%2FbtsLOXXfEet%2Fwl1jveuElIVNwMIWjBULPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;197&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl+F5 누르면 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NjuB7/btsLOKDV6vv/J5VCikDcVjN5nnJV7vD5P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NjuB7/btsLOKDV6vv/J5VCikDcVjN5nnJV7vD5P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NjuB7/btsLOKDV6vv/J5VCikDcVjN5nnJV7vD5P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjuB7%2FbtsLOKDV6vv%2FJ5VCikDcVjN5nnJV7vD5P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;283&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런게 MFC로 만든 예제들이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클래스 뷰&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N4PQf/btsLNYbE6DN/SbTQjtqu0hfee5WX13n891/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N4PQf/btsLNYbE6DN/SbTQjtqu0hfee5WX13n891/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N4PQf/btsLNYbE6DN/SbTQjtqu0hfee5WX13n891/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN4PQf%2FbtsLNYbE6DN%2FSbTQjtqu0hfee5WX13n891%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;185&quot; height=&quot;281&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스가 여러개 있는 것을 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHelloMFCApp 클래스를 먼저 보겠다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CHelloMFCApp&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJDhX4/btsLOMu5kqo/9mgfEAoNE5kxHMoaIgAu10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJDhX4/btsLOMu5kqo/9mgfEAoNE5kxHMoaIgAu10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJDhX4/btsLOMu5kqo/9mgfEAoNE5kxHMoaIgAu10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJDhX4%2FbtsLOMu5kqo%2F9mgfEAoNE5kxHMoaIgAu10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;142&quot; height=&quot;103&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴이 등장하나. MFC는 싱글톤 패턴을 사용한다. 자바의 스프링은 컨테이너가 알아서 해준다. 근데 MFC는 그런거 없다. 모든 책임은 우리에게 있다..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/poVdq/btsLOTAJaNH/plr5ZTFcqW7Yjn9hHZN8ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/poVdq/btsLOTAJaNH/plr5ZTFcqW7Yjn9hHZN8ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/poVdq/btsLOTAJaNH/plr5ZTFcqW7Yjn9hHZN8ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpoVdq%2FbtsLOTAJaNH%2Fplr5ZTFcqW7Yjn9hHZN8ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;343&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InitInstance가 Main함수의 시작이라고 보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ExitInstance()&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W04YD/btsLN61PTbt/nzkPFJzXzqT6LieLvfZvb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W04YD/btsLN61PTbt/nzkPFJzXzqT6LieLvfZvb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W04YD/btsLN61PTbt/nzkPFJzXzqT6LieLvfZvb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW04YD%2FbtsLN61PTbt%2FnzkPFJzXzqT6LieLvfZvb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;194&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 종료 즉 프로그램 종료시 불려진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출된다. 뜻이다. 영어 표현으로는 Called by framework이다. 이런 구조이다. 지금은 HelloMFC는 구조를 익히는 것이 아주 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프레임 워크는 당연히 MFC 프레임 워크이다. 그러면이 프레임워크에 의해서 불리는데 이게 다시 말하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MFC 프레임 워크가 알아서 부른다. &lt;b&gt;언제,왜 그때 딸려오는 정보를 가지고 어떤 처리를 하는지 고민해야한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그 흐름을 결정하는 것은 프레임워크가 이미 결정을 했다. Called by framework는 두가지 형태가 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. 가상함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;가상함수 즉 MFC가 알아서 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;가상함수를 재정의 해주면 알아서 Called by framework에 의해서 불린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. Callback 즉 메시지 처리기 (Handler)&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;메시지가 뭐가 하나 정해지면 정해진 메시지에 대응해주는 함수 하나가 나오게 되고 이 함수를 처리기라고한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다 등록해놓고 쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 정리해보자...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 PC용 어플리케이션을 개발할 때 우리는 앞서 SDI(Single document interface)를 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW는 세놈으로 쪼갠다. 제어체계, GUI, 자료구조 이렇게 크게 3구조로 나눈다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우의 SDI로 개발하게 되면 위와 같은 방식으로 3구조로 나뉜다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. CWinAPP Class(제어체계)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. CFrameWnd+CView (GUI)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. C Document(자료구조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 MFC로 프로그래밍 하면 대부분의 코드가 2번에 집중될 가능성이 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이러한 프레임워크를 사용하면 Framework가 흐름을 만드는데 우리가 만든게 아니여서 파악하는게 제일 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CWinAPP 자체가 프로그램 그 자체로 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Frame하고 View는 GUI 관련된 거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Document는 걍..기능이다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다시 되돌아가서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MFC어플리케이션이 시작되면 내부적으로 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APxWinMain()이 호출되고 끝나면 프로그램이 끝난다. 이때 이 내부에서 객체를 생성하는데 CWinAPP object를 생성한다. 이놈이 main함수구나라고 생각하면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CWinAPP이르고 있는 흐름은 3가지가 있다. 핵심 함수가 1,2,3이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. InitInstance() : 알아서 제일 먼저 불린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. Run() : LOOP가 돌면서 어딘가로 Callback이 된다. 처리기가 왕창 만들어지고 내가 만든 프로그램들이 도는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. ExitInstance()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 3흐름이 만들어지면 프로그램의 시작과 끝이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 Run()이 동작하면 Message Loop가 작동한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(진짜..기존에 하던 프로그랭이란 많이 다르다..순서가 정해져있네;;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거의 기존의 프레임워크에 내가 추가하는 느낌이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제? 왜? 어디에?? 넣어야 하는거냐가 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 어플케이션 인스턴스에 메시지 큐도 있고 큐에서 퍼올리는 메시지 루프도 있는데 이 어플리케이션의 윈도우가 여러개 있을 수 있다. 여기서 문제는 각 윈도우에 여러 코드를 넣었다고 하자. 이 모든 처리기(윈도우)가 있는데 이 루프로 부터 콜백되는데 WN_Commend가 왔다고 하자. 여러 윈도우중에 어디에 넣어야 하는지 고민해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 메시지들이 윈도우들을 돌아다닌다. 그게 라우팅이다. 와 진짜 복잡하네&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지도 MFC 프레임 라우팅 순서에 의해 정해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처] : &lt;a href=&quot;https://www.youtube.com/watch?v=t83eU1Z3Xzg&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&amp;amp;index=5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=t83eU1Z3Xzg&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&amp;amp;index=5&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT잡다/MFC</category>
      <category>널널한 개발자tv #mfc</category>
      <author>leeyk2121</author>
      <guid isPermaLink="true">https://leeyk2121.tistory.com/5</guid>
      <comments>https://leeyk2121.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 16 Jan 2025 00:34:04 +0900</pubDate>
    </item>
    <item>
      <title>MFC(3)-HelloWorld Win32 API 버전 코드 분석</title>
      <link>https://leeyk2121.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MFC와 유사한 Win32 API 코드 분석을 해보자. 절대 깊이 분석하지는 말자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccTYcZ/btsLOoUjoWh/8yMGAQLxGumuMaCO658kSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccTYcZ/btsLOoUjoWh/8yMGAQLxGumuMaCO658kSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccTYcZ/btsLOoUjoWh/8yMGAQLxGumuMaCO658kSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccTYcZ%2FbtsLOoUjoWh%2F8yMGAQLxGumuMaCO658kSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;191&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;wWinMain&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 API에서는 wWinMain()이 어플리케이션의 시작이다. 이 함수가 return 하면 종료된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wWinMain이 시작하자 마자 class 등록을 한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MyRegisterClass&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cK5wzW/btsLM5IngMX/gLjSQHuejr7Walz6i44wQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cK5wzW/btsLM5IngMX/gLjSQHuejr7Walz6i44wQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cK5wzW/btsLM5IngMX/gLjSQHuejr7Walz6i44wQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcK5wzW%2FbtsLM5IngMX%2FgLjSQHuejr7Walz6i44wQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;177&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우라고 하는 것은 몇몇 속성들을 가지고 있다. 속성 중에 class가 있다. 여기서 윈도우 class는 종류라고 생각하면된다. 컴퓨터 언어의 class와는 전혀 다르다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 생긴 윈도우(창)는 자신만의 고유 종류를 OS에 등록하게 된다. 이때 등록하려면 다양한 정보를&amp;nbsp; 제공해야한다. 해당 작업이 끝나면 어플리케이션 초기화를 수행한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccM89s/btsLMtDeFCM/WndReX7HN1Ynmrl7pOW2Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccM89s/btsLMtDeFCM/WndReX7HN1Ynmrl7pOW2Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccM89s/btsLMtDeFCM/WndReX7HN1Ynmrl7pOW2Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccM89s%2FbtsLMtDeFCM%2FWndReX7HN1Ynmrl7pOW2Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;122&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;InitInstance&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS 오피스를 사용한다고 하자. 이거를 설치하고 난 후에 사용을 한다. 즉 실행을 할 것이다. 설치는 한번만 하지만 실행은 여러번 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 실행해서 하나의 프로세스로 잡혀가지고 작업 관리자에 뜨게 될 것이다. 즉 여러 문서 프로그램이 뜨면 각각의 프로세스의 관리적 측면에서의 초기화를 실행하는 것이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;While()&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFWck/btsLM7zpKjW/B53WJhdtrvfCEuDPGTuQJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFWck/btsLM7zpKjW/B53WJhdtrvfCEuDPGTuQJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFWck/btsLM7zpKjW/B53WJhdtrvfCEuDPGTuQJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFWck%2FbtsLM7zpKjW%2FB53WJhdtrvfCEuDPGTuQJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;170&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 Main Message Loop이다. Message Queue가 나오게 된다. 모든 메시지 루프가 하는일은 큐에서 하나씩 메시지를 인출해서 처리 즉&amp;nbsp; Call back 한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MSG msg&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XP0QA/btsLMG9W4ta/eqS5OSVyGSHMyOGmYzP2tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XP0QA/btsLMG9W4ta/eqS5OSVyGSHMyOGmYzP2tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XP0QA/btsLMG9W4ta/eqS5OSVyGSHMyOGmYzP2tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXP0QA%2FbtsLMG9W4ta%2FeqS5OSVyGSHMyOGmYzP2tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;146&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Message Queue 에서 message를 한개 꺼내와서 while의 구조체에 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DispatchMessage&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지의 Callback이 일어난다. 그 후 처리가 일어나고 프로그램이 끝날때까지 계속 반복한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;MyRegisterClass&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXQsSf/btsLMHVuF8N/x0fAdpTXIJodq8lUe65fa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXQsSf/btsLMHVuF8N/x0fAdpTXIJodq8lUe65fa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXQsSf/btsLMHVuF8N/x0fAdpTXIJodq8lUe65fa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXQsSf%2FbtsLMHVuF8N%2Fx0fAdpTXIJodq8lUe65fa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;265&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lpfnWndPorc가 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;callback&amp;nbsp;처리를&amp;nbsp;담당할&amp;nbsp;함수&amp;nbsp;주소가&amp;nbsp;등록된다.&amp;nbsp;즉&amp;nbsp;Call&amp;nbsp;back&amp;nbsp;될&amp;nbsp;함수이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WndProc&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLc7Xz/btsLONzszsY/GeVYKNGecU17dRaI1goXYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLc7Xz/btsLONzszsY/GeVYKNGecU17dRaI1goXYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLc7Xz/btsLONzszsY/GeVYKNGecU17dRaI1goXYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLc7Xz%2FbtsLONzszsY%2FGeVYKNGecU17dRaI1goXYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;528&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 Message는 unsinged int 이다. 스위치 케이스를 잔뜩 있다. 그때마다 32bit 파라미터가 최대 두개씩 넘어온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들은 call back 된다. 언제? DispatchMessage가 돌아갈때이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 스위치 케이스에 들어가는 message들은 200개가 넘어간다.. 전부다 외울 필요는 없다..&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WM_COMMAND&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 창에 있는 버튼이나 메뉴같은거 고르면 발생하는 메시지-&amp;gt; 뭐가 눌리거나 선택됐는지 확인&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WM_PAINT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링 관련된거다..&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WM_DESTROY&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우가 화면에 보이고 해당 윈도우 창의 닫기 버튼을 누르면 WM_CLOSE 가 들어온다. 이는 화면에서 안보이게 하고 DESTORY가 와야 완전히 종료된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PostQuitMessage로 인해 WM_QUIT가 발생한다. QUIT가 발생하면 while문이 false return을 하여 끝나고 종료가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처]&lt;a href=&quot;https://www.youtube.com/watch?v=V9nwIepvPWc&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&amp;amp;index=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=V9nwIepvPWc&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&amp;amp;index=4&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT잡다/MFC</category>
      <category>널널한 개발자 tv</category>
      <author>leeyk2121</author>
      <guid isPermaLink="true">https://leeyk2121.tistory.com/4</guid>
      <comments>https://leeyk2121.tistory.com/4#entry4comment</comments>
      <pubDate>Tue, 14 Jan 2025 23:25:57 +0900</pubDate>
    </item>
    <item>
      <title>MFC(2) - Visual Studio Community 2022 설치 &amp;amp; 개발환경</title>
      <link>https://leeyk2121.tistory.com/3</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C6qlB/btsLNvZVioB/DCnIyvEADtCGID9wZ5Edy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C6qlB/btsLNvZVioB/DCnIyvEADtCGID9wZ5Edy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C6qlB/btsLNvZVioB/DCnIyvEADtCGID9wZ5Edy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC6qlB%2FbtsLNvZVioB%2FDCnIyvEADtCGID9wZ5Edy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;313&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 창에 visual studio installer에 들어간다. 이미 2022년이 깔려져 있으므로 추가 패키지 다운을 위해서 수정을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kjx59/btsLKMCPvSr/ZhKPQ8XGgEtxYnhioDjAx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kjx59/btsLKMCPvSr/ZhKPQ8XGgEtxYnhioDjAx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kjx59/btsLKMCPvSr/ZhKPQ8XGgEtxYnhioDjAx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKjx59%2FbtsLKMCPvSr%2FZhKPQ8XGgEtxYnhioDjAx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1245&quot; height=&quot;649&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;649&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MFC 개발을 위해서는 'C++을 사용한 데스크톱 개발'을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjTOUj/btsLLT81bO8/RYRkEz3x0C5QdScCRXBJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjTOUj/btsLLT81bO8/RYRkEz3x0C5QdScCRXBJtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjTOUj/btsLLT81bO8/RYRkEz3x0C5QdScCRXBJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjTOUj%2FbtsLLT81bO8%2FRYRkEz3x0C5QdScCRXBJtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;430&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 중요!! 최신 v143 빌드 도구용 c++ MFC 선택!!! 노란색으로 칠한 것들도 다 선택합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이떄 파란색은 옵션이기는 하나 나중에 API+MFC를 활용하는 프로젝트가 생기면 유용하므로 선택하는 것을 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고로 visual studio의 개발 설정은 visual c++이여야 한다. 한번 확인하는 것을 추천합니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB8T64/btsLMKDvMUw/UDLW1TpNt217QgvVPoZxnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB8T64/btsLMKDvMUw/UDLW1TpNt217QgvVPoZxnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB8T64/btsLMKDvMUw/UDLW1TpNt217QgvVPoZxnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB8T64%2FbtsLMKDvMUw%2FUDLW1TpNt217QgvVPoZxnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;667&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VuSDl/btsLMqyBswb/waXGGj1Nq7qHixjax3Chjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VuSDl/btsLMqyBswb/waXGGj1Nq7qHixjax3Chjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VuSDl/btsLMqyBswb/waXGGj1Nq7qHixjax3Chjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVuSDl%2FbtsLMqyBswb%2FwaXGGj1Nq7qHixjax3Chjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;713&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 앱 클릭하고 저장소 위치랑 앱 이름 정하면 끝!!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발환경&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwZfwA/btsLM60nuMw/nweplHSoY8XTPfo3w0esh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwZfwA/btsLM60nuMw/nweplHSoY8XTPfo3w0esh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwZfwA/btsLM60nuMw/nweplHSoY8XTPfo3w0esh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwZfwA%2FbtsLM60nuMw%2FnweplHSoY8XTPfo3w0esh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;719&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP8zK9/btsLMcgb6aG/Hj0xNMy1NE8XOdhxFOVsvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP8zK9/btsLMcgb6aG/Hj0xNMy1NE8XOdhxFOVsvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP8zK9/btsLMcgb6aG/Hj0xNMy1NE8XOdhxFOVsvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP8zK9%2FbtsLMcgb6aG%2FHj0xNMy1NE8XOdhxFOVsvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;378&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글꼴 바꾸기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구 - 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경-&amp;gt; 글꼴 및 색 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ysWay/btsLL5gY0ro/sf8YXEGPgw8i6UkvxAlHDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ysWay/btsLL5gY0ro/sf8YXEGPgw8i6UkvxAlHDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ysWay/btsLL5gY0ro/sf8YXEGPgw8i6UkvxAlHDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FysWay%2FbtsLL5gY0ro%2Fsf8YXEGPgw8i6UkvxAlHDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;476&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 편집기, 출력 창, 호출 스택 창 이렇게 3가지를 Consolas로 변경했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;중단점(F9)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 디버깅 하는 도중 원하는 지점에 멈추게 하고 싶으면 중단점을 사용하면 된다. 방법은 간단하다. 멈추길 원하는 코드에 커서를 가져다 놓고 f9를 누르거나 라인 번호 기준 왼쪽 부분을 누르면 빨간 점이 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAwyR8/btsLMVkva2c/RRr9f6Swpegw5FGUuLxkd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAwyR8/btsLMVkva2c/RRr9f6Swpegw5FGUuLxkd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAwyR8/btsLMVkva2c/RRr9f6Swpegw5FGUuLxkd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAwyR8%2FbtsLMVkva2c%2FRRr9f6Swpegw5FGUuLxkd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;205&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 F5를 눌러보자&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F5 디버깅&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅이 시작된다. 이때 준비해야하는게 디버그 -&amp;gt; 창 -&amp;gt; 메모리 -&amp;gt; 메모리 1을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이래와 같이 실시간으로 메모리가 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상태로 계속 F5를 누르면 프로그래밍 종료된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 Ctrl+F5는 디버깅 없이 바로 프로그램을 시작한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lAVmt/btsLLSWBetf/z2nULsawhTevKyCJtmgt20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAVmt/btsLLSWBetf/z2nULsawhTevKyCJtmgt20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAVmt/btsLLSWBetf/z2nULsawhTevKyCJtmgt20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAVmt%2FbtsLLSWBetf%2Fz2nULsawhTevKyCJtmgt20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;249&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;[출처] &lt;a href=&quot;https://www.youtube.com/watch?v=tkWo4-kwle4&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&amp;amp;index=2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=tkWo4-kwle4&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&amp;amp;index=2&lt;/a&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT잡다/MFC</category>
      <category>널널한 개발자 tv</category>
      <author>leeyk2121</author>
      <guid isPermaLink="true">https://leeyk2121.tistory.com/3</guid>
      <comments>https://leeyk2121.tistory.com/3#entry3comment</comments>
      <pubDate>Mon, 13 Jan 2025 23:11:37 +0900</pubDate>
    </item>
    <item>
      <title>MFC(1)</title>
      <link>https://leeyk2121.tistory.com/2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서만 실행되는 응용 프로그램&amp;lt;-MFC or Win 32 API로 제작해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Message Driven 방식을 채택하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Message Driven&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Event 대기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 Human Input Device(HID)로 발생시킨다. (EX, 마우스, 키보드 등등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 하드웨어 장치를 구경하면 운영체제가 하나의 이벤트로 인식하고 대기시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Event 수신&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS가 Event 수신해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Message 발생&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS가 거기에 대응하는 메시지( 부호가 없는 정수 )로 변환시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Message를 수신해야할 Window 처리기(함수) 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제가 해당&lt;b&gt; 처리기 함수를 CallBack 한다&lt;/b&gt;(중요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 만들어서 등록을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 등록된 함수가 적정한 시점 즉 어떤 메시지가 불렸을 때 알아서 함수가 불러집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 메시지 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 호출된다! 그러면 코드가 실행된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드가 끝나면 Event 대기로 돌아가면서 해당 루프를 무한 반복한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 Message Loop라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 응답없음 창이 떴다고 하자. OS가 어떤 이벤트가 났길래 Message로 만들어서 처리기를 검색해서 Callback했는데 return을 안한다? 이를 응답없음이라고 판단한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외우자!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 GUI 기반 어플리케이션은 이와 유사한 방식을 채택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처]&lt;b&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZUGbkZVXMA4&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=ZUGbkZVXMA4&amp;amp;list=PLXvgR_grOs1CyJDnWeUTqbmKG1VFQM72e&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>IT잡다/MFC</category>
      <category>널널한 개발자 tv</category>
      <author>leeyk2121</author>
      <guid isPermaLink="true">https://leeyk2121.tistory.com/2</guid>
      <comments>https://leeyk2121.tistory.com/2#entry2comment</comments>
      <pubDate>Mon, 13 Jan 2025 22:09:20 +0900</pubDate>
    </item>
    <item>
      <title>CI/CD</title>
      <link>https://leeyk2121.tistory.com/1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;CI/CD&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CI(Continuous Integration)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지속적인 통합의 약자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버그 수정이나 새로 만드는 기능들이 주기적으로 main repository에 빌드되어서 merge되는 것을 말한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발자들은 코드 변경사항을 main repository에 주기적으로 빈벅하게 merge 해야 한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 기능을 개발하는 여러 개발자가 시간이 흐른 후 해당 기능을 merge할 경우 merge error를 잡느라 많은 시간을 허비 할 수 있기 때문이다. 그렇기 때문에 새로운 기능을 구현할 때 해당 기능을 작은 단위로 나누어서 개발하고 통합해 나아가야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주기적으로 merge될 코드의 변경사항이 자동으로 빌드되어서 코드 변경사항 이후에도 빌드가 성공적으로 확인이 되어야 하고 새로 추가된 코드 변경사항 뿐만 아니라 해당 코드가 기존 코드에 에러를 일으키는지 테스트 까지 되어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 CI 스크립트를 통해 추가된 코드와 함께 &lt;b&gt;빌드&lt;/b&gt;가 되고 유니테스트 등을 통해 실행되어 &lt;b&gt;테스트&lt;/b&gt;가 잘되어야 나중에 배포할때 반영이 될 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주기적으로 merge를 하기 때문에 충돌을 피하여 생산성이 높아지고 코드의 결함이나 문제점이 빠르게 발견될 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;CD(Continuous Delivery&amp;amp; Deployment)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지속적인 제공 또는 지속적인 배포로 사용되는 경우도 있다. 이 둘 모두 어떻게 하면 배포를 자동화해서 만들 수 있는지를 고민하는 단계이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Continuous Delivery&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CI를 통해서 주기적으로 빌드가 되고 테스트가 되었고 이것을 배포할 준비과정을 release라고 한다. 이러한 release를 검증을 하고 &lt;b&gt;수동적으로 배포하는 것&lt;/b&gt;을 continuous delivery라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Continuous Deployment&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;release가 준비되자 마자 자동으로 사용자에게 배포할 수 있으며 이러한 모든 과정을 자동화 한 것이 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;continuous&lt;span&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Deployment라고 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;출처:&lt;a href=&quot;https://www.youtube.com/watch?v=0Emq5FypiMM&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=0Emq5FypiMM&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>IT잡다</category>
      <category>ci/cd 기본</category>
      <category>출처:드림코드</category>
      <author>leeyk2121</author>
      <guid isPermaLink="true">https://leeyk2121.tistory.com/1</guid>
      <comments>https://leeyk2121.tistory.com/1#entry1comment</comments>
      <pubDate>Tue, 7 Jan 2025 00:20:39 +0900</pubDate>
    </item>
  </channel>
</rss>