2021. 8. 3. 09:41

어떠한 라이브러리나 직접 코드를 구현하여 버퍼에 이미지가 들어갔을 때 

 

MFC에서 출력하는 방법을 알아보자

2020. 11. 23. 20:50

윈도우 클래스는 통용되는 범위에 따라 세 가지 종류


등록 시기와 파괴 시기가 다름



1. 시스템 전역 클래스


운영 체제가 부팅될 때 등록


컨트롤을 만들 때 사용


button, edit, scrollbar, listbox


클래스 이름이 시스템에 의해 미리 정해짐


운영 체제가 직접 등록


응용 프로그램은 이 클래스를 등록할 필요가 없음


파괴할 수도 없음


시스템은 응용 프로그램이 실행될 때 시스템 전역 클래스의 복사본을 전달


button, edit 등이 이미 등록되어 있으므로 쓰기만 하면 됨


복사본을 사용해서 서브 클래싱 등의 방법으로 수정하더라도 다른 프로그램에 영향 안 줌


메뉴와 대화상자도 윈도우의 일종



2. 응용 프로그램 전역 클래스


주로 DLL에 의해 등록


프로세스의 모든 모듈에서 이 클래스를 사용


여러 프로그램이 공유해야 할 커스텀 컨트롤 을 만들 때 사용


DLL을 로드해서 이 클래스를 사용


클래스 스타일에 GS_GLOBALCALSS 스타일을 지정


comctl32.dll 에 의해 제공되는 공통 컨트롤


프로그래스, 트리 뷰, 리스트 뷰, 툴바 등


표준 컨트롤과는 달리 약간의 초기화 코드가 필요



3. 응용 프로그램 로컬 클래스


메인 윈도우나 차일드 또는 커스텀 컨트롤을 만들기 위해 프로그램 선두에서 등록하는 클래스


해당 프로그램 내부에서만 사용


윈도우 클래스를 등록한 프로그램이 종료되면  윈도우 클래스도 같이 파괴

2020. 11. 17. 11:46

모든 윈도우는 윈도우 클래스로부터 만들어진다


윈도우 클래스는 윈도우를 만들기 위한 형틀이며 생성될 윈도우의 여러가지 특징을 모아놓은 구조체이다


CreateWindow 함수는 첫 번째 인수로 전달된 윈도우 클래스로부터 만들고자 하는 윈도우의 특성을 알아내며 윈도우 클래스가 지정한 특성대로 윈도우를 만든다


CreateWindow 함수의 첫 번째 인수 lpszClassName은 지금 만들고자 하는 윈도우가 어떤 윈도우 클래스로부터 생성될 것인가, 즉 어떤 특성을 가지는 윈도우를 만들 것인가를 지정하며 생략할 수 없다


윈도우 클래스는 윈도우 생성에 꼭 필요한 정보가 있기 떄문에 윈도우 클래스 없이 윈도우를 생성하는 것은 불가능하다


button 윈도우 클래스로부터 만들어지는 윈도우는 버튼 컨트롤이 되고 First 윈도우 클래스로부터 만들어지는 윈도우는 First 윈도우가 된다


윈도우 클래스가 지정하는 윈도우의 특성에는 배경색, 커서, 아이콘 등 겉보기 모양을 지정하는 것도 있고 내부 동작들을 지정하는 것도 있는데 이 정보들 중에서 가장 중요한 것은 메시지 처리 방식을 지정하는 WndProc 함수이며 이 함수가 어떻게 작성되어 있는가에 따라 윈도우의 모양과 기능에 고유성이 부여된다


다른 말로 하면 같은 클래스로부터 만들어진 윈도우는 모양과 기능이 동일하다는 ㅁ뜻이다


프로그램 선두에서 WNDCLASS 구조체를 정의하고 RegisterClass 함수로 윈도우 클래스를 등록한 후 윈도우를 생성할 수도 있고, 아니면 "edit"나 "button"과 같이 운영체제에 미리 등록되어 있는 윈도우 클래스로도 윈도우를 생성할 수 있다


프로그램의 메인 윈도우를 만들기 위해서는 반드시 RegisterClass로 윈도우 클래스를 등록하고 CreateWindow로 윈도우를 생성하는 2단계를 거쳐야 한다


2단계로 윈도우 생성과정을 분리함으로써 하나의 윈도우 클래스로부터 여러 개의 똑같은 윈도우를 만들 수 있으며 운영체제가 미리 정해놓은 윈도우 클래스를 공짜로 쓸 수 도 있다


만약 윈도우 클래스라는 개념이 없으면 윈도우를 만들 때마다 배경색, 커서, 아이콘, 메시지 처리함수 등을 일일히 지정해야 할 것이며 CreateWindow 함수로 20개가 넘는 인수를 전달해야 하는데 이는 너무나도 귀찮은 작업이다




2020. 11. 17. 11:10

