Winapi 更改Win32窗口样式

Winapi 更改Win32窗口样式,winapi,Winapi,是否有win32函数在创建窗口后更改其样式?我想更改在CreateWindowEx中指定的样式标志。具体来说,我想将标准窗口转换为无边框和无大小调整的窗口。我认为应该这样做。请注意,如备注中所述,如果更改了边框样式,则需要在之后调用SetWindowPos 某些样式仅在窗口创建期间生效,因此无法通过此调用进行设置。MSDN通常会调出以后可以设置的样式。您应该在createwindowex或SetWindowLongPtr中尝试此窗口样式:WS|POPUPWINDOW | WS|TABSTOP |

是否有win32函数在创建窗口后更改其样式?我想更改在
CreateWindowEx
中指定的样式标志。具体来说,我想将标准窗口转换为无边框和无大小调整的窗口。

我认为应该这样做。请注意,如备注中所述,如果更改了边框样式,则需要在之后调用
SetWindowPos


某些样式仅在窗口创建期间生效,因此无法通过此调用进行设置。MSDN通常会调出以后可以设置的样式。

您应该在createwindowex或SetWindowLongPtr中尝试此窗口样式:
WS|POPUPWINDOW | WS|TABSTOP | WS|VISIBLE
我通过组合使用SetWindowPosShowWindow方法解决此问题的方法

注意必须在此处调用showWindow,否则将无法工作

下面是完整的源代码。只需调用setConsoleWindowStyle()方法并设置新的窗口样式

#define _WIN32_WINNT 0x0501
#include <stdio.h>
#include <windows.h>

LONG_PTR setConsoleWindowStyle(INT,LONG_PTR);

int main()
{
    LONG_PTR new_style =  WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL;
    setConsoleWindowStyle(GWL_STYLE,new_style);
    return 0;
}

LONG_PTR setConsoleWindowStyle(INT n_index,LONG_PTR new_style)
{
 /*The function does not clear the last error information. if last value was zero.*/
 SetLastError(NO_ERROR);        

 HWND hwnd_console = GetConsoleWindow();
 LONG_PTR style_ptr = SetWindowLongPtr(hwnd_console,n_index,new_style);
 SetWindowPos(hwnd_console,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_DRAWFRAME);

 //show window after updating
 ShowWindow(hwnd_console,SW_SHOW);

 return style_ptr;  
}
#定义_WIN32_WINNT 0x0501
#包括
#包括
LONG_PTR setConsoleWindowStyle(INT,LONG_PTR);
int main()
{
LONG_PTR new_style=WS_重叠窗口| WS_HSCROLL | WS_VSCROLL;
设置控制台窗口样式(GWL_样式、新_样式);
返回0;
}
LONG\u PTR setConsoleWindowStyle(INT n\u索引,LONG\u PTR新样式)
{
/*函数不清除最后一个错误信息。如果最后一个值为零*/
SetLastError(无错误);
HWND HWND_console=GetConsoleWindow();
LONG_PTR style_PTR=SetWindowLongPtr(hwnd_控制台,n_索引,新_样式);
设置窗口位置(hwnd_控制台、0,0,0,0、SWP_NOZORDER、SWP_NOMOVE、SWP_NOSIZE、SWP_NOACTIVATE、SWP_DRAWFRAME);
//更新后显示窗口
显示窗口(硬件控制台、软件显示);
返回式ptr;
}
为我做了:D

SetWindowLong(hWnd、GWL_风格、newStyle);
展示窗口(hWnd、SW_展示)

如果您在创建windows属性后更改了它,则必须使用带有正确标志的SetWindowPos才能使更新生效。如果您解释了为什么这样做有效,而不是只发布函数
ShowWindow
,则将
SWP\u ShowWindow
传递到
SetWindowPos
,这会很有帮助。
HWND windowHandle = FindWindow(NULL, L"Various tests");
    SetWindowLongPtr(windowHandle, GWL_STYLE, WS_SYSMENU); //3d argument=style
    SetWindowPos(windowHandle, HWND_TOPMOST, 100, 100, Width, Height, SWP_SHOWWINDOW);