티스토리 뷰

Win32(API)

[win32 API] cbClsExtra 등

열혈허슬러 상추님 2019.07.03 11:03

190628(5일차)

정처기 시험준비하느라 수업을 잘 듣지 못한 날.
 
  • 복사생성자
    처음 초기화를 복사로 함.
  • 복사 대입 연산자
    원래 만들어진 곳에 대입 (참조면 delete 필요)
 
  • 개체는 독립성을 가져야한다.
 
복사 생성자의 원형
    String(const String& arg) {
 
    }
 
DrawText(hdc, msg, -1, &rt, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
 
GetClientRect(hwnd, &rt)
 

 
윈도우의 생성정보를 유지하는 메모리 블록이 있다.
메모리 블록을 컨트롤 하는 것이 핸들.
사용자가 메모리 블럭을 만들어 낼 수 있다. (각 윈도우 마다 만들 수 있다.)
 
cbClsExtra 를 사용하면 된다.
또는 cbClsExtra.
 
WndClass.cbWndExtra = 4; // 4byte의 메모리 블럭을 만든다. (16byte 이하로 지정하라고 권장된다.)
 
네모박스를 치는 예제에서 누른 윈도우의 눌림상태를 보관하기 위해서 이방법을 쓰기로한다.
(같은 프로시저의 스테틱 변수를 공유하여 사용하기 때문에 이런 문제가 발생한다.)
 
setWindowLong() 으로 Extra메모리를 설정하자. 
setWindowLong(
    hwnd, 
    0, //Extra 를 참조하겠다.
    false //이 값을 갖도록 한다.
);
 
자신의 익스트라 메모리를 읽어오자
getWindowLong()
getWindowLong(
    hwnd,
    0 //extra 메모리
); 이렇게 하면 extra메모리가 반환된다.
 
그리고 나서 setWindowLong() 으로 다시 값을 갱신해준다.
 
이후 WM_PAINT 메세지 내부에서 if문의 조건으로 getWindowLong(hwnd, 0) 을 가져와서 사용한다.
그러면 각각 윈도우 마다 가진 눌림상태값을 가져와서 X를 그리거나 없앤다.
 
프로젝트를 작성할 때는 추상적으로 작성하는 것이 좋다.
 
다음 방법으로는 map을 사용하여 key-value 형태로 눌림상태값을 저장하는 방법입니다.
static map<string, bool> globalMap;
(내부적으로는 레드 블랙 이진 트리로 구성이 되어 있다.)(?)
 
bool 을 지금은 쓰지만 이후 어떤 형이 들어갈지 모른다.
 
전역변수를 없애고 맵을 사용해보자. (결론 적으로는 글로벌 맵만 남는다.)
(결국 맵을 사용하므로 키를 알아야하기 때문에 명확해진다.)
static map<string, Data*> globalMap;
struct Data{
    
};
struct BoolData : public Data{
    bool drawX;
    BoolData() :drawX(false){ }
};
struct InstData: public Data{
    HINSTANCE hInst;
    BoolData(HINSTANCE hInst) :hInst(hInst){ }
};
...
globalMap["Instance"] = new InstData(hInstance);
댓글
댓글쓰기 폼