2012-09-18 3 views
0

시작하려면 여기에 제공된 문서의 설명이 있습니다. 참고 :이 요구 사항을 충족하기 위해 기존 코드를 변경하면됩니다.Win32 : lParam을 CreateWindow에 전달하고 열려있는 창을 추적합니다.

데모와 같이 구성된 4 개의 창을 만들려면 코드를 변경하십시오. 사용자가 창을 닫을 때 열려있는 다른 창이 여전히있는 경우 프로그램을 죽이지 않습니다.

열린 창 수를 추적하고 (닫을 때 빼기) 사용자는 프로그램을 중지하기 위해 모두 닫아야합니다. 세계가 허용되지 않습니다. 통계는 허용되지 않습니다.

또한 프로그램은 lParam 및 CREATESTRUCT를 사용하여 개수를 초기화해야합니다.

Possible functions and structs: 

SetWindowLong() 
GetWindowLong() 
SetClassLong() 
GetClassLong() 
CREATESTRUCT 

이제 제가 끝났습니다. 나는 4 개의 필요한 윈도우를 열 수 있었고 하나의 윈도우를 닫음으로써 (WM_DESTROY 메세지를 보내는 것) 전체 프로그램을 종료하지는 않았다. 내가 혼란스러워하는 것은 lParam의 전달과 CREATESTRUCT의 사용이다. 나는 엑스트라 클래스로 설정하기 내가 만든 첫 번째 창의 lParam에로 전달할 변수를, 얻으려고

LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ 
    HDC  hdc; 
    PAINTSTRUCT ps; 
    RECT rect; 
    int number = GetClassLongPtr(hwnd, 0); 

    switch (message){ 
     case WM_CREATE: 
      if(number == 0){ 
       SetClassLongPtr(hwnd, 0, (LONG)((CREATESTRUCT*)lParam)->lpCreateParams); 
      } 
      number++; 
      return 0; 

     case WM_PAINT: 
      hdc = BeginPaint(hwnd, &ps); 

      GetClientRect(hwnd, &rect); 
      DrawText(hdc, TEXT("Unique yet the same!"), -1, &rect, 
        DT_SINGLELINE | DT_CENTER | DT_VCENTER); 

      EndPaint(hwnd, &ps); 
      return 0; 

     case WM_DESTROY: 
      number--; 
      if(number == 0){ 
       PostQuitMessage(0); 
      } 
      return 0; 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 

:

여기 내 wndproc.c입니다. 말이 돼? 여기 내 main.c를이다

INT WINAPI의 WinMain (HINSTANCE HINSTANCE, HINSTANCE hPrevInstance, PSTR szCMLine, INT iCmdShow) { 정적 TCHAR szAppName [] = TEXT ("HelloApplication"); HWND hwnd; MSG msg; WNDCLASS wndclass; LONG * 수;

wndclass.style  = CS_HREDRAW | CS_VREDRAW; 
wndclass.lpfnWndProc = HelloWndProc; 
wndclass.cbClsExtra = 5; 
wndclass.cbWndExtra = 0; 
wndclass.hInstance = hInstance; 
wndclass.hIcon  = LoadIcon (NULL, IDI_APPLICATION); 
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); 
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); 
wndclass.lpszMenuName = NULL; 
wndclass.lpszClassName = szAppName; 


if (!RegisterClass (&wndclass)){ 
    MessageBox (NULL, TEXT ("This program requires Windows 95/98/NT"), 
       szAppName, MB_ICONERROR); 
    return 0; 
} 

hwnd = CreateWindow(szAppName,  
        TEXT("Hello World for Windows"), 
        WS_OVERLAPPEDWINDOW,  
        100,   
        50,  
        400,   
        300,   
        NULL,    
        NULL,   
        hInstance,   
        count = 0); 
ShowWindow(hwnd, iCmdShow); 
UpdateWindow(hwnd); 