윈도우 : 프로그램이 출력 결과를 내보내고 사용자로부터 입력을 받아들이는 화면상의 사각 영역



세 가지 특징


1. 윈도우는 화면상에 존재한다


 - 메모리상에만 내부적으로 존재하는 것이 아니라 화면상에 나타나며 사용자의 눈에 보인다. 숨겨지거나 가려지거나 일시적으로 가시영역을 벗어나는 특수한 경우도 있지만 이 경우에도 당장 보이지 않을 뿐 여전히 화면상에 존재한다


2. 그 모양은 반드시 직사각형이다


 - 화면상의 좌상단 좌표를 가지고 높이와 폭이 있으며 각 변끼리 수직을 이룬다.

둥근 모양이나 세모 모양의 윈도우를 만들 수 있지만 이 경우도 나머지 부분이 투명할 뿐이지 결국은 직사각형이다


3. 윈도우는 독립적으로 사용자와 상호작용을 할 수 있다


실행 결과를 화면에 출력하거나 사용자로부터 입력을 받아들이기도 한다

윈도우가 상호작용한다는 말은 능동적인 동작을 한다는 얘기이며 메시지 처리 능력이 있다는 뜻이다. 즉 메시지 처리 함수인 WndProc을 가진다



예제들을 보면 모두 WinMain에서 CreateWindow 함수를 호출하여 윈도우를 만들고 있다

2020. 11. 11. 20:49

struct RPOCESS_INFORMATION

{

    HANDLE hProcess;     // 프로세스의 핸들

    HANDLE hThread;       // 스레드 핸들

    DWORD dwProcessId;  // 프로세스의 ID

    DWORD dwThreadId;    // 스레드 ID

};


운영체제는 프로세스를 생성할 때마다 프로세스들을 구분짓기 위한 ID를 할당


프로세스 핸들과 프로세스 ID의 차이점


프로세스의 핸들은 프로세스의 커널 오브젝트를 가리키기 위한 것이고,


프로세스 ID는 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위한 것이다




CreateProcess 함수를 통해서 프로세스를 생성하면 스레드라는 시스템 리소스도 더불어 생성된다


자세한 내용은 이후에 핸들 테이블에 관련된 내용을 공부하면 모호함이 사라진다

2020. 11. 10. 10:48

우리가 알고 있는 리소스는 프로세스 밖에 없기 때문에 프로세스에 관련된 커널 오브젝트 조작 함수들을 몇 가지 소개한다



* 프로세스의 우선순위(Priority) 변경


프로세스 우선순위를 높여보도록 하겠다


커널 오브젝트에 저장된 우선순위 정보를 변경시키는 것이다


BOOL SetPriorityClass(

    HANDLE hProcess,

    DWORD dwPriorityClass);



hProcess

2020. 9. 9. 15:19

WM_WINDOWPOSCHANGING 메세지를 재정의하여


다음과 같이 설정한다


void CUpdateDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)

{

CDialogEx::OnWindowPosChanging(lpwndpos);


// 다이얼로그를 처음부터 안 보여주기 위한 코드 추가

lpwndpos->flags &= ~SWP_SHOWWINDOW;

}



2019. 10. 30. 09:30

서비스는 운영체제에서 배경에서 실행되고 있는 프로그램을 말한다



2019. 9. 24. 19:44

Windows 10에서 Service Manager Control을 열 수 없을 때가 있다


Windows 10 자체 버그라고 한다


해결 방법은 레지스트리 편집기에서 다음 값을 수정한다


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OneSyncSvc


에서 Start 값을 2에서 4로 변경하면 된다

2019. 9. 18. 16:26


const int MAX_PATH(260);

char szPath[MAX_PATH];

GetCurrentDirectory(MAX_PATH, szPath);

2019. 3. 28. 19:54

다음과 같이 하면 된다

 

현재 지정한 폴더를 바로 여는 방법은 추후에 찾아서 올린다

2019. 3. 18. 10:41

도구 - 옵션 - 환경 - 키보드 - Visual C++ 6 로 설정

2018. 11. 16. 10:22



CWnd를 상속받아 CWnd를 그려주고 색상을 변경한다


그런데 일반 객체를 생성하면 윈도우가 안 그려지고


new를 이용하여 객체를 생성해야 OnDraw( ) 함수가 호출되어 그려진다


왜 그럴까?

2018. 8. 24. 11:08

트리에서 부모를 선택하면 자식 아이템 모두 선택 함수






트리에서 항목을 선택하는 함수



2018. 8. 23. 15:26

디버깅할 때 Break Point 가 걸리지 않고 하얀색으로 변경되면 


여러 가지 이유가 있지만 


PDB 파일이 생성되지 않을 때가 있다


그럴 때는 속성 창에서 다음과 같이 설정한다.



프로젝트 - 속성 - 링커 - 디버깅 - 디버그 정보 생성 - 예(/DEBUG)