2013-05-12 2 views
1

C++을 사용하여 "WNDCLASS"구조의 창을 만들었습니다. 그런 다음 "CreateWindow"를 시스템 클래스 "button"과 함께 다시 사용하고 이미 생성 된 창의 핸들에 부모 핸들을 설정합니다. 이 버튼을 창에서 어떻게 삭제할 수 있습니까? 나는 "DestroyWindow"함수를 호출하려고 시도했지만 아무 일도 일어나지 않습니다. 할 수 없다면 창을 완전히 지우고 버튼없이 모든 것을 다시 그릴 수있는 방법이 있습니까?창에서 버튼 제거

#include <Windows.h> 
#include <wchar.h> 
HWND clientwindow; 
RECT wr; 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 


    switch (message) 
    { 
     case WM_COMMAND: 
      DestroyWindow(clientwindow);  
      UpdateWindow(hWnd); 
      break; 
     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI wWinMain(HINSTANCE hInst,HINSTANCE,LPWSTR,INT) 
{ 

    WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0, 
        GetModuleHandle(NULL),NULL,NULL,NULL,NULL, 
        L"jjclass",NULL }; 


    wc.hCursor = LoadCursor(NULL,IDC_ARROW); 
     RegisterClassEx(&wc); 


    wr.left = 650; 
    wr.right = wr.left + 500; 
    wr.top = 150; 
    wr.bottom = wr.top + 500; 
    AdjustWindowRect(&wr,WS_OVERLAPPEDWINDOW,FALSE); 
     HWND hWnd = CreateWindowW(L"jjclass",L"my window", 
           WS_OVERLAPPEDWINDOW,wr.left,wr.top,wr.right-   wr.left,wr.bottom-wr.top, 
          NULL,NULL,wc.hInstance,NULL); 

     ShowWindow(hWnd,SW_SHOWDEFAULT); 

    clientwindow = CreateWindow(TEXT("BUTTON"),TEXT("BUTTON"),WS_VISIBLE |  WS_CHILD,100,100,100,100,hWnd,(HMENU)1,NULL,NULL); 

    UpdateWindow(hWnd); 

    MSG msg; 
    ZeroMemory(&msg,sizeof(msg)); 
    while(msg.message != WM_QUIT) 
    { 
     if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 




    } 
    UnregisterClass(L"jjclass",wc.hInstance); 
    return 0; 
} 
+2

예, DestroyWindow를 사용합니다. 코드 스 니펫을 게시하지 않으면 누구도 버그를 볼 수 없습니다. –

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 그것을 게시했다. 그리고 destroywindow를 사용했는데 아무 일도 일어나지 않았다. – joelyboy94

답변

3

버튼이 실제로 파괴 되어도 보이지 않습니다. 그것은 프로그래밍을 너무 빨리 중단했기 때문에 페인트 코드를 구현하지 않았기 때문입니다. WM_ERASEBKGND 메시지를 처리 ​​할 때 기본 메시지 처리기가 유용한 작업을 수행 할 수 없도록 WNDCLASS.hbrBackGround 멤버를 NULL로 설정 한 이후로해야 할 일.

간단한 해결 방법은 자습서 나 Windows 프로그래밍에 대한 책에서 찾을 수있는 상용구 코드를 사용하는 것입니다. 창 배경에 브러시를 지정하십시오.

WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0, 
       GetModuleHandle(NULL),NULL,NULL, 
       (HBRUSH)(COLOR_WINDOW+1),    // <=== NOTE 
       NULL, 
       L"jjclass",NULL }; 

코드에 다른 많은 문제가 있습니다. 이와 같은 코드를 작성하려면 Petzold의 Programming Windows를 읽으십시오.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 그것에 대해 더 자세하게 볼 것이다. – joelyboy94