Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/169.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WiAPAPI—C++如何在窗口中完成擦除/清除所有内容? 我在C++中使用WinAPI作为我的应用程序。我通过处理WM_PAINT消息在窗口中绘制了一些文本和位图。通过处理WM_CREATE消息,我还通过CreateWindow函数在窗口中放置了一些按钮控件。我花了好几个小时研究这个,但我没有运气-我如何才能完全清除窗口和它的所有内容我放在里面,所以我留下了一个空窗口与相同的背景标题,等等,所以我可以放更多的按钮和东西在它上面_C++_Winapi - Fatal编程技术网

WiAPAPI—C++如何在窗口中完成擦除/清除所有内容? 我在C++中使用WinAPI作为我的应用程序。我通过处理WM_PAINT消息在窗口中绘制了一些文本和位图。通过处理WM_CREATE消息,我还通过CreateWindow函数在窗口中放置了一些按钮控件。我花了好几个小时研究这个,但我没有运气-我如何才能完全清除窗口和它的所有内容我放在里面,所以我留下了一个空窗口与相同的背景标题,等等,所以我可以放更多的按钮和东西在它上面

WiAPAPI—C++如何在窗口中完成擦除/清除所有内容? 我在C++中使用WinAPI作为我的应用程序。我通过处理WM_PAINT消息在窗口中绘制了一些文本和位图。通过处理WM_CREATE消息,我还通过CreateWindow函数在窗口中放置了一些按钮控件。我花了好几个小时研究这个,但我没有运气-我如何才能完全清除窗口和它的所有内容我放在里面,所以我留下了一个空窗口与相同的背景标题,等等,所以我可以放更多的按钮和东西在它上面,c++,winapi,C++,Winapi,这是我的密码 #include <windows.h> #include <string> #include "mainheader.h" const char g_szClassName[] = "myWindowClass"; HBITMAP bitmap; //Window Procedure #Brain of the Window LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPA

这是我的密码

#include <windows.h>
#include <string>
#include "mainheader.h"

const char g_szClassName[] = "myWindowClass";
HBITMAP bitmap;

//Window Procedure #Brain of the Window
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_CREATE:{
            CreateWindow(TEXT("button"), TEXT("Play"),
                         WS_VISIBLE | WS_CHILD,
                         100, 227, 80, 25,
                             hwnd, (HMENU) 1, NULL, NULL);

            CreateWindow(TEXT("button"), TEXT("Stats"),
                         WS_VISIBLE | WS_CHILD,
                         200, 227, 80, 25,
                         hwnd, (HMENU) 2, NULL, NULL);

            CreateWindow(TEXT("button"), TEXT("Quit"),
                         WS_VISIBLE | WS_CHILD,
                         300, 227, 80, 25,
                         hwnd, (HMENU) 3, NULL, NULL);

            bitmap = (HBITMAP) LoadImage(NULL, TEXT("menuIcon.bmp"), IMAGE_BITMAP, 130, 130, LR_LOADFROMFILE);
            break;
        }

        case WM_COMMAND:{
            switch(LOWORD(wParam)){
                case 1:{
                    break;
                }

                case 2:{
                    break;
                }

                case 3:{
                    PostQuitMessage(0);
                }
            }

            break;
        }

        case WM_PAINT:{
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            HDC hMemDC = CreateCompatibleDC(hdc);

            ::SelectObject(hMemDC, bitmap);
            BitBlt(hdc, 170, 65, 200, 400, hMemDC, 0, 0, SRCCOPY);
            ::DeleteDC(hMemDC);

            SetBkColor(hdc, RGB(0, 0, 0));
            SetTextColor(hdc, RGB(0, 255, 0));

            std::string text = "Welcome to Tic Tac Toe v2.0!";
            std::string text2 = "Made By: Jaden Peterson (2015)";
            std::string text3 = "Please choose an option below:";

            TextOut(hdc, 150, 20, text.c_str(), text.length());
            TextOut(hdc, 141, 45, text2.c_str(), text2.length());
            TextOut(hdc, 145, 200, text3.c_str(), text3.length());
            EndPaint(hwnd, &ps);
            break;
        }

        case WM_CLOSE:{
            DestroyWindow(hwnd);
            break;
        }

        case WM_DESTROY:{
            PostQuitMessage(0);
            break;
        }

        default:{
            return DefWindowProc(hwnd, msg, wParam, lParam);
        }
    }

    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));

    if(!RegisterClassEx(&wc)){
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    //Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "Tic Tac Toe v2.0",
        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL){
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    //Message Loop #Heart of the Window
    while(GetMessage(&Msg, NULL, 0, 0) > 0){
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

删除所有子窗口很简单。执行循环并使用枚举所有子窗口。对于每个返回的句柄,调用

首先声明回调函数:

BOOL CALLBACK DestoryChildCallback(
  HWND   hwnd,
  LPARAM lParam
)
{
  if (hwnd != NULL) {
    DestroyWindow(hwnd)
  }

  return TRUE;
}
从您的代码:

EnumChildWindows(hwnd /* parent hwnd*/, DestoryChildCallback, NULL);

如果您不希望位图出现,请停止绘制。我希望有一种方法可以清除整个窗口,这样我就不必手动删除其中的每个控件/元素。很明显,您不了解在windows中如何进行绘制。没有持久状态。没有什么需要澄清的。使窗口矩形无效,当绘制周期到来时,不绘制任何内容。如果您展示了一些代码,我们可能会给您一些更具体的建议。答案是编写代码删除您创建的所有子窗口。如何跟踪所创建的按钮和其他窗口应该是您最初设计的一部分。要详细说明David Heffernan所说的“使窗口矩形无效,当绘制周期到来时,不绘制任何内容”,请阅读有关消息和事件处理的内容。窗口失效是一个事件,存在对应的消息处理程序。消息处理程序只是一个函数,在本例中,它的任务是从新画布开始绘制窗口。显然,如果在处理程序中什么都不做,空白画布将保持空白。要更改视图,您只需再次绘制窗口,这种情况发生得非常快,因此您不会注意到窗口被完全重绘!这删除了所有按钮,但文本和位图仍然保留。如果您不想绘制任何内容,请删除WM_paint的处理程序,或者您可以使用BitBlt和TextOut将条件语句设置为绘制或不绘制。我想绘制,但当我按下特定按钮时,我希望它消失。如果您不想绘制,请不要绘制。看来你还是不明白绘画是怎么工作的。与其寻求解决方案,不如去学习绘画。