VC中如何设置窗口在最前

VC中如何设置窗口在最前,第1张

1.把当前窗口置于最顶层,可以在OnInitDialog()中加入如下代码:

CRect rect

GetClientRect(&rect)

::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, rect.Width(), rect.Height() + 20, SWP_NOMOVE)

return TRUE

实际测试时,如果height不加20的话则显示不完全。

2.如果是想让窗口全屏,则可以用如下方法:

int cxScreen,cyScreen

cxScreen=GetSystemMetrics(SM_CXSCREEN)

cyScreen=GetSystemMetrics(SM_CYSCREEN)

SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW)

3.如果想让窗口取消置于顶层,可以设置参数为HWND_NOTOPMOST

4.关于SetWindowPos()函数

(1)此函数使用的坐标参数用的是Client坐标,对于子窗口用的是其父窗口的坐标系。然而对于用DoModal()d出的窗口,如果在资源属性里没有选择Child属性的话,它的父窗口是DeskTop,而不是调用DoModal()的窗口

(2)SetWindowPos 详解

函数名:

SetWindowPos

头文件:

winuser.h

函数原型:

BOOL SetWindowPos

(

HWND hWnd, //窗口句柄

HWND hWndInsertAfter, //排列顺序的句柄

int X, //水平坐标

int Y, //垂直坐标

int cx, //宽

int cy, //高

UINT uFlags //窗口定位标识

)

说明:

这个函数能改变窗口的大小、位置和设置子窗口、d出窗口或顶层窗口的排列顺序。

返回值:

BOOL,如果返回值非零表示成功,返回零表示失败。错误信息请参看GetLastError函数。

参数表:

参数 类型及说明

hwnd HWND,欲定位的窗口句柄

hWndInsertAfter HWND,置于hwnd前面的窗口句柄。这个参数必须是窗口的句柄或是下面的值之一:  HWND_BOTTOM 将窗口置于其它所有窗口的底部

HWND_NOTOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的后面。如果这个窗口非顶部窗口,这个标记对该窗口并不产生影响

HWND_TOP 将窗口置于它所有窗口的顶部

HWND_TOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的前面。即使这个窗口不是活动窗口,也维持最顶部状态

x:

int,指定窗口新的X坐标

Y: 

int,指定窗口新的Y坐标

cx:

int,指定窗口新的宽度

cy:

int,指定窗口新的高度

wFlags:

UINT,指定窗口状态和位置的标记。这个参数使用下面值的组合: SWP_DRAWFRAME 围绕窗口画一个框

SWP_FRAMECHANGED 发送一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有发生改变。如果不指定这个参数,消息WM_NCCALCSIZE只有在窗口大小发生改变时才发送

SWP_HIDEWINDOW 隐藏窗口

SWP_NOACTIVATE 不激活窗口

SWP_NOCOPYBITS 屏蔽客户区域

SWP_NOMOVE 保持当前位置(X和Y参数将被忽略)

SWP_NOOWNERZORDER 不改变所有窗口的位置和排列顺序

SWP_NOREDRAW 窗口不自动重画

SWP_NOREPOSITION 与SWP_NOOWNERZORDER标记相同

SWP_NOSENDCHANGING 防止这个窗口接受WM_WINDOWPOSCHANGING消息

SWP_NOSIZE 保持当前大小(cx和cy会被忽略)

SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略)

SWP_SHOWWINDOW 显示窗口

备注:

如果设置了SWP_SHOWWINDOW或SWP_HIDEWINDOW标记,这个窗口不发生移动或改变大小。窗口成为最顶级窗口后,它的所有子窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有子窗口也会转为非最顶级。

相关函数:

MoveWindow,SetActiveWindow,SetForegroundWindow

当你建立了一个基本对话框应用程序时,设置对话框置顶,可以在初始化对话框函数或者在消息响应函数里添加以下语句

设置置顶:

SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE)

取消置顶:

SetWindowPos(&wndNoTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE)

建议试试

AfxMessageBox

()

按说messagebox本来就是模态系那是,应该就是对话框最前端。

Windows

API:

MessageBox()

CWnd::MessageBox()

MFC:

AfxMessageBox()

其中CWnd::MessageBox()

AfxMessageBox()

都是对

API

函数MessageBox()的封装。

关于是否需要

句柄

HWND的说明:

1)MessageBox是API,因此它需要HWND参数指定其所属窗体。

2)CWnd::MessageBox()

是CWnd的

成员函数

,它要求MessageBox只能在cwnd类及其子类中使用;它不要求HWND参数,因为CWnd已经指明了其所属窗口。

因此CWnd::MessageBox()和::MessageBox(HWND)作用等同。

3)AfxMessageBox()mfc中的全局函数,无句柄HWND参数。能用MessageBox()的地方都能用AfxMessageBox(),但AfxMessageBox不能设置消息框标题(它的默认标题就是应用程序的可执行文件名).

使用建议:

1)在非CWnd类中使用则是API

MessageBox函数,但它使用起来非常不便,必须指定标题、句柄和样式等,否则选用CWnd::MessageBox()或AfxMessageBox,它们使用起来方便。

2)MessageBox是

模态对话框

,你不进行确认时程序不往下运行,它会阻塞你当前的线程为,除非你程序是多线程的程序,否则只有等待模态对话框被确认。3)如果用MFC的话,请尽量使用afxmessagebox,因为这个全局的对话框最安全,也最方便。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11090923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存