更改Win32窗口样式

21

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

5个回答

20

我认为SetWindowLongPtr可以做到这一点。请注意,如果更改了边框样式,则需要调用SetWindowPos,如备注中所指出的那样。

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


2
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);

他替我完成了这个任务 :D


1

在createwindowex或SetWindowLongPtr中,您应该尝试使用以下窗口样式:WS_POPUPWINDOW|WS_TABSTOP |WS_VISIBLE


3
如果在窗口创建后更改其属性,您需要使用正确的标志调用SetWindowPos函数才能使更新生效。 - Gunner

0

我解决这个问题的方法是使用 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;  
}

不必使用 ShowWindow,而是将 SWP_SHOWWINDOW 传递到 SetWindowPos - metablaster

0

SetWindowLong(hWnd, GWL_STYLE, newStyle); ShowWindow(hWnd, SW_SHOW);

设置窗口长宽比、样式和新样式; 显示窗口,使其可见。


5
请问需要翻译成中文吗?如果是的话,翻译如下:希望你能解释为什么这个函数起作用,而不仅仅是发布函数本身会更有帮助。 - chevybow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接