2013-05-12 3 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

Кнопка фактически разрушена, вы просто не можете ее увидеть. Это потому, что вы слишком быстро перестали программировать, вы не реализовали никакого кода рисования. Что вам нужно сделать, поскольку вы установите для члена WNDCLASS.hbrBackGround значение NULL, поэтому обработчик сообщений по умолчанию не может ничего полезного, когда обрабатывает сообщение WM_ERASEBKGND.

Простым обходным путем является использование кода шаблона, который вы найдете в любом учебнике или книге о программировании Windows. Укажите кисть для фона окна:

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

В коде есть много чего другого. Прочитайте Программу программирования Петцольда, если вы хотите написать такой код.

+0

привет, спасибо за ваш ответ. Я посмотрю больше об этом – joelyboy94

Смежные вопросы