'Programming/Win32 API'에 해당되는 글 8건

  1. 2010.07.25 큐메세지
  2. 2010.07.07 비큐 메세지
  3. 2010.07.07 윈도우열거
  4. 2010.07.07 윈도우 스타일 변경
  5. 2010.07.07 RegisterClass()와 RegisterClassEx()
  6. 2010.07.07 SetWindowLong()
  7. 2010.07.07 SetClassLong()
  8. 2010.07.07 API 기본 윈도우 생성
2010. 7. 25. 18:48

사용자가 윈도우를 생성하거나 메모장같은 프로그램을 실행 해서 마우스나 키보드를 치게되면 마우스는 우리의 컴퓨터에게
전기적인 인터럽트 신호를 보낸다. 이신호는 결국 CPU가 받게되고.  CPU는 번호와 함수조소를 갖고있는 테이블을 하나 만든다.
이 테이블에는 몇번 인터럽트는 누가 처리하겠다는 정보를 담고 있다. 이테이블을 IDT(Interrupt Discript Table)라 한다.
이테이블에서 마우스번호에 해당하는 함수를 따라가다 보면 마우스드라이버가 있고 이 마우스드라이버는 발생된 메세지를
큐에다가 넣는다. 이 큐가 SHIQ(System Hardware Input Queue)이다. 

OS안에는 RIT(Raw Input Thread) 는 스레드가 있는데 가장 낮은 레벨의 입력을 처리한다.
또 OS에는 각 프로그램마다 큐를 갖고 있는데,  이 RIT가 SHIQ에서 메세지를 하나씩 꺼내와서 각 프로그램의 큐에 전달해 준다.

이 프로그램의 큐에서 메세지를 꺼내는 함수가 GetMessage()이다.

다음은 이과정을 그림으로 표현한 것이다.





'Programming > Win32 API' 카테고리의 다른 글

비큐 메세지  (0) 2010.07.07
윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:15

WinMain()에서 윈도우를 만들기 위해서는 CreateWindow()함수를 사용하게 된다(user32.dll에 있다.)
CreateWindow()함수 안에서는 윈도우를 관리하기 위해 WND32라는 구조체를 만들게 되고 이 구조체에 번호를 부여한다.
이것이 핸들이다. 그리고 핸들을 리턴 한다.

그런데 CreateWindow()는 윈도우를 만들고, 핸들을 리턴하기 전에 정상적으로 윈도우를 만들었다고 사용자에게 보고를 한다.
보고를 하는 방법은 윈도우를 만들때 WNDCLASS구조체를 먼저 등록하게 되는데 WNDCLASS의 속성중에  
lpfnwndproc(메세지처리함수)에 등록된 함수를 호출 하는 것이다.

이때 lpfnwndproc에 등록된 함수에서는 윈도우가 만들졌다고 WM_CREATE(1) 메세지를 받게되고.
윈도우가 파괴될 경우 WM_DESTORY(2)를 받게된다.

이러한 과정이 이루어지면서 큐라는 개념이 없고 메세지 처리함수를 직접 호출하기 때문에 이것을 비큐 메세지라고 한다.

아래 그림은 지금까지의 과정을 표현한 것 이다.

'Programming > Win32 API' 카테고리의 다른 글

큐메세지  (0) 2010.07.25
윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:14

윈도우를 열거 하고 싶을때는 EnumWindows()함수를 사용하면 된다.
윈도우를 찾을때마다 EnumWindows()의 인자로 넘어간 함수가 호출되게 된다.

다음은 EnumWindows()함수의 예제이다.

int CALLBACK foo( HWND hwnd, LPARAM param )
{
     if ( IsWindowVisible(hwnd ) == FALSE ) return 1;         // 보이지 않는 윈도우는 출력하지 않는다.
     if ( GetWindowTextLength( hwnd ) == 0 ) return 1;       // 캡션 문자열이 없으면 출력 하지 않는다.
     if ( GetParent( hwnd ) != 0 ) return 1;                         // 자식윈도우는(부모가 있다면) 출력하지 않는다.
  
     // 작업관리자는 자신의 윈도우와 바탕화면을 제외한다.

    TCHAR name[256];
    TCHAR title[256];
    GetClassName( hwnd, name, 256 );
    GetWindowText( hwnd, title, 256 );

    
    _tprintf(_T("HWND : %x, %s - %s\n"), hwnd, name, title );

     return 1; // 계속 열거하라는 의미.
}

