1

使用 c++,我创建了一个具有“WNDCLASS”结构的窗口。然后,我再次将“CreateWindow”与系统类“按钮”一起使用,并将父句柄设置为已创建的窗口句柄。如何从窗口中删除此按钮?我曾尝试调用“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;
}
4

1 回答 1

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 };

您的代码中还有很多其他错误。如果您想编写这样的代码,请阅读 Petzold 的 Programming Windows。

于 2013-05-12T15:32:28.740 回答