如何用纯Win32 API写模态窗口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用纯Win32 API写模态窗口?相关的知识,希望对你有一定的参考价值。

用CreateWindow或是CreateWindowEx来实现模态窗口,不用MFC或是Qt,就用纯Win32 API搞模态窗口,要怎么写?有什么资料吗?

如何用纯Win32 API写模态窗口?
所谓模态窗口(modal window),又叫做模式窗口,一般是指应用程序中那些任务比较紧要的窗口。只要它们存在,它们便会阻止用户访问其他窗口(或者是阻止用户访问其祖先窗口)。在windows中,使用DialogBoxParam显示的对话框就是模态的。虽然模态对话框在windows中很普遍,但是并没有SDK级别的API,可以将一个窗口变为模态显示。不过在同为微软提供的MFC/WTL框架中有这样的API——Domodal(),使用代码基本上是这个样子的:

CXXXDialog dlg(someWindow);
int nRet = dlg.Domodal();
if (nRet == IDOK)

//从dlg中获取想要的数据

else

//用户取消了窗口

这方法挺好用的,但是如果只是使用win32 api 怎么办?或者要让一个窗口(而不是对话框)模态显示又要怎么办?这个时候就需要我们自己实现模态机制了。

我们知道windows系统是依靠windows消息分发与响应来驱动UI交互的。在单线程UI中,如果某个消息的处理函数占用了大量时间,其他消息就不能得到及时的处理(因为是单线程)。如果我们的Domodal()不做特殊处理,结果就会导致整个UI线程卡住(因为代码的执行会停在Domodal()内部,阻塞线程的消息分发),这显然是不满足我们要求的。既要代码停留在Domodal(),又要不阻塞Windows消息分发过程,有什么方法可以解决呢?答案就是接管消息循环,即在DoModal()内部,将线程的消息循环接管过来,自己维护,直到外部通知结束模态循环。
参考技术A Win32窗口机制,是windows一系列图形界面的基石。无论你是MFC一层薄薄的封装,还是QT等第三方工具,都是基于对Win32一系列 API的调用。

CreateWindow之后,一个基于HWND句柄的空白窗口出现你眼前。虽然此时你什么也不做,但Win32窗口依然不间断的收到各种类型的窗口消息。在这一系列消息中,WM_PAINT消息至关重要,它决定了你程序的最终UI界面。PANIT消息是一个数据结构,提供了绘图关键的HDC设备上下文接口。

回到提问者的问题。此时,UI界面的绘制,已经不是win32 API的事了。
你可以有以下的选择:
1、直接使用GDI/GDI+。在更高版本的windows中,可以使用Direct2D的高级接口。
2、使用第三方的绘图引擎;
3、使用以1或2为核心的第三方UI工具包,。

至于这种显示子窗口的同时锁定父窗口的,称作模态窗口(Modal Window)。实现模态窗口需要在调用 CreateWindow(Ex) 时指定 hWndParent,以及在显示该模态窗口之前和之后调用 EnableWindow 禁用和启用父窗口,还有用 SetForegroundWindow 避免关闭模态窗口后父窗口跟着最小化

是否在任务栏显示窗口图标关键看是否有设置 WS_EX_APPWINDOW。在修改这个 Extended window style 前,必须先隐藏窗口。修改完再显示窗口才能生效

如何用win api为一个应用程序添加一个输入框

我用win的api做了一个应用程序,现在需要在该程序窗口里创建一个文本输入框,要可以支持粘贴,还有请说明如何对输入的数据接收 谢谢

参考技术A CreateWindow
类名 EDIT
窗口Style记得加 ES_AUTOVSCROLL
创建出来的文本框就和其他大多数程序的一样了

以上是关于如何用纯Win32 API写模态窗口?的主要内容,如果未能解决你的问题,请参考以下文章

FLTK 模态窗口

如何使用动态添加的按钮打开模态窗口 - 纯 JavaScript

Win32纯API创建半透明窗口

Win32纯API创建半透明窗口

Win32纯API创建半透明窗口

在窗口外单击时自动关闭模态,但如果在模态窗口内单击则保持打开状态[重复]