int main()
{
     EnumWindows( foo,  // 윈도우를 찾을때 마다 이 함수를 호출해달라.
                            0 );   // 위함수로 보낼 인자.
}

'Programming > Win32 API' 카테고리의 다른 글

큐메세지  (0) 2010.07.25
비큐 메세지  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:13

OS는 모든 윈도우를 관리하기 위해 구조체를 만들게 된다. 이 구조체를 WND32구조체라 하고 이 구조체에 접근하는 함수가
32비트일 경우 SetWindowLong(), GetWindowLong()이고, 64비트 일경우 SetWindowLongPtr(), GetWindowLongPtr()이다.
이 함수를 통해서 윈도우의 스타일을 변경 할 수 있다.

윈도우의 스타일을 변경하려면 해당 윈도우의 핸들을 알아야 하는데, 이는  FindWindow()함수를 써서 핸들을 얻어 올 수 있다.
얻어온 핸들로 위에서 얘기한 함수를 이용해서 스타일을 변경했다고 해도 보여주지 않으면 아무 소용이 없다.

그래서 SetWindowPos()함수를 이용하면 변경된 스타일의 윈도우를 사용자에게 보여줄 수 있다.

여기서 ShowWindow()함수를 써서 보여줄 수도 있는데 이 함수는 안보이는 윈도우를 보여줄 때 사용한다. 기존에 있는 윈도우를
보여주기 위해선 SetWindowPos()함수를 써서 강제적으로 다시 그려야 한다.

다음은 계산기를 실행해서 스타일을 강제로 변경하는 예제이다.
계산기를 먼저 실행하고, 이 프로그램을 실행후 아무키나 누르면 스타일이 변경된다.

void ModifyStyle( HWND hwnd, UINT add, UINT remove )
{
     // 기존의 스타일을 얻어 온다. 
     UINT style = GetWindowLongPtr( hwnd, GWL_STYLE );
 
     // 스타일을 조작 한다.
     style = style | add;
     style = style & ~ remove;
 
     // 변경된 스타일을 넣는다.
     SetWindowLongPtr( hwnd, GWL_STYLE, style );

     // 스타일을 변경한 경우 윈도우를 다시 그리게 해야 한다.
     SetWindowPos( hwnd,                             // 변경할 윈도우 핸들.
                            0,                                    // 윈도우의 겹치는 순서를 정한다.
                            0, 0,                                // x좌표, y좌표.
                            0, 0,                                // 넓이, 높이. 
                            SWP_NOMOVE |              // 윈도우를 움직이지 않겠다.(3,4번째 파라미터가 무시된다.)
                            SWP_NOSIZE   |              // 윈도우 사이즈를 변경하지 않겠다.(5,6 번째 파라미터가 무시된다.)
                            SWP_NOZORDER |           // 2번째 파라미터가 무시된다.
                            SWP_DRAWFRAME);         // 테두리를 다시 그린다.
}

int main()
{
    HWND hwnd = FindWindow( 0, _T("계산기"));

    getch();
    ModifyStyle( hwnd, WS_THICKFRAME, WS_CAPTION);
}

'Programming > Win32 API' 카테고리의 다른 글

비큐 메세지  (0) 2010.07.07
윈도우열거  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
SetClassLong()  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:12

윈도우 클래스를 등록할 때 WNDCLASS를 사용해서 만들었으면 RegisterClass()를 쓰고, WNDCLALSSEX를 사용해서 만들었으면 RegisterClassEx()를 써야 한다.

이렇게 해서 윈도우 클래스를 등록하면 이클래스를 보관해주는 곳이 있는데 이를 ATOM TABLE라고 한다.
등록에 성공했으면 ATOM TABLE의 인덱스를 넘겨준다.

사용법은 다음과 같다.

ATOM atom = RegisterClass(&wc);
if ( atom == 0 )
{
        MessageBox( 0,_T("실패"), _T(""), MB_OK);
        return 0;
}

'Programming > Win32 API' 카테고리의 다른 글

윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
SetClassLong()  (0) 2010.07.07
API 기본 윈도우 생성  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:05
윈도우를 만들려면 WNDCLASS라는 틀을 만들고, 이틀을 이용해서 만들어야 한다. 화면상에 보여지는 윈도우는 우리눈에만 보이는것 뿐이고 OS는 이를 관리하기 위해서 다시 구조체를 만들어야 한다. 이 구조체에 윈도우 관련정보를 모두 저장하고, 추가로 더 저장하려면 WNDCLASS의 cbWndExtra에 값을 지정해야 한다. 이때 추가로 지정한 만큼의 메모리가 더 잡히게 되고 이 기존의 메모리와 여분의 메모리에 접근하는 함수가 바로   SetWindowLong() 이다.

