精华内容
下载资源
问答
  • windows的对话框是什么
    2021-06-29 19:25:59

    使用 Python 实现 Windows 对话框定时自动关闭

    说明:以下函数所使用的对话框是基于Windows的,通过调用 Windows API 实现:

    • 思路一:调用MessageBox弹出对话框,另起一个定时器关闭它。
    • 思路二:调用MessageBoxTimeout,微软未公布的函数,来实现。

    前言

    在调用Windows的对话框时,它是阻塞的,直到用户点击对话框按钮,才会返回按下的按钮值,代码才会继续往下执行。

    有时我们希望只是弹出提示对话框但不希望它阻塞主线程执行,那么我们可以新建一个线程来调用它,如果这个时候我们想获取它的返回值,或者希望在用户点击关闭对话框时做点别的事情,那么可以通过回调函数来实现了。

    有时我们还希望,对话框会自动关闭,我们只是提示一下用户,省去用户自动点击的麻烦,这是多么美妙的事情。

    以下代码,实现了以上的猜想。我们可以设置block参数决定对话框是否阻塞调用线程,默认值取决于interval <= 0interval参数代表对话框在弹出后interval秒自动关闭。如果用户在自动关闭前主动关闭了对话框,那么会取消该定时器,然后执行回调函数。

    此外我们还可以设置对话框关闭时的回调函数,回调函数的唯一的参数是对话框关闭时的按键特殊值。回调函数建议在定时自动关闭模式下设置,当然在阻塞模式下也可以设置。

    但是值得注意的是,对于多选一没有关闭功能的对话框,例如MB_YESNOMB_ABORTRETRYIGNORE等等,如果设置了自动关闭,那么自动关闭时默认返回值会是

    • win32con.IDCLOSE,使用MessageBoxEndDialog实现的自动关闭对话框,该值通过EndDialog函数第二个参数指定EndDialog(hwnd, win32con.IDCLOSE)
    • 32000,通过MessageBoxTimeout实现的自动关闭对话框。

    除此之外返回用户按下的对话框按键特殊值

    MessageBox 参数简述

    MessageBox

    MessageBox函数:显示一个模态对话框,其中包含一个系统图标、一组按钮和一条特定于应用程序的简短消息,例如状态或错误信息。 消息框返回一个整数值,指示用户单击了哪个按钮。

    MessageBox C++函数原型:

    int MessageBox(
      HWND    hWnd,
      LPCTSTR lpText,
      LPCTSTR lpCaption,
      UINT    uType
    );
    

    参数说明:

    • hWnd:要创建的消息框所有者窗口的句柄。如果此参数为NULL,则消息框没有所有者窗口
    • lpText:消息内容。对于多行消息可用回车或换行符分割
    • lpCaption:对话框标题。如果为NULL,默认为Error
    • uType:指定对话框的内容和行为的位标志集(图标、按钮类型…),通过组合标志位联合定义,以下会进行说明

    返回值:

    • IDOK (1):确认
    • IDCANCEL (2):取消
    • IDABORT (3):中止
    • IDRETRY (4):重试
    • IDIGNORE (5):忽略
    • IDYES (6):是
    • IDNO (7):否

    详情请看:MessageBox function (winuser.h) - Win32 apps | Microsoft Docs

    MessageBoxTimeout

    MessageBoxTimeout函数:微软未公开的Windows API函数。实现定时消息,功能类似于MessageBox。如果用户不回应,能定时关闭消息框。函数由user32.dll导出,Windows 2000及以下没有此函数。

    MessageBoxTimeout C++函数原型:

    int MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, 
        IN LPCSTR lpCaption, IN UINT uType, 
        IN WORD wLanguageId, IN DWORD dwMilliseconds);
    
    int MessageBoxTimeoutW(IN HWND hWnd, IN LPCWSTR lpText, 
        IN LPCWSTR lpCaption, IN UINT uType, 
        IN WORD wLanguageId, IN DWORD dwMilliseconds);
    
    #ifdef UNICODE
        #define MessageBoxTimeout MessageBoxTimeoutW
    #else
        #define MessageBoxTimeout MessageBoxTimeoutA
    #endif 
    
    #define MB_TIMEDOUT 32000
    

    值的注意的是,如果使用UNICODE我们就使用MessageBoxTimeoutW,否则使用MessageBoxTimeoutA,一般情况下我们使用MessageBoxTimeoutW

    它对于MessageBox多出两个参数:

    • wLanguageId:函数扩展,一般取0。
    • dwMilliseconds:消息框延迟关闭时间,单位:毫秒

    返回值:与MessageBox一致,但如果超时,即用户未操作,且对话框没有指定或默认关闭的按钮,当消息框自动关闭,返回32000

    详情请看:MessageBoxTimeout API - CodeProject

    uType组合参数

    文档中指出了MessageBox参数uType可组合的五组参数。

    • 按钮,单选

      • MB_ABORTRETRYIGNORE (0x00000002L):中止、重试和忽略
      • MB_CANCELTRYCONTINUE (0x00000006L):取消、重试、继续
      • MB_HELP (0x00004000L):帮助
      • MB_OK (0x000000000L):确定
      • MB_RETRYCANCEL (0x00000005L):重试、取消
      • MB_YESNO (0x00000004L):是、否
      • MB_YESNOCANCEL (0x00000003L):是、否、取消
    • 图标,单选

      • MB_ICONEXCLAMATIONMB_ICONWARNING (0x00000030L):惊叹号图标
      • MB_ICONINFORMATIONMB_ICONASTERISK (0x00000040L):一个由小写字母i组成的
      • MB_ICONQUESTION (0x00000020L):问号图标
      • MB_ICONSTOPMB_ICONERRORMB_ICONHAND (0x00000010L):停止标志图标
    • 默认按钮,单选

      • MB_DEFBUTTON1 (0x000000000L):第一个按钮是默认按钮,默认值
      • MB_DEFBUTTON2 (0x00000100L):第二个按钮是默认按钮
      • MB_DEFBUTTON3 (0x00000200L):第二个按钮是默认按钮
      • MB_DEFBUTTON4 (0x00000300L):第二个按钮是默认按钮
    • 对话框模式,单选

      • MB_APPLMODAL (0x000000000L):在hwnd参数标识的窗口中继续工作以前,用户一定响应消息框。但是,用户可以移动到其他线程的窗口且在这些窗口中工作。根据应用程序中窗口的层次机构,用户则以移动到线程内的其他窗口。所有母消息框的子窗口自动地失效,但是弹出窗口不是这样。如果既没有指定MB_SYSTEMMODAL也没有指定MB_TASKMOOAL,则MB_APPLMODAL为缺省的。

      • MB_SYSTEMMODAL (0x00001000L):除了消息框有WB_EX_TOPMOST类型,MB_APPLMODAL和MB_SYSTEMMODAL一样。用系统模态消息框来改变各种各样的用户,主要的损坏错误需要立即注意(例如,内存溢出)。如果不是那些与hwnd联系的窗口,此标志对用户对窗口的相互联系没有影响。

      • MB_TASKMODAL (0x00002000L):如果参数hwnd为NULL的话,那么除了所有属于当前线程高层次的窗口失效外,MB_TASKMODALL和MB_APPLMODAL一样。当调用应用程序或库没有一个可以得到的窗口句柄时,使用此标志。但仍需要阻止输入到调用线程的其他窗口,而不是搁置其他线程。

    • 特殊声明,多选

      • MB_DEFAULT_DESKTOP_ONLY (0x00020000L):接收输入的当前桌面一定是一个缺省桌面。否则,函数调用失败。缺省桌面是一个在用户已经纪录且以后应用程序在此上面运行的桌面。
      • MB_RIGHT (0x00080000L):文本为右调整
      • MB_RTLREADING (0x00100000L):用在Hebrew和Arabic系统中从右到左的顺序显示消息和大写文本
      • MB_SETFOREGROUND (0x00010000L):消息框成为前台窗口。系统在内部调用消息框的SetForegroundWindow函数。
      • MB_TOPMOST (0x00040000L):消息框是用WS_EX_TOPMOST窗口样式创建的。
      • MB_SERVICE_NOTIFICATION (0x00200000L):呼叫者是通知事件用户的服务。该功能在当前活动桌面上显示一个消息框,即使没有用户登录到计算机。

    详情请看:MessageBox function (winuser.h) - Win32 apps | Microsoft Docs

    实现一:MessageBox+EndDialog+threading.Timer

    如果你想直接使用它,那么你需要安装 pywin32pip install pywin32

    实现方式:

    • 通过win32api.MessageBox调用对话框

    • 通过threading.Timerwin32gui.EndDialog实现定时自动关闭对话框。

    • 通过线程实现异步对话框;通过回调函数实现对话框关闭回调。

    代码如下:

    import threading
    
    import win32api
    import win32con
    import win32gui
    
    
    # 对每次创建对话框进行计数,方便查找同名对话框的句柄
    __show_dialog_times = 0
    
    
    def create_dialog(message: str, title: str, style: int = win32con.MB_OK,
                      block: bool = None, interval: float = 0, callback=None):
        """
        创建一个 Windows 对话框,支持同步异步和自动关闭
    
        值得注意的是,对于多选一没有关闭/取消功能的对话框,自动关闭时默认(回调)返回值为win32con.IDCLOSE,
        例如win32con.MB_YESNO、win32con.MB_ABORTRETRYIGNORE等等。
    
        :param message: 对话框消息内容
        :param title: 对话框标题
        :param style: 对话框类型,该值可以相加组合出不同的效果。
        :param block: 对话框是否阻塞调用线程,默认值取决于interval<=0,为Ture不会自动关闭,意味着阻塞调用线程
        :param interval: 对话框自动关闭秒数
        :param callback: 对话框关闭时的回调函数,含一参数为对话框关闭结果(按下的按钮值)
        :return: 当对话框为非阻塞时,无返回值(None),否则,对话框阻塞当前线程直到返回,值为按下的按钮值
        """
    
        global __show_dialog_times
        __show_dialog_times += 1
    
        title = '{} [{}]'.format(title, __show_dialog_times)
    
        def show(timer: threading.Timer):
            btn_val = win32api.MessageBox(0, message, title, style)
            if timer and timer.is_alive():
                timer.cancel()
            if callback and callable(callback):
                callback(btn_val)
            return btn_val
    
        def close():
            hwnd = win32gui.FindWindow(None, title)
            if hwnd:
                try:
                    # 关闭对话框的一些方法:PostMessage 异步,SendMessage 同步
                    # win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
                    # win32gui.SendMessage(hwnd, win32con.WM_CLOSE, 0, 0)
                    # win32gui.EndDialog(hwnd, None)
                    # 需要注意的是倒数第二个参数,指定如何发送消息
                    # http://timgolden.me.uk/pywin32-docs/win32gui__SendMessageTimeout_meth.html
                    # win32gui.SendMessageTimeout(hwnd, win32con.WM_CLOSE, 0, 0, win32con.SMTO_BLOCK, 1000)
                    win32gui.EndDialog(hwnd, win32con.IDCLOSE)
                except Exception as e:
                    log.error("对话框[{}]关闭错误:{}".format(title, e))
    
        block = block if (block is not None) else interval <= 0
    
        timer = None
        if interval > 0:
            timer = threading.Timer(interval, close)
            timer.start()
    
        if block:
            return show(timer)
        else:
            threading.Thread(target=lambda: show(timer)).start()
    

    实现二 (推荐):MessageBoxTimeout

    import threading
    import win32con
    
    user32 = ctypes.windll.user32
    
    def create_dialog(message: str, title: str, style: int = win32con.MB_OK,
                        block: bool = None, interval: float = 0, callback=None):
        """
        使用微软未公布的Windows API: MessageBoxTimeout 实现自动关闭的对话框,通过user32.dll调用,
        相比于使用 MessageBox 来实现显得更加简洁,参数详情请参考以上函数 create_dialog
    
        值得注意的是 Windows 2000 没有导出该函数。并且对于多选一没有关闭/取消功能的对话框,
        自动关闭时默认(回调)返回值为 32000
        """
    
        block = block if (block is not None) else interval <= 0
        interval = int(interval * 1000) if interval > 0 else 0
    
        def show():
            # if UNICODE MessageBoxTimeoutW
            # else MessageBoxTimeoutA
            # MessageBoxTimeout(hwnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds)
            btn_val = user32.MessageBoxTimeoutW(0, message, title, style, 0, interval)
            if callback and callable(callback):
                callback(btn_val)
            return btn_val
    
        if block:
            return show()
        else:
            threading.Thread(target=show).start()
    

    如何使用

    基本调用:

    # 基本使用
    if __name__ == '__main__':
        def cb(res):
            print("[回调函数] 对话框返回值:{}".format(res))
    
        # 同步阻塞+手动关闭
        res = create_dialog('同步阻塞+手动关闭', '同步阻塞对话框')
        print(res)
        # 同步阻塞+自动关闭
        res = create_dialog('同步阻塞+自动关闭', '同步阻塞对话框', block=True, interval=3)
    	print(res)
        
        # 当然你也可以指定对话框回调函数(多此一举?)
        res = create_dialog('同步阻塞对话框+回调', '同步阻塞对话框', style=win32con.MB_YESNO, callback=cb)
        print(res)
        
        # 异步非阻塞+手动关闭
        res = create_dialog('异步非阻塞+手动关闭', '异步非阻塞自动关闭对话框')
        print(res)
    
        # 异步非阻塞+自动关闭
        res = create_dialog('异步非阻塞+自动关闭', '异步非阻塞自动关闭对话框', interval=3)
        print(res)
    
        time.sleep(5)
    
        # 添加回调函数以获取结果
        res = create_dialog('异步非阻塞自动关闭对话框+回调', '异步非阻塞自动关闭对话框', interval=3, callback=lambda x: cb(x))
        print(res)
        
        
        # 组合style,带警告图标的确认对话框,并且对话框弹出处于前台
        res = create_dialog('message', 'title', interval=2, callback=cb, style=win32con.MB_OK | win32con.MB_ICONERROR | win32con.MB_SETFOREGROUND)
        print(res)
    
    更多相关内容
  • Windows对话框

    2021-12-12 14:57:28
    一个对话框模板资源创建一个无模式的对话框 CreateDialog()函数 函数功能:CreateDialog宏从一个对话框模板资源创建一个无模式的对话框,CreateDiaog宏...新建一个windows空项目 添加一个main.cpp 添加一个dialog资源文

    一个对话框模板资源创建一个无模式的对话框

    CreateDialog()函数
    函数功能:CreateDialog宏从一个对话框模板资源创建一个无模式的对话框,CreateDiaog宏使用CreateDialogParam函数。

    函数原型:HWND CreateDialog(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);

    1. 新建一个windows空项目
    2. 添加一个main.cpp
    3. 添加一个dialog资源文件

    在这里插入图片描述

    #include <windows.h>
    #include "resource.h"
    
    INT_PTR CALLBACK dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    	case WM_CLOSE:
    		PostQuitMessage(0);
    		break;
    	case WM_COMMAND:
    	{
    		if (LOWORD(wParam) == IDOK)
    		{
    			TCHAR szUser[256] = { 0 };
    			GetDlgItemText(hwnd, IDC_EDIT_USER, szUser, 256);
    			
    			TCHAR szPwd[256] = { 0 };
    			GetDlgItemText(hwnd, IDC_EDIT_PWD, szPwd, 256);
    
    			if (wcscmp(szUser, szPwd) == 0)
    			{
    				MessageBox(GetParent(hwnd), L"登录成功", L"提示", MB_OK);
    			}
    			else
    			{
    				MessageBox(GetParent(hwnd), L"帐号或密码错误", L"提示", MB_OK);
    			}
    		}
    	}
    	break;
    	default:
    		return FALSE;  //消息未处理交给windows默认处理程序处理
    	}
    	return TRUE;   //消息已经被处理
    }
    
    int __stdcall WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
    	HWND hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, dlgProc);
    	ShowWindow(hwnd, SW_SHOW);
    
    	MSG msg;
    	while (GetMessage(&msg, 0, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    
    展开全文
  • 的标准对话框还可以加上时间限制的例子
  • 使用纯C语言实现对Windows对话框的交互,适合初学者学习,摆脱Window DOS控制台的约束。
  • 摘要:VB源码,界面编程,对话框 Vb调用Windows颜色和文件对话框,比较初级的小技巧,本程序是VB简明教程第八章中的一个窗体小例子,希望刚学VB的朋友们参考学习。
  • 打开windows运行对话框的js
  • 6S模型Windows对话框版本,双击运行,可以直接根据对话框的提示输入所需参数,方便易学
  • 有道labview,Clad的题目windows对话框按钮的机械动作到底是什么。本程序就是用labview程序中的六种机械动作,来实现窗口最小化功能。来更好的,更深刻的理解windows对话框的机械动作是什么
  • 汇编写的仿windows对话框 DIALOG3 第四版源程序加了详细的中文注释
  • 用汇编语言编写的windows对话框程序 汇编源代码.zip
  • 给定的字符被替换为“*”-符号,就像在通常的 Windows 对话框中一样。 答案 = 密码没有输入参数允许输入任何 ASCII 字符answer = PASSCODE('数字') 只允许数字作为输入字符 [0-9] answer = PASSCODE('信') 只允许...
  • VC调用关机对话框.rar
  • windows对话框

    2013-04-25 13:33:27
    该文档描述了windows开发过程中的对话框窗口,包括了对话框的种类,使用方式,对话框窗口特有的窗口过程函数,对话框的资源模板和内存模板的创建方法。
  • windows 对话框

    2012-06-09 09:40:30
    windows 对话框视频详介,学习Visual C++的好帮手。
  • 一个MASM工程 用汇编语言编写个windows对话框.zip
  • 此板条箱在Windows API中的“打开”和“保存”对话框上提供了易于使用的抽象,可在GNU和MSVC工具链下使用,且依赖性最小。 例子 标准打开对话框 let dialog_result = wfd :: open_dialog ( Default :: default ())...
  • 怎样调用Windows的文件拷贝对话框
  • C语言windows对话框

    2014-11-29 17:45:33
    C语言里的windows对话框代码,弹出对话框的程序,简单的实现
  • Q760642.zip windows程序设计 编写Windows窗口应用程序实现对话框与菜单的应用 https://ask.csdn.net/questions/760642 编写Windows窗口应用程序实现对话框与菜单的应用 1)编程实现如下应用程序,含有菜单,单击...
  • Windows API 创建对话框,在主对话框上创建子控件按钮,单击按钮在对话框上显示位图,单击另一按钮给主对话框发送销毁消息,关闭对话框
  • visual c++ vc自定义 windows复制文件 对话框(自定义对话框上的图标,文字).zip
  • WINDOWS对话框 .PPT

    2009-05-30 20:20:51
    对话框模板资源描述文件 自定义对话框的创建 对话框的数据交换和数据检验 以对话框为主界面的应用程序 MFC预定义的通用对话框 非模态对话框
  • Windows 2000中使用通用文件对话框
  • visual c++开发windows service,服务的功能就是个GUI窗体 vc基于MFC对话框的NT服务程序框架.zip
  • 我们在使用Windows 2000打开文件对话框是还有一些小小的技巧,充分地利用这些小技巧,能够提高我们使用计算机的效率,同时还可以达到一些意想不到的功能。
  • Windows 2000有个新的“Open”对话框,这个对话框的左边有一个Places Bar,要想让这个对话框出现,必须在::GetOpenFileName函数中传递OPENFILENAME结构,这个结构隐藏在MFC的CFileDialog类中...... 关键字:...
  • windows开发,MFC对话框的重绘,包括标题栏、最小化按钮,最大化按钮,关闭按钮以及边框等的重绘 windows开发,MFC对话框的重绘,包括标题栏、最小化按钮,最大化按钮,关闭按钮以及边框等的重绘
  • 非常简单的Windows程序,对于菜单和对话框的编写一目了然。适合初学者对于Windows编程的学习。
  • WinConfirmDialog Windows冲突确认对话框库。 执照:麻省理工学院 支持的操作系统:Windows Vista + Todo:.net支持。
  • 文章目录对话框基本知识1.对话框2.对话框中的常用控件3.对话框的种类(重点)创建模式对话框1.DoModal()函数创建无模式对话框1.Create()函数2.ShowWindow()函数3.原因分析 对话框基本知识 1.对话框 2.对话框中的...

    对话框基本知识

    1.对话框

    在这里插入图片描述

    2.对话框中的常用控件

    在这里插入图片描述

    3.对话框的种类(重点)

    在这里插入图片描述


    创建模式对话框

    1.DoModal()函数

    在这里插入图片描述
    DoModal()功能:
    1.创建
    2.显示
    3.暂停程序

    EndDialog()函数功能:
    1.通知DoModal,结束暂停,可以返回。
    2.隐藏对话框


    创建无模式对话框

    1.Create()函数

    在这里插入图片描述

    2.ShowWindow()函数

    在这里插入图片描述

    3.对话框未显示原因分析

    在这里插入图片描述

    使用Detach函数也不能解决问题。

    不使用Detach函数原因:

    CWnd中使用Detach函数,用于以下两种情况:
    1.确定不再使用窗口
    2.Detach之后,立即Attach一个新的窗口资源

    解决方法1——使用成员变量

    在这里插入图片描述

    销毁无模式对话框

    在这里插入图片描述

    解决方法2——使用堆内存

    在这里插入图片描述


    控件访问的七种方法

    1.MFC的DDX数据交换——控件和整型变量关联

    在这里插入图片描述

    2.MFC的DDX数据交换——控件和控件变量关联

    在这里插入图片描述

    3-1.GetDlgItem + Get/SetWindowText

    在这里插入图片描述

    3-2.利用GetDlgItem改变控件文本内容

    在这里插入图片描述

    3-3.利用GetDlgItem在控件中绘图

    在这里插入图片描述

    4.Get/SetDlgItemText

    在这里插入图片描述

    5.Get/SetDlgItemInt

    在这里插入图片描述

    6.发送消息——SendMessage

    在这里插入图片描述

    7.发送消息——SendDlgItemMessage

    在这里插入图片描述
    在这里插入图片描述


    改变对话框/窗口外观

    设置窗口的位置与大小

    在这里插入图片描述

    设置窗口的形状

    在这里插入图片描述

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 294,492
精华内容 117,796
热门标签
关键字:

windows的对话框是什么