아무 도움이됩니다; 나는 이미 내 수업에서이 정보에 대해 퀴즈를 썼으며 이해하지 못했습니다. 내 자신의 이해를 위해서만이 질문을 게시하고 있습니다.

감사합니다.

+0

이 작업을 수행하는 일반적인 방법은'PostQuitMessage입니다 가정으로 그 중 하나가 닫을 때

()'종료되는 나머지. – Deanna

+0

퀴즈의 요점은 최종 창이 닫힌 경우에만 PostQuitMessage()가 전송되도록하는 것이 었습니다. – CallumStyan

답변

1

동일한 창 클래스의 창 (인스턴스) 수를 계산해야하므로 필요한 카운터는 창 클래스의 정적 데이터 멤버로 볼 수 있습니다.

목표는 창 클래스에 몇 가지 추가 데이터 (여기서는 정수 카운터)를 추가하는 것입니다. 이렇게하려면이 추가 데이터를 할당하도록 창에 알릴 필요가 있습니다. 올바른 값을 RegisterClass()으로 전달하면됩니다. 필요한 카운터의 경우 RegisterClass()에 전달되는 참조가 WNDCLASS 유형의 구조의 멤버 cbClsExtra을 정수 카운터의 크기로 설정합니다.

메시지 디스패처의 콜백 메소드에서 Windows 클래스의 정적 데이터 (및 정수 카운터 포함)에 액세스하려면 GetClassLongPtr()을 사용하십시오. 나는 이것이 내가 운동과 게임의 나머지 부분을 남겨 숙제 ... ;-)

+0

내 Win32 클래스의 퀴즈에서 나온 것입니다. 내 자신의 노하우를 위해서입니다. 정보 주셔서 감사합니다! – CallumStyan

+0

그들은 요즘 퀴즈가되기 위해 시험을 부릅니다 ... - >> @ user1440612 – alk

+0

퀴즈에는 어떤 의미인지 확실하지 않습니다. 우리 반의 2 명만이 선생님이 원했던 방식대로 작동하도록했다고 생각하면 안전하다고 말할 수 있습니다. – CallumStyan

1

SetClassLongPtr -이 기능은 창의 클래스와 관련된 메모리에서 작동합니다. 이것은 본질적으로 정적 변수입니다. 실제로 열린 창문의 간단한 정적 카운터가 있습니다. 그냥 연기가 자욱한 스크린 아래에 숨겨져 있습니다.

기술적으로 C/C++ 시점에서 카운터는 static/global variable이 아닙니다. 그러나 개념적 관점에서 보면 - 그렇습니다.

lParam 및 CREATESTRUCT는 여기에서 중요하지 않습니다.

+0

그렇다면 내가하고있는 일이 어떻게 돌아 가지 않았을까요? 열려있는 창을 추적하는 변수로 클래스 ptr을 사용했습니다. – CallumStyan

+0

코드 정리 (모든 불필요한 항목 제거), 윈도우 클래스 데이터 할당, inc/dec 변수 지정 등이 가능합니다. –

1

잘못된 것, 안경은 아무것도하지 않습니다!

당신은 CreateWindowEx에 자동 변수를 전달하고, 당신은을 할당 할 수 없습니다 (오히려 당신이 실제로 전달하는 값보다) 그 변수의 주소
  • 통해 올 기대할 수 없다
    • 값을 자동 변수 ( int number = GetClassLongPtr (hwnd, 0);)로 변경하고 해당 변수를 변경하고 변수가 지속될 것으로 예상하십시오.한마디로

    : 당신이 거기에 저장된 값을 변경

  • 당신이해야 할 수도 있습니다을하고자 할 때

    • 그 포인터 역 참조 CreateWindowEx에없는 값
    • 을 포인터를 전달 pointers에 대한 지식을 새로 고침합니다.

    +0

    예, 가능합니다! 정보 주셔서 감사합니다. – CallumStyan

    관련 문제