gpt4 book ai didi

c - 奇怪的显示窗口行为

转载 作者:行者123 更新时间:2023-11-30 14:22:46 24 4
gpt4 key购买 nike

我发现当我调用 SetWindowPosMoveWindow 时会显示一个窗口,我的意思是在我有机会之前在 WM_CREATE 消息期间显示该窗口调用 ShowWindow。经过一番检查,我发现它与SetWindowRedraw有关。

这是一个例子:

#include <Windows.h>
#include <windowsx.h>

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL MainWindow_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void MainWindow_OnDestroy(HWND hWnd);
void MainWindow_OnSize(HWND hWnd, UINT state, int cx, int cy);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcex = { sizeof(wcex) };
HWND hWnd;
BOOL ret;
MSG msg;

wcex.lpfnWndProc = MainWindowProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
wcex.lpszClassName = TEXT("MainWindow");
wcex.hIconSm = wcex.hIcon;

RegisterClassEx(&wcex);
hWnd = CreateWindow(wcex.lpszClassName, TEXT("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL);

// ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while ((ret = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if (ret == -1)
{
return 1;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hWnd, WM_CREATE, MainWindow_OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, MainWindow_OnDestroy);
HANDLE_MSG(hWnd, WM_SIZE, MainWindow_OnSize);
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}

BOOL MainWindow_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
SetWindowPos(hWnd, NULL, 100, 100, 300, 300, SWP_NOREDRAW | SWP_NOZORDER);
return TRUE;
}

void MainWindow_OnDestroy(HWND hWnd)
{
PostQuitMessage(0);
}

void MainWindow_OnSize(HWND hWnd, UINT state, int cx, int cy)
{
SetWindowRedraw(hWnd, FALSE);
SetWindowRedraw(hWnd, TRUE);
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN) ;
}

运行此命令,将显示一个窗口,而无需调用ShowWindow。但如果评论

SetWindowRedraw(hWnd, FALSE);
SetWindowRedraw(hWnd, TRUE);

然后窗口将保持隐藏状态。

有人能解释一下吗?

最佳答案

SetWindowRedraw() 是一个将 WM_SETREDRAW 消息(使用 SendMessage())发送到窗口的宏。

当窗口收到此类消息时,其样式集将添加 WS_VISIBLE 样式。

逐字记录来自 MSDN (WM_SETREDRAW):

[...] If the application sends the WM_SETREDRAW message to a hidden window, the window becomes visible (that is, the operating system adds the WS_VISIBLE style to the window). [...]

关于c - 奇怪的显示窗口行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13530421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com