精华内容
下载资源
问答
  • 2021-12-06 20:06:40

    1、非模态对话框和父窗口共享当前线程的消息循环

    2、模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口。模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发送消息,父窗口还是可以接收得到。

    3、调用模态对话框的窗口处理函数会被阻塞,但是新的消息循环仍然可以调用父窗口的消息处理函数,所以,发送给父窗口的新消息仍然可以被及时处理。

    /*****************************MFC模态对话框的消息循环***************************/

    MFC模态对话框的消息循环
    单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作?

    当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态,但实事上父窗口是可以正常响应能接收到的消息的,比如计时器传来的WM_TIMER 及系统托盘菜单传回来的WM_COMMAND。

    之前的消息循环无法返回是正确的,但模态对话框并不意味着死循环,实事上,它在做另一个消息循环。


    AfxInternalPumpMessage() 里面就是一个消息泵,包括消息的获取与分发:

     

     


    只要有消息循环存在线程内的所有窗口就会活过来。不管弹出多少个模态对话框,线程内始终有一个消息循环为所以的窗口服务。

    但这种形式带来的那一个问题就是,如何关闭所有模态对话框并退出程序?

    如果简单地有EndDialog来关闭对话框,是无法让所有的消息循环返回的。有一种做法是使用PostQuitMessage,使当前的消息循环退出,消息循环收到WM_QUIT后,不当退出本次循环,还会给线程消息队列Post另一个QUIT 消息,这样消息循环就接二连三挨个退出了。

    int CWnd::RunModalLoop(DWORD dwFlags)中的代码片段可以说明这点:

     /*************************windows 消息队列,消息循环,模态对话框**************/

    Windows的消息队列是基于线程的。


    消息队列,消息循环:

    线程是程序串行执行的最小单位。

    一个典型的Win32项目(不是MFC项目,只有一个窗口的项目),其中的消息循环会使用如下代码实现:


    //代码段1

    MSG msg
    BOOL bRet;

    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }

    GetMessage()是取得消息,如果没有消息,线程阻塞在这里,不占用CPU。

    DispatchMessage()是将消息分发,分发到所有在这个线程中创建的窗口的窗口处理函数中去。 如果不需要分发消息,就不需要调用DispatchMessage(),例如线程中没有窗口的情况。


    线程消息循环:

    实际上,任何线程只要调用了上述代码段1中的代码,就已经实现了消息循环的功能。更进一步,其实只要调用GetMessage()函数就可以了。

    即:

    //代码段2

    BOOL bRet;  MSG msg;
    while( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0)

    if (bRet == -1 || WM_QUIT == msg.message){
    // handle the error and possibly exit
    break;
    }
            }

    在工作线程中,只要有代码段2,就可以实现消息循环的功能了。

    这是一个很方便的线程间异步通信的机制。给线程发消息用PostThreadMessage()。为什么去掉了DispatchMessage()呢,因为一般情况下,在工作线程中是不需要创建窗口的,不需要分发到窗口中去处理,能从线程的消息队列里取得消息就足够了。

    如果设计线程的初衷为:当某条件发生时,让工作线程开始工作,一直将工作完成,之后挂起,等待新条件的发生,等待时不占用CPU资源。 那么代码段2所展示的机制就能很好的完成这样的功能。 而且可以使多个工作线程都用同样的机制实现,彼此间协同工作,加之某种资源共享机制,可以实现一个异步的消息处理链。


    模态对话框:

    消息循环可以有多个,可以在上一级消息循环的某个消息的处理过程中,局部创建一个消息循环,模态对话框就是采用这种机制创建出来的。

    一个线程可以有多个消息循环,并行的消息循环显然没有意义,多个就是在消息循环中嵌套消息循环。

    如代码段1中的DispatchMessage函数,将消息派发到窗口的消息处理函数中,WndProc1()。

    现在假设在WndProc1()中创建一个消息循环,并且只取得这个窗口本身的消息 GetMessage(&msg, hWnd, 0, 0),不必Dispatch了,因为已经找到了目标窗口,然后用这个窗口真正的消息处理函数去处理。 这样模态对话框存在时,处理了所有的窗口消息,创建模态对话框的窗口就一直得不到处理消息的机会,模块对话框就始终处于最上层,直到其主动退出。

    当然,对模态对话框的这种解释是简化了的,实际过程可能复杂的多,取得的窗口消息至少要包含所有的子窗口的消息,也需要Dispatch到相应的子窗口,等等。但是最基本的机制应该就是这样的。
    /*********************模态对话框的消息机制****************************/

    当一个窗口时模态对话框时,它的消息处理过程是有点特殊的。模式对话框都有自己的消息循环,它阻塞的是原始的消息循环,但是被对话框的消息循环接替。消息循环的本

    质是调用窗口过程,进一步调用你的各种消息响应函数,所以无论有多少个消息循环存在,只要有一个消息循环有效,所有的消息响应函数都能被调用,这也是为什么主窗口还能

    响应消息的缘故。多个消息循环的存在会产生某些副作用,比如消息重入,第一次消息响应时弹出一个模式对话框,模式对话框的消息循环2取代原始消息循环1,假设此时主窗口

    消息队列里又有一个同样的消息到来,消息循环2也会调用同样的窗口过程(响应函数),此时就能导致消息重入(因为第一次进入这个处理函数还没有返回,本质上这个响应函数

    被递归调用了),这也是能弹出多个模式对话框的原因。每个模式对话框都有自己的消息循环,只有最后一个弹出对话框的消息循环才是活动的消息循环,其它所有消息循环(包

    括主窗口、之前弹出的模式对话框)全被阻塞。这里的“阻塞”并不是消息被阻塞,而只是DispatchMessage一直没有返回而已,但是其它的消息循环会接替这些工作。

    /**********************MFC模态模式对话框,MessageBox消息循环原理,定时器TIMER消息响应处理函数重入************/

    一、MessageBox和定时器TIMER

    MessageBox是Win32 API全局函数,必须指定标题和样式。共有4个参数。没有父窗口就NULL。返回值是int,看选什么按钮。

    比如:MessageBox( NULL, "选什么?", "标题", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2);

    ::表示全局函数。

    在MFC中,可使用全局API函数::MessageBox(NULL,………),子程序会被暂时中断在这个MessageBox上!其后的代码无法运行,等到MessageBox返回后会继续运行代码。但父窗口可以被点出来,其它程序段可以运行,比如其它按钮。  因为NULL没有指定父窗口,所以不会使父窗口无效!

    MFC中直接使用MessageBox,则是使用CWnd类的MessageBox方法,这时父窗口无法被点出来,等同于::MessageBox(m_hWnd,………)。同时子程序被暂时中断在这个MessageBox上。但关了其中一个消息框,则父窗就可以点出来了。 原理应该是m_hWnd 指定了父窗,MessageBox使父窗口无效,然后进入自己的消息循环,关闭时,使父窗有效。

    在TIMER的响应函数中,有MessageBox的话,则会暂时中断在这个MessageBox上,但当下个时间到时,又会出现一个新的MessageBox,且也是暂时中断在这个MessageBox上...  即出现了多个消息响应函数的例程!!多次重入!!每个例程都中断在MessageBox上,MessageBox返回后,例程会继续执行到结束!  各个消息框都是父窗的子窗,所以是平等的,所以各个消息框都可以点出来,但父窗点不出来。  可以关闭任何一个消息框,但是这个重入例程MessageBox之后的代码不会运行,要按倒序关闭其后的消息框后才会运行。

    二、消息框原理分析:参考《深入探讨MFC消息循环和消息泵》和调试时断点看代码

    注意:

    MFC是单线程运行的。

    MFC内部是有消息循环。

    消息循环的DispatchMessage()会阻塞,需要等窗口消息处理函数处理完了以后,才会返回。

    窗口消息处理函数是由操作系统调用的。

    窗口消息处理函数是可以多次重入的!类似函数自己可以嵌套一样。

    单线程运作:阻塞→重入→阻塞→重入。。。

    时间到→操作系统放WM_TIMER到线程队列→MFC消息循环DispatchMessage()阻塞→系统调用窗口消息处理函数OnTimer()处理完→消息循环继续

    操作系统一到时间就会放WM_TIMER到线程队列。因为是单线程,如果窗口消息处理函数如果一直没处理完,则WM_TIMER会堆积在队列中。

    OnTimer()中有消息框时情况就复杂了。MessageBox内部是一个模态对话框,模态对话框有消息循环。

    时间1到,系统放WM_TIMER到队列

    MFC程序主消息循环DispatchMessage()阻塞

    操作系统调用第1个OnTimer()

    MessageBox生成一个模态对话框对象1,显示出来,运行对话框内的消息循环1

    时间2到,系统放WM_TIMER到队列

    MessageBox1的消息循环1 DispatchMessage()阻塞

    操作系统调用第2个OnTimer() (函数重入了!)

    MessageBox生成一个模态对话框对象2,显示出来,运行对话框内的消息循环2

    时间3到,MessageBox2的消息循环2 DispatchMessage()阻塞,操作系统调用第3个OnTimer() (函数重入了!)。。。

    即一个串一个,只有最后一个消息框的消息循环在起作用,前面的消息循环全部阻塞了。

    OnTimer()是主窗(父窗)函数,所以各个MessageBox都是子窗,各个子窗是都可以点出来,但父窗会被子窗失效掉,所以父窗点不出来。

    当任何一个子窗关掉后,会使父窗有效,这时父窗可以点出来了。

    三、消息框对话框关闭时原理

    关闭时是怎样?为什么关闭时是按倒序在执行代码?

    MessageBox无法调试进入内部看代码,就用模态对话框来代替吧:

    CAboutDlg dlgAbout;

    dlgAbout.DoModal();  // DoModal就会生成模态对话框

    CDialog::DoModal()里面有CreateRunDlgIndirect()。

    CWnd::CreateRunDlgIndirect里面有RunModalLoop()。

    CWnd::RunModalLoop里面有消息循环AfxPumpMessage(),这里一直进行消息循环!循环中还有CWnd::ContinueModal()判断m_nFlags标志看是否需要退出循环。

    当关闭对话框时,如果点“确定”就是触发CAboutDlg::OnOK(),点“X”就是触发CAboutDlg::OnCancel()。 这两个函数进去都是运行EndDialog()。

    CDialog::EndDialog里面先运行EndModalLoop(),然后是运行::EndDialog()。

    CWnd::EndModalLoop()里面有

    m_nFlags &= ~WF_CONTINUEMODAL;  把标志设置成不再继续运行对话框

    PostMessage(WM_NULL);   发送一个空消息以确保消息队列中有消息,这样消息循环不会因为没有消息而阻塞

    ::EndDialog()无法进入看代码,功能是把对话框关了不显示,然后把父窗激活。

    把对话框关了不显示,这样我们就点不到这个对话框,就不会再触发窗口消息处理函数了。

    所以清楚了:

    点击关闭其中一个消息框时(比如消息框1),生成了一个消息(这个消息是关联这个消息框1的),“最后一个”消息框(比如消息框3)的消息循环DispatchMessage()这个消息后,操作系统重入消息框1对象的OnOK()或OnCancel(),设置m_nFlags标志成不再继续运行,发送一个消息框1的消息WM_NULL,以及用::EndDialog()把消息框1销毁了并把父窗激活。  

    这个时候,这个消息框1对象仍存在,它的消息循环仍阻塞在DispatchMessage()中,只有等消息框3、消息框2的消息循环退出、OnTimer()退出后,才会从DispatchMessage()返回,然后发现m_nFlags不需要继续运行消息框了,于是退出消息循环,然后退出消息框对象,然后退出OnTimer(),消息循环就又交还给MFC程序的主循环了。

    四、非模式对话框

    非模对话框没有自己的消息循环,也不会使父窗失效。

    用Create()来显示非模对话框,函数会立刻返回,所以必须要用new,这样对话框对象就保留在内存中。

    如果用CAboutDlg dlgAbout;,则处理函数结束后,对象也被销毁,即对话框一显示就被关掉了。

    CAboutDlg* pdlg = new CAboutDlg;

    pdlg ->Create(IDD_ABOUTBOX);     //非模式对话框,函数立刻返回,无自己的消息循环

    pdlg->ShowWindow(SW_SHOW);

    所以,关键是消息循环、消息处理函数重入。

    /*****************模态对话框和非模态对话框的区别*********************/

    模态对话框 操作模式上来讲 模态对话框在关闭对话框(OnOk,OnCancel,OnClose)这三个消息产生之前不可对此对话框以外的对话框进行操作  当上面3个消息产生后系统负责删除模态对话框资源
    而非模态对话框可以进行其他操作 必须在三个消息发生后自己在析构函数里回收此对话框资源
    比较麻烦
     
    模态对话框用DoModal()可以负责产生,显示,销毁窗口
    非模态对话框需要调用Create()然后在创建的时候WS_VISIBLE或者在创建都调用ShowWindow
    进行显示  最后调用DestroyWindow()  然后自己删除掉对话框对象比较麻烦
    

    按工作方式不同,可将对话框分成两类:
    模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,程序不能进行其他工作(如一般的“打开文件”对话框)
    无模式对话框(modeless dialog box 非模态对话框):模式对话框打开后,程序仍然能够进行其他工作(如一般的“查找与替换”对话框)
    两者的区别:
    一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
    二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
    三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。
    四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。
    五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
    void CModelessDialog::PostNcDestroy
    {delete this; //删除对象}
    这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。
    六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。
    例如:
    创建模态对话框
    CTestDlg dlg;
    dlg.DoModal();
    创建非模态对话框
    CTestDlg * dlg = new CTestDlg;
    dlg->Create(IDD_TEST_DLG);
    dlg->ShowWindow(SW_SHOW); 

    更多相关内容
  • CAD多线样式怎么设置?

    千次阅读 2021-12-16 16:43:35
    CAD多线常用于绘制墙体、道路等图形,是由1至16条平行线组成的,绘制多线时,除了可以使用默认样式以外,...打开浩辰CAD软件后,命令行输入快捷命令:MLSTYLE,按回车键确认,即可调出【多线样式对话框其中根据

    CAD多线常用于绘制墙体、道路等图形,是由1至16条平行线组成的,绘制多线时,除了可以使用默认样式以外,也可以指定一个自己创建的样式。那么,CAD多线样式怎么设置呢?下面,小编就来给大家讲解一下浩辰CAD软件中CAD多线样式设置技巧吧!

    CAD多线样式设置技巧:
    浩辰CAD软件中使用MLSTYLE可以创建多线的命名样式,以控制元素的数量和每个元素的特性;最多可以为一个多线样式添加 16 个元素。

    打开浩辰CAD软件后,在命令行输入快捷命令:MLSTYLE,按回车键确认,即可调出【多线样式】对话框,在其中根据自身需求选择【修改】/【新建】多线样式。如下图所示
    在这里插入图片描述

    1.修改CAD多线样式

    在样式列表中选中需要修改的多线样式后点击【修改】按钮,即可调出【修改多线样式】对话框,根据自身需求设置封口、填充、图元等参数后点击【确定】即可。如下图所示:
    在这里插入图片描述

    2.新建CAD多线样式

    点击【新建】按钮后,即可调出【创建新的多线样式】对话框,在其中输入【新样式名】后点击【继续】。如下图所示:
    在这里插入图片描述

    执行命令后,即可调出【新建多线样式】,在其中根据自身需求设置封口、填充、图元等参数后点击【确定】即可。如下图所示:
    在这里插入图片描述

    本篇CAD教程中介绍了浩辰CAD软件中CAD多线样式设置的具体操作步骤,各位小伙伴在CAD绘图过程中如果不知道CAD多线样式怎么设置的话可以参考上述步骤来操作。

    展开全文
  • 圆、线、点样式和等分命令 2. “圆”命令的使用 绘图工具栏:单击 按钮。 下拉菜单:执行“绘图”→“圆”命令 命令行:输入CIRCLE或C,按Enter键。 1. 2. 3. 任务二 半导体器件、电子管符号的绘制 任务二 ...
  • AlertDialog类的功能十分强大,它不仅可以生成带按钮的提示对话框,还可以生成带列表的列表对话框,概括起来有一下4种:1.带确定、中立和取消等N个按钮的提示对话框,其中的按钮个数不是固定的,可以根据需要添加。...

    AlertDialog类的功能十分强大,它不仅可以生成带按钮的提示对话框,还可以生成带列表的列表对话框,概括起来有一下4种:

    1.带确定、中立和取消等N个按钮的提示对话框,其中的按钮个数不是固定的,可以根据需要添加。例如,不需要中立按钮,则可以只生成带有确定和取消按钮的对话框,也可以是只需有一个按钮的对话框。

    2.带列表的列表对话框

    3.带多个单选列表项和N个按钮的列表对话框

    4.带多个多选列表项和N个按钮的列表对话框

    在使用AlertDialog类生成对话框时,常用的方法如下所示:

    setTitle :为对话框设置标题

    setIcon :为对话框设置图标

    setMessage:为对话框设置内容

    setButton:用于为提示对话框添加按钮,可以是取消按钮、中立按钮和确定按钮。需要通过为其指定int类型的whichButton参数实现,其参数可以是DialogInterface.BUTTON_POSITIVE(确定按钮)、BUTTON_NEGATIVE(取消按钮)或者BUTTON_NEUTRAL(中立按钮)。

    通常情况下,使用AlertDialog类只能生成带N个按钮的提示对话框,要生成另外3种列表对话框,需要使用AlertDialog.Builder类,AlertDialog.Builder类提供的常用方法如下表:

    setTitle :为对话框设置标题

    setIcon :为对话框设置图标

    setMessage:为对话框设置内容

    setView : 给对话框设置自定义样式

    setItems :设置对话框要显示的一个list,一般用于显示几个命令时

    setSingleChoiceItems :用来设置对话框显示一系列的单选框

    setMultiChoiceItems :用来设置对话框显示一系列的复选框

    setNeutralButton    :普通按钮

    setPositiveButton   :给对话框添加"Yes"按钮

    setNegativeButton :对话框添加"No"按钮

    create : 创建对话框

    show :显示对话框

    下面通过一个具体的实例说明如何使用AlertDialog类生成提示对话框和各种列表对话框

    res/layout/main.xml:

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:id="@+id/layout1"

    android:gravity="center_horizontal"

    >

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="显示带取消、中立和确定按钮的对话框"/>

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="显示列表的对话框"/>

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="显示带单选列表对话框"/>

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="显示带多选列表对话框"/>

    界面为图

    874e5d7664c9040201eca3bc1b5e1792.png

    MainActivity:

    package com.example.test;

    import android.app.Activity;

    import android.app.AlertDialog;

    import android.app.AlertDialog.Builder;

    import android.content.DialogInterface;

    import android.content.DialogInterface.OnMultiChoiceClickListener;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.Toast;

    public class MainActivity extends Activity {

    private boolean[] checkedItems;//记录各个列表项的状态

    private String[] items;//各列表项要显示的内容

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    //显示带取消、中立和确定按钮的对话框

    Button button1=(Button)findViewById(R.id.button1);

    button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    AlertDialog alert=new AlertDialog.Builder(MainActivity.this).create();

    alert.setIcon(R.drawable.ic_launcher);//设置对话框的图标

    alert.setTitle("系统提示");//设置对话框的标题

    alert.setMessage("显示带取消、中立和确定按钮的对话框!");//设置对话框显示的内容

    //添加“取消”按钮

    alert.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",

    new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog,int which) {

    Toast.makeText(MainActivity.this, "您单击了取消按钮", Toast.LENGTH_SHORT).show();

    }

    });

    //添加“确定”按钮

    alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定",

    new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog,int which) {

    Toast.makeText(MainActivity.this, "您单击了确定按钮", Toast.LENGTH_SHORT).show();

    }

    });

    //添加“中立”按钮

    alert.setButton(DialogInterface.BUTTON_NEUTRAL, "中立",

    new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog,int which) {

    Toast.makeText(MainActivity.this, "您单击了中立按钮", Toast.LENGTH_SHORT).show();

    }

    });

    alert.show();//显示对话框

    }

    });

    //显示列表的对话框

    Button button2=(Button)findViewById(R.id.button2);

    button2.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    final String[] items=new String[]{"唱歌","跳舞","美术","远足旅行","摄影"};

    Builder builder=new AlertDialog.Builder(MainActivity.this);

    builder.setIcon(R.drawable.in);

    builder.setTitle("请选择你的爱好:");

    //添加列表项

    builder.setItems(items, new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this, "您选择了"+items[which],Toast.LENGTH_SHORT).show();

    }

    });

    builder.create().show();//创建对话框并显示

    }

    });

    //显示带单选列表对话框

    Button button3=(Button)findViewById(R.id.button3);

    button3.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    final String[] items=new String[]{"标准","无声","会议","户外","离线"};

    Builder builder=new AlertDialog.Builder(MainActivity.this);

    builder.setIcon(R.drawable.music);

    builder.setTitle("请选择要使用的情景模式:");

    builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener(){

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this, "您选择了"+items[which],Toast.LENGTH_SHORT).show();

    }

    });

    builder.setPositiveButton("确定", null);

    builder.create().show();//创建对话框并显示

    }

    });

    //显示带多选列表对话框

    Button button4=(Button)findViewById(R.id.button4);

    button4.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    checkedItems =new boolean[]{false,true,false,true,false};//记录各列表的状态

    //各列表项要显示的内容

    items=new String[]{"植物大战僵尸","愤怒的小鸟","泡泡龙","开心消消乐","地铁跑酷"};

    //显示带单选列表框的对话框

    Builder builder=new AlertDialog.Builder(MainActivity.this);

    builder.setIcon(R.drawable.setting);

    builder.setTitle("请选择您喜欢的游戏:");

    builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which, boolean isChecked) {

    checkedItems[which]=isChecked;

    }

    });

    //为对话框添加"确定"按钮

    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    String result="";

    for (int i = 0; i

    if(checkedItems[i]){

    result+=items[i]+"、";

    }

    }

    //当result不为空时,通过消息提示框显示选择的结果

    if(!"".equals(result)){

    result=result.substring(0,result.length()-1);//去掉最后的"、"号

    Toast.makeText(MainActivity.this, "您选择了:["+result+"]",Toast.LENGTH_SHORT).show();

    }

    }

    });

    builder.create().show();//创建对话框并显示

    }

    });

    }

    }

    效果如图:

    点击第一个按钮:

    1cb615572411f8f75e4319246217afe1.png

    点击第二个按钮:

    503b3c422717968390f175c90d01762e.png

    点击第三个按钮:

    9bfc089d2d0c2128251b62d819c8b3b7.png

    点击第四个按钮:

    a70dcb088bc0892f5ad9b96f49b0e4d7.png

    86c557ec1b20aa2115ecc965f87d162c.png

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • AS对话框

    2020-07-06 17:45:28
    一个对话框一般是一个出现当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能. Android API 支持下列类型的对话框...

    一.相关概念

    一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能.

    Android API 支持下列类型的对话框对象:

    (一)警告对话框 AlertDialog: 一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.
    (二)进度对话框 ProgressDialog: 显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.
    (三)日期选择对话框 DatePickerDialog: 让用户选择一个日期.
    (四)时间选择对话框 TimePickerDialog: 让用户选择一个时间

    二.AlertDialog的创建和使用

    AlertDialog是Dialog的一个直接子类,使用AlertDialog,我们可以显示一个标题,最多3个按钮操作,以及一组选择框或者是自己定义的弹出框。
    AlertDialog要使用Builder设计模式来创建对象 。

    (一)Dialog的创建和使用

    在时间应用中的对话框基本不用Dialog而是用它的子类。
    这里简单使用一下Dialog,代码如下:

    // 普通的对话框,普通的对话框功能很少,除非重写类
    public void bt1(View v) {
    // 创建对话框对象
    Dialog dialog = new Dialog(this);
    // 创建对话框内容
    dialog.setTitle(“对话框的标题”);
    // 显示对话框
    dialog.show();

    }
    

    运行后显示结果:
    在这里插入图片描述

    可以看到有一个标题的对话框,而且这里没有设置内容的属性,Dialog的使用方法和功能都是很少的,不建议使用。

    (二)比较正常的AlertDialog的创建和使用
    代码设计:

    // 警告对话框,需要用Builder方法创建
    public void bt2(View v) {
    // 这里的属性可以一直设置,因为每次设置后返回的是一个builder对象
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // 设置提示框的标题
    builder.setTitle(“提示标题”).
    // 设置提示框的图标
    setIcon(R.drawable.ic_launcher).
    // 设置要显示的信息
    setMessage(“文本的提示信息:你妈喊你回家吃饭了!”).
    // 设置确定按钮
    setPositiveButton(“确定”, new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "选择就确定哦", 0).show();
    
                    }
                }).
    
                // 设置取消按钮,null是什么都不做
                setNegativeButton("取消", null).
                // 设置退出按钮,在中间的按钮
                setNeutralButton("退出", new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 退出程序
                        finish();
    
                    }
                });
        // 生产对话框
        AlertDialog alertDialog = builder.create();
        // 显示对话框
        alertDialog.show();
    
    }
    

    程序运行后显示的结果:
    在这里插入图片描述

    这里如果点击取消,对话框消失,什么都没有做。
    如果点击退出,会直接退出程序。
    如果点击确定,会弹出一个土司,提示你。
    这里可以根据用户的选择做出相应的行为。

    (三)设计一个选择菜单样式的对话框
    代码设计:

    //数据源
    String[] array = new String[] { "音乐", "体育", "舞蹈", "看书" };
    
    // 显示一个菜单的对话框选项,点击选择菜单后,菜单会消失
    
    // 匿名类去创建
    public void bt3(View v) {
    
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 设置标题
        builder.setTitle("选择你最喜欢的课程").
        // 设置可选择的内容,并添加点击事件
                setItems(array, new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // which代表的是选择的标签的序列号
    
                        Toast.makeText(MainActivity.this, "选择" + array[which],
                                0).show();
    
                    }
                }).
                // 产生对话框,并显示出来
                create().show();
    
    }
    

    程序运行后显示的结果:
    在这里插入图片描述

    设置菜单是builder的setItem方法来完成的。
    点击某一个菜单选项后对话框会自动消失,所以这里设置按钮也是没有什么用处的。
    这里还能监听点击菜单的事件,获取用户的选择内容。

    (四)设置一个单选按钮菜单的对话框
    其实这个对话框和上面的菜单对话框差不多,只是样式改变了,还有一点不同的是点击一个选项后对话框是不会消失的,所以必须要设置按钮,来使对话框消失。

    代码设计:

    // 单选按钮的对话框,选择一个按钮值后,
    // 对话框也是不会自动消失,需要自己关闭
    // 要设置按钮,点击按钮后对话框才会消失
    public void bt4(View v) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // 设置标题
    builder.setTitle(“选择你最喜欢的课程”).
    // 设置可选择的内容,并添加点击事件
    // 第一个参数是可以选择的单选框的内容
    // 第二个参数是默认选中的项
    // 第三个参数是点击选中的监听器
    setSingleChoiceItems(array, 0, new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
    
                        Toast.makeText(MainActivity.this, "选择" + array[which],
                                0).show();
    
                    }
                }).
                // 因为对话框不会自动消失,所以要添加按钮的必要
                // 设置确定按钮
                setPositiveButton("确定", new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "选择确定", 0).show();
                    }
                }).
                // 取消,什么都不做,对话框消失而已
                setNegativeButton("取消", null).
                // 产生对话框,并显示出来
                create().show();
    
    }
    

    运行后的结果:
    在这里插入图片描述

    设置单选菜单是builder的setSingleChoiceItem方法来完成的。
    这里要可以设置两个监听事件,一个是单选按钮某一个选项被选中时触发的,另一个是点击按钮时触发的事件。
    程序中每次选中一个单选按钮都会弹出一个吐司,提示你选择的内容,点击确定后也会显示一个吐司。
    1
    2
    3

    (五)多选项的对话框设计
    多选框的显示和单选的显示也是有点相似的,都是需要设置按钮来使对话框消失。
    代码如下:

    // 多选按钮的对话框
    // 对话框也是不会自动消失,需要自己关闭
    // 要设置按钮,点击按钮后对话框才会消失
    public void bt5(View v) {

        // 多选按钮的默认状态
        boolean[] checkedItems = { true, false, false, true };
    
        // 多选按钮选中后保存的数据
        final List<String> list = new ArrayList<String>();
        // 默认的数据
        list.add("音乐");
        list.add("看书");
        // 创建对话框的builder对象
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    
        // 设置标题
        builder.setTitle("选择你最喜欢的课程").
        // 设置可选择的内容,并添加点击事件
        // 第一个参数是可以选择的选框的内容
        // 第二个参数是一个布尔数组,如果是true代表的是默认选中
        // 第三个参数是点击选中的监听器
                setMultiChoiceItems(array, checkedItems,
                        new OnMultiChoiceClickListener() {
    
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which, boolean isChecked) {
                                // 这里无论某个选项是被选中后被取消都会触发该方法
                                // which代表的是选中的是多少游标值的选项
                                // isChecked是代表该选项是或否选中了
                                // 判断如果集合中有某个数据,就把他移除,否则就添加数据
                                // 注意这里数选择之后的状态
                                if (isChecked) {
                                    // 添加数据
                                    list.add(array[which]);
                                } else {
                                    // 移除数据
                                    list.remove(array[which]);
                                }
    
                            }
                        }).
                // 因为对话框不会自动消失,所以要添加按钮的必要
                // 设置确定按钮
                setPositiveButton("确定", new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "你选中了" + list, 0)
                                .show();
                    }
                }).
                // 取消,什么都不做,对话框消失而已
                setNegativeButton("取消", null).
                // 产生对话框,并显示出来
                create().show();
    
    }
    

    程序运行后的结果:
    在这里插入图片描述

    设置多选菜单是builder的setMultiChoiceItem方法来完成的。
    这里要可以设置两个监听事件,一个是选项框的某一个选项的状态改变时触发的,另一个是点击按钮时触发的事件。
    程序中每次改变选项的内容,保存数据的集合都会改变,点击确定后也会显示一个吐司,显示集合里面的内容。

    选择全部内容后,确定,显示的结果:

    在这里插入图片描述

    (六)使用适配器显示对话框

    使用适配器显示对话框和显示菜单对话框类似,都是选中对应选项后,对话框自动消失,但是使用适配器可以显示很负责的界面。

    // 使用适配器显示对话框–>builder的setAdapter方法
    // 这里选择一个选项后,对话框就会关闭,所以是不需要设置按钮的
    // 其实这里可以设置很复杂的适配器对象,但是实际应用中不会在对话框显示太复杂的布局
    public void bt6(View v) {

        // 创建ArrayAdapter适配器
        // android.R.layout.simple_list_item_1是Android系统里面的简单布局
        // 第三个参数是数据源
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, array);
    
        // 创建对话框对象
        new AlertDialog.Builder(this).
        // 设置标题
                setTitle("使用适配器显示数据").
                // 添加适配器,并为适配器添加点击事件
                setAdapter(adapter, new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // which是选择的条目的游标值
                        Toast.makeText(MainActivity.this, "选择" + array[which],
                                0).show();
                    }
                }).
                // 产生并显示
                create().show();
    
    }
    

    运行程序后显示的结果:

    在这里插入图片描述

    设置多选菜单是builder的setAdapter方法来完成的。
    这里要设置一个监听事件,适配器的监听事件。
    这里点击某一个选项后,对话框消失,并土司选中的内容。

    (七)设计一个有输入框的对话框
    // 设置一个有输入文本的对话框---->builder的setView方法
    // 输入数据后,对数据进行处理
    // 这里要设置按钮,才能对数据的数据进行处理
    public void bt7(View v) {

        // 创建一个EditText对象
        final EditText et = new EditText(this);
    
        // 创建对话框对象
        new AlertDialog.Builder(this).
        // 设置标题
                setTitle("有输入框的对话框").
                // 添加输入的文本框
                setView(et).
                // 添加确定按钮
                setPositiveButton("确定", new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 获取输入的字符
                        String in = et.getText().toString();
                        Toast.makeText(MainActivity.this, "输入;" + in, 0).show();
                    }
                }).setNegativeButton("取消", null).
                // 产生并显示
                create().show();
    
    }
    

    运行后的结果:
    在这里插入图片描述

    设置输入框是builder的setView方法来完成的。
    这里要设置一个按钮监听事件。
    这里点击确定按钮后,获取输入框的内容并土司出来。

    (八)使用对话框内的控件控制对话框
    这里使用对话框内的一个布局文件的按钮,来关闭对话框

    // 使用对话框内的控件来关闭对话框
    public void bt8(View v) {
    
        // 创建一个EditText对象
        final Button btn = new Button(this);
        // 给按钮设置文字
        btn.setText("关闭对话框");
        // 创建对话框对象
        final AlertDialog dialog = new AlertDialog.Builder(this).
        // 设置标题
                setTitle("通过按钮关闭对话框").
                // 添加输入的文本框
                setView(btn).
                // 产生
                create();
    
        // 设置对话框不可以关闭,一般情况下对话框是失去焦点后自动消失的
        // 但是加 了.setCancelable(false),对话框就不会消失,除非手动退出
        dialog.setCancelable(false);
    
        btn.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // 点击后关闭对话框,两种方法都可以
                 dialog.cancel();
                //dialog.dismiss();
            }
        });
    
        // 显示
        dialog.show();
    
        //给对话框设置一个监听时间,对话框退出前会执行
        dialog.setOnDismissListener(new OnDismissListener() {
    
            @Override
            public void onDismiss(DialogInterface dialog) {
                // 只要关闭都会调用
                Toast.makeText(MainActivity.this, "关闭", Toast.LENGTH_SHORT)
                        .show();
            }
        });
    
    }
    

    运行结果:
    在这里插入图片描述

    这里设置了dialog.setCancelable(false);的属性,代表了对话框不能随着焦点的失去而消失对话框,要收到关闭对话框,要么设置确定和取消按钮,要么在对话框布局中设置能够关闭对话框的控件;

    (九)AlertDialog的详细属性
    对话框的全部属性表现,如图所示:

    在这里插入图片描述

    这里分上、中、下三部分。
    区域一是标题相关
    区域二是主体相关
    区域三是按钮相关

    其中任何部分都可以不设置,
    但是有一点要注意的是主体内容只能有一种,比如:设置了SetMessage不能再设置SetAdapter或SetView。因为设置了也不会显示的。

    1.区域1那里就是定义弹出框的头部信息
    包括标题名或者是一个图标。
    (1)setTitle : 为对话框设置标题
    (2)setIcon : 为对话框设置图标

    2.区域2那里是AlertDialog对话框的content部分
    在这里我们可以设置一些message信息,或者是定义一组选择框,还可以定义我们自己的布局弹出框。
    (1)setMessage: 为对话框设置内容,如果设置了其他内容,那么Message不要设置,否者只显示Message。
    (2)setView: 给对话框设置自定义View
    setItems: 设置对话框要显示的一个list,一般用于显示几个命令时
    //items是传入一个字符串数组,或者是R文件中的数组
    (3)setSingleChoiceItems: 用来设置对话框显示一系列的单选按钮
    (4)setMultiChoiceItems: 用来设置对话框显示一系列的复选框

    3.区域3那里使我们的Action Buttons部分
    这里我们可以定义我们的操作按钮。
    在AlertDialog中,定义按钮都是通过 setXXXButton 方法来完成,其中一共有3种不同的Action Buttons供我们选择:
    (1)setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
    这是一个相当于OK、确定操作的按钮.
    (2)setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
    这是一个相当于取消操作的按钮。

    (3)setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
    这个是相当于一个忽略操作的按钮。

    触发相关按钮都的行为都是我们程序员自己定的,比如你可以设置点击确定后关闭页面,也可以设置点击取消后关闭页面。但是我们设计的时候还是要按照大部分人的阅读习惯来设定。

    4.监听事件的说明
    在AlertDialog的各种设置中,都充斥着DialogInterface.OnClickListener,比如按钮,内容区的items,单选按钮等,只有多选按钮是用了另外一个监听
    DialogInterface.OnMultiChoiceClickListener。

    (1)单选按钮的监听
    public void onClick(DialogInterface dialog, int which);
    //which代表items,单选按钮中的序号

    (2)多选按钮的监听
    public void onClick(DialogInterface dialog, int which, boolean isChecked);
    //which代表items,单选按钮中的序号
    //isChecked代表当前点击的序号是否被勾选

    (3)Adapter的监听
    AlertDialog还支持ListAdapter的子类,我们可以传入各种ListAdapter的子类,来显示复杂的列表,当然直接使用 setView 也可以办到
    public Builder setAdapter(final ListAdapter adapter, final
    OnClickListener listener)

    三.ProgressDialog进度对话框

    ProgressDialog是AlertDialog类的子类,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。它的用处非常广泛,在每次用户操作一个延迟的任务时,我们都必须以进度对话框的形式告诉用户,否者用户并不知道操作已经开始,可能会多次操作同一个任务,并有可能导致异常发生。

    (一)构造方法和常用方法
    1.构造方法需要传入一个上下文
    public ProgressDialog(Context context)

    2.给定一个样式,带进度条和不带进度条的样式
    public void setProgressStyle(int style) //可选值
    //STYLE_SPINNER 默认 圆形,没有进度条的样式
    //STYLE_HORIZONTAL 给定进度条的样式

    3.设置进度最大值,需要给定STYLE_HORIZONTAL
    public void setMax(int max)

    4.是否能用返回键关闭 true可以关闭,false不能关闭
    public void setCancelable(boolean flag)

    5.设置一个消息
    public void setMessage(CharSequence message)

    6.判断Dialog是否显示
    public boolean isShowing()

    7.关闭对话框
    public void dismiss()

    8.ProgressDialog从AlertDialog中继承的常用方法setIcon和setTitile

    9.虽然ProgressDialog可以设置Button,但是我们一般都不会去使用它
    (二)进度对话框的设计的使用
    1.圆形进度条对话框
    // 显示圆形的进度框
    public void bt1(View v) {
    // 创建进度条的对话框
    ProgressDialog dialog = new ProgressDialog(this);
    // 设置进度条的样式,选择圆形或条状
    // 这里这圆形的
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    // 设置标题
    dialog.setTitle(“文件下载”);
    // 设置文本信息
    dialog.setMessage(“正在下载。。。”);
    // 设置是否能用后退键出对话框
    // 选择false就代表不能
    // 如果设置为false,程序可能退出不了
    dialog.setCancelable(true);
    // 显示对话框
    dialog.show();
    }

    程序运行后的结果:
    在这里插入图片描述

    这里点击进度对话框的其他地方,对话框就消失了。因为默认情况,对话框失去焦点就会消失。

    2.条形对话框
    // 显示设置水平的进度框
    public void bt2(View v) {
    // 创建进度条的对话框
    final ProgressDialog dialog = new ProgressDialog(this);
    // 设置进度条的样式,选择圆形或条状
    // 这里这圆形的
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    // 设置标题
    dialog.setTitle(“文件下载”);
    // 设置文本信息
    dialog.setMessage(“正在下载。。。”);
    // 设置是否能用后退键出对话框
    // 选择false就代表不能
    // 如果设置为false,程序可能退出不了
    dialog.setCancelable(false);
    // 显示对话框
    dialog.show();

        // 这里新建一个线程来,跟新进度和关闭页面
        new Thread(new Runnable() {
    
            @Override
            public void run() {
                // 获取进度值的当前的值
                int index = 0;
                // 跟新进度
                while (index < dialog.getMax()) {
                    index++;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 设置进度的值
                    dialog.setProgress(index);
    
                }
    
                // 完成任务后,退出对话框
                dialog.cancel();
    
            }
        }).start();
    
    }
    

    运行结果:
    在这里插入图片描述

    这个进度对话框是没有办法取消的,因为设置了:dialog.setCancelable(false);
    只能等到文件下载完成后对话框自动消失。这个设置在实际应用中也是会有用到的,比如复制文件,不能随便打断。本示例中,进度的跟新需要用子线程来更新,进度条的更新可以直接在子线程中实现,而其他布局的跟新是不能在子线程中直接更新的。要使用runOnUIThread();方法来更新主线程的界面,

    四.时间和日期选择器对话框
    (一)时间和日期对话框的方法
    DatePickerDialog与TimePickerDialog都继承于AlertDialog,基本方法和我们前面讲的DatePicker和TimePicker组件一样,只是需要调用Dialog的show方法来显示。在构造方法里需要传入回调监听

    1.用户改变时间后的监听
    public interface OnTimeChangedListener { void onTimeChanged(TimePicker view, int hourOfDay, int minute);
    }

    2.用户改变日期后的监听
    public interface OnDateChangedListener { void onDateChanged(DatePicker view, int year, int monthOfYear,
    int dayOfMonth);
    }

    (二)时间对话框的使用
    // 显示时间的对话框
    public void btn1(View v) {
    // 第一个参数是上下文
    // 第二个参数是监听时间选择后的事件
    // 后面两个数是默认是时间
    // 后一个是代表是否显示时间的格式是24小时制的
    TimePickerDialog dialog = new TimePickerDialog(this,
    new OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay,
                            int minute) {
                        Toast.makeText(MainActivity.this,
                                hourOfDay + "时" + minute + "分", 0).show();
    
                    }
                }, 21, 8, true);
    

    //显示标题
    dialog.setTitle(“选择你要设定的时间”);
    // 显示时间的对话框
    dialog.show();

    }
    

    运行后显示的结果:

    在这里插入图片描述

    这是时间对话框的选择按钮,其中也可以设置很多属性。
    这里点击完成后会弹出一个选择的时间的土司。
    如图所示:

    在这里插入图片描述

    (三)日期对话框的使用
    // 显示日期的对话框
    public void btn2(View v) {
    // 第一个参数是上下文
    // 第二个参数是监听时间选择后的事件
    // 后面三个数是默认是日期数
    DatePickerDialog dialog = new DatePickerDialog(this,
    new OnDateSetListener() {
    // 日期选择器上的月份是从0开始的

                    @Override
                    public void onDateSet(DatePicker view, int year,
                            int monthOfYear, int dayOfMonth) {
                        Toast.makeText(
                                MainActivity.this,
                                year + "年" + (monthOfYear + 1) + "月"
                                        + dayOfMonth + "日", 0).show();
    
                    }
                }, 2016, 11, 13);
        // 显示时间的对话框
        dialog.show();
    
    }
    

    点击运行后,显示结果:
    在这里插入图片描述

    上面是日期对话框的默认画面,也是挺好看的,实际中也可以根据实际需要对它的页面样式进行修改。
    点击完成后显示的结果:

    ————————————————
    版权声明:本文为CSDN博主「峥嵘life」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wenzhi20102321/article/details/52818351

    展开全文
  • 文章目录一、简单绘图二、设置对话框2.1 设置线宽2.2 设置线型 新建一个单文档类型的MFC工程,取名:Graphic。此程序将实现简单的绘图功能。 一、简单绘图 实现简单的绘图功能,包括点、直线和椭圆的绘制。为了实现...
  • 什么是电脑的菜单操作命令

    千次阅读 2021-07-27 00:23:21
    今天学习啦小编给大家介绍一下...一旦选择此命令,则菜单旁会显示出一个附加的子菜单,该子菜单列出了可用的子命令,从中选择想要的子命令即可执行。三是命令名后面跟;有省略号(…)是一种连接符号,表示一个尚未...
  • 南方CASS和AutoCAD快捷命令大全

    千次阅读 2020-12-22 01:01:54
    原标题:南方CASS和AutoCAD快捷命令大全A——画弧(ARC)AA——给实体加地物名B——自由连接C——画圆(CIRCLE)COPYCLIP——从不同窗口复制局部CP——拷贝(COPY)D——绘制电力线DD——通用绘图命令DDPTYPE——改变点...
  • 样式,大家应该不陌生,Word中是一个非常强大的功能,运用得好,可以节省很时间和精力。但如果你不会用,关键时刻可以把你急哭了!前面的“Word样式,简单又实用!”和“Word样式也有“快捷键”,你却不知道!...
  • 南方CASS快捷命令

    千次阅读 2021-01-15 23:13:34
    A——画弧(ARC)AA——给实体加地物名B——自由连接C——画圆(CIRCLE)COPYCLIP——从不同窗口复制局部CP——拷贝(COPY)D——绘制电力线DD——通用绘图命令DDPTYPE——改变点形状E——删除(ERASE)F——图形复制FF——...
  • MFC——对话框的创建及使用

    千次阅读 多人点赞 2020-04-09 17:50:11
    文章目录MFC对话框的创建实例对话框程序的创建过程:对话框应用程序框架介绍设计界面和工具箱MFC常用控件静态文本框CStatic普通按钮 CButton编辑框 CEdit组合框(下拉框)CComboBox列表控件 CListCtrl树控件 ...
  • 通过标注样式不仅可以设置标注线、箭头、文字的形式,还可以设置单位、精度、公差,由于有些图纸不是1:1绘制,标注样式中还提供了比例的设置。虽说标注样式比较复杂,参数非常,但标注样式的设置并不难,下面简单...
  • Android对话框的使用总结

    千次阅读 多人点赞 2016-10-14 19:15:17
    本文对各类对话框的设计和使用都有...一个对话框一般是一个出现当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能.
  • CAD画的线段显示不出来解决的方法命令行中输入直线的快捷命令“L”,敲击回车,工作区域中随意点击一下左键确认第一点指定下一点的提示下输入“1000”,这时候我们会发现CAD的绘图界面中不能完全显示该直线。...
  • 当然,条条大路通北京,没有更好的方法之前,不妨收藏这个字母命令学习法。今天带来字母T命令介绍。1、Table-表格功能绘制表格进行数据记录,是大家日常工作必不可少的步骤。尤其是从事机械制造方面的工作,对于...
  • 【摘要】环球网校分享的2017年职称计算机考试word2003考点字体格式设置希望对大家备考2017年职称计算机考试有帮助,更资料敬请关注环球职称计算机考试频道,网校会及时更新考试资讯…… 相关推荐:2017【摘要】...
  • Windows 95(B) Windows NT(C) Windows2000(D) Windows982、坐标输入方式主要有:ABC(A) 绝对坐标(B) 相对坐标(C) 极坐标(D) 球坐标3、 “AUTOCAD2002今日”对话框的“打开图形”选项卡用于打开已有图形,该选项卡...
  • CASS快捷命令大全

    千次阅读 2021-01-13 09:59:54
    CASS快捷命令大全时间:2017/11/22 15:10:00要学习cass,必不可少的是掌握一些快捷命令。下面是小编整理的cass快捷命令大全,希望对大家有帮助。cass快捷命令:dd —— 通用绘图命令a —— 画弧(arc)v —— 查看实体...
  • 斑马线是用来检查曲面光顺性常用的方法,CATIA...FreeStyle模块中点击等照度线映射分析 (Isophotes Mapping Analysis)命令,打开Isophotes Mapping Analysis对话框。使用此命令时视图的渲染样式应为Shading with ...
  • 天正建筑命令快捷键大全

    千次阅读 2021-07-26 04:09:38
    轴网菜单重排轴号 CPZH 改变图中一组轴线编号,该组编号自动...LDZB 选择起始轴与结束轴标注其中各轴号与尺寸墙生轴网 QSZW 已有墙中按墙基线生成定位轴线删除轴号 SQZH 已有轴网上删除轴号, 其余轴号自动重排...
  • 2、进入特性表之后,这里需要记住三个重要信息,一个是最上方的“文字”(当然你的可能是其他的,以你的为准),然后是“图层”后面的“1526”(你的可能不同,以你的名称为准)。...3、在命令栏输入“q”,...
  • L, *LINE 直线ML, *MLINE 多线(创建多条平行线)PL, *PLINE 多段线PE, *PEDIT 编辑多段线SPL, *SPLINE 样条曲线SPE, *SPLINEDIT 编辑样条曲线XL, *XLINE 构造线(创建无限长的线)A, *ARC 圆弧C...
  • cad快捷键命令大全

    千次阅读 2021-02-06 15:00:30
    今天给各位带来cad快捷键命令大全。CAD快捷键A 圆弧SETTVAR 设置变量B 创建块LA 图层C 圆COLOR 颜色D 标注样式管理器LT 线型管理E 删除LW 线宽管理F 圆角UN 单位管理G 群组TH 厚度H 图案填充I 插入块Ctrl+L 直线Ctrl...
  • AUTOCAD——点命令

    千次阅读 2022-03-09 10:59:36
    CAD中有多种不同的表现形式,用户可以根据需要进行设置,也可以设置等分点和测量点。 点 1.执行方式 命令行:POINT 菜单栏:绘图→点 ...可以通过“DDPTYPE”命令或选择菜单栏中的“格式”→“点样式对话框
  • 《AutoCAD计算机绘图 第五章 尺寸标注.ppt》由会员分享,可在线阅读,更相关《AutoCAD计算机绘图 第五章 尺寸标注.ppt(13页珍藏版)》请人人文库网上搜索。1、5 尺寸标注,学习目标,1.掌握尺寸标注的规则及尺寸...
  • 《天正建筑快捷键命令大全 2》由会员分享,可在线阅读,更相关《天正建筑快捷键命令大全 2(10页珍藏版)》请人人文库网上搜索。1、天正建筑命令快捷键大全一轴网菜单 CPZH 改变图中一组轴线编号,该组编号自动...
  • 文章目录一、基于对话框的程序二、“逃跑”的按钮三、属性表单和向导的创建3.1 创建属性页 一、基于对话框的程序 新建一个基于对话框的项目,项目名称:DlgTest。 生成的项目结构为: 解决方案结构: 类视图下有三...
  • CAD中英语词汇及命令大全对于从事CAD相关职业的朋友来说,加深认识CAD中英语词汇及命令是很有必要的,今天小编特意整理了这些东西,希望对大家有帮助!2D Solid 二维实体 2D 实面2D Wireframe 二维线框3D Array 三维...
  • 一、100个快捷键重点:1.创建直线的快捷方式是L+空格2. 创建圆的快捷方式是C+空格3. 创建圆弧的快捷方式是A+空格4. 创建矩形的快捷方式是REC+空格5. 创建点的快捷方式是PO+空格6. 创建单行文本的命令是DT7. 创建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,581
精华内容 4,632
关键字:

在格式多线样式命令对话框