ex) SetWindowLong(hwnd, GWL_STYLE, style);

'Programming > Win32 API' 카테고리의 다른 글

윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetClassLong()  (0) 2010.07.07
API 기본 윈도우 생성  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:04

윈도우를 생성하려면 WNDCLASS 클래스를 생성해서 시스템에 등록을 해야 한다. 이때 쓰는 함수가 RegisterClass() 이다  

OS에는  WNDCLASS만 관리하는 구조체가 있다.  RegisterClass()를 하게 되면 WNDCLASS 의 모든 내용이 윈도우 클래스를 관리하는 구조체로 복사하게 된고. 이때 WNDCLASS클래스의 내용을 모두 보관하고 추가로 내용을 더 보관하고 싶으면 WNDCLASScbClsExtra값을 지정 해주면 된다. 그러면 지정한 만큼의 메모리가 추가가 된다.

이때 기존의 메모리와 여분의 메모리에 접근하는 함수가 바로 SetClassLong() 이다.

ex)
static HBRUSH Brush;
SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)Brush);

'Programming > Win32 API' 카테고리의 다른 글

윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
API 기본 윈도우 생성  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:02

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPTSTR lpCmdLine, int nShowCmd )
{
 //---------------------------------------------------------
 // 1. 윈도우 클래스 생성
 //---------------------------------------------------------
 WNDCLASS wc;
 wc.cbClsExtra    = 10;                                                   // 10 byte의 여분의 클래스 메모리 추가. 
                                                                                   // SetClassLong() 으로 접근가능.
 wc.cbWndExtra    = 0;                                                   // 여분의 윈도우 메모리 - SetWindowLong()으로 접근 가능.
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);      //  하얀색
 wc.hCursor       = LoadCursor( 0, IDC_ARROW );
 wc.hIcon   = LoadIcon( 0,   IDI_WINLOGO);
 wc.hInstance  = hInstance;
 wc.lpfnWndProc  = DefWindowProc; 
 wc.lpszClassName = _T("First");                                   // 클래스 이름
 wc.lpszMenuName  = 0;
 wc.style         = 0;

 //---------------------------------------------------------
 // 2. 윈도우 클래스를 시스템에 등록
 //---------------------------------------------------------
 ATOM atom = RegisterClass(&wc);
 if ( atom == 0 )
 {
  MessageBox( 0,_T("실패"), _T(""), MB_OK);
  return 0;
 }

 //---------------------------------------------------------
 // 3. 윈도우 만들기
 //---------------------------------------------------------
 HWND hwnd = CreateWindowEx( 0,                                      // WS_EX_TOPMOST  | WS_EX_LAYERED, 
                                                                                         // 확장 스타일
       _T("First"),                                                                   // 윈도우 클래스 이름.
       _T("Hello"),                                                                 // 윈도우 캡션 문자열
       WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,          // 윈도우 스타일
       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,                   // x, y, w, h(시스템 디폴트 -
                                                                                       // CreateProcess()에서 STARTUPINFO 구조체로 전달된
                                                                                       // 크기로 지정되게 된다.(시스템 시간에 설명)
       0,                                                                             // 부모 윈도우 핸들(번호)
       0,                                                                             // 메뉴 핸들(번호)
       hInstance,                                                                 // instance handle(exe 가상주소)
       0);                                                                            // 생성인자(WM_CREATE메세지의 lParam로 전달된다. 


 //---------------------------------------------------------
 // 4. 윈도우 보여주기
 //---------------------------------------------------------
 ShowWindow( hwnd, nShowCmd );                                 // WinMain 의 4번째 인자 전달 
                                                                                    // 제어판에서 모든 윈도우가 만들어 질때의 
                                                                                    //초기 모양을 지정할수 있다.
                                                                                    // 대부분 디폴트는 SW_SHOW 이다
 MessageBox( 0, _T("OK?"), _T(""), MB_OK);
 return 0;
}

'Programming > Win32 API' 카테고리의 다른 글

윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
SetClassLong()  (0) 2010.07.07
Posted by 어북어위크