精华内容
下载资源
问答
  • 关于WebStorm的document文档窗口的测试【documentation】在WebStorm中的几种形式基本打开方式方式一,Ctrl + Q切换方式二,进入小窗口后,点击右上角【设置】按钮,选择【Open as Tool Window】对【documentation】...

    【documentation】在WebStorm中的几种形式

    基本打开方式

    方式一,Ctrl + Q切换

    Ctrl + Q 的基本作用,就是打开【代码方法文档】的几种窗口模式。

    第一次:打开简化小窗口。
    第二次:打开右侧大窗口。
    第三次:隐藏。

    这里,是严格按照顺序切换的。小窗口——大窗口——隐藏——小窗口,这样的形式。

    方式二,进入小窗口后,点击右上角【设置】按钮,选择【Open as Tool Window】

    这样,是比较直观和原始的方式。
    因为:

    1. WebStorm默认会在焦点处于某段代码时(即没有使用 Ctrl + Q 的时候),弹出【代码提示】小窗口。此时,最方便的,自然是在小窗口上,用鼠标进行按钮操作。
    2. 有时候,你会不记得 Ctrl + Q 快捷键,但是图形化操作,会自然地把你带到【Open as Tool Window】这个地方。

    对【documentation】这个窗口的研究

    其它的窗口

    放置位置

    可以四处拖动。总共有六个位置可供选择:

    1. 左边栏的上部。
    2. 左边栏的下部。
    3. 右边栏的上部。
    4. 右边栏的下部。
    5. 下边栏的左部。
    6. 下边栏的右部。

    特别注意:属于不同位置的窗口,可以同时在一个屏幕内显示(最多六个窗口)。属于同一位置的窗口,后出现的窗口会把前出现的窗口覆盖。

    和IDE的嵌入关系 参考资料:点这里

    PHPStorm - IDE中文说明手册
    WebStorm - IDE中文说明手册
    模式 具体表现 特殊限制
    Docked Mode 停靠模式,Tool Window 是否和IDE窗口侧边栏耦合成一个整体 如果是非停靠模式,则会简单粗暴覆盖当前位置其它窗口
    Pined Mode 是否锁定出现(如果关闭,则焦点移开时,会自动隐藏) 只有在 Docked Mode 开启的前提下,才会出现
    (标注) Docked Mode 和 Pined Mode ,都属于 Fixed Mode
    Floating Mode 无边框内部窗口模式,显示在IDE窗口之内,但是位于所有IDE元素的顶层
    Windowed Mode 有边框外部窗口模式,独立显示在IDE窗口之外。本质是一个单独的Microsoft 系统窗口。
    Split Mode 即如果是【左边栏】,则移动到左边栏的下部。如果是【右边栏】,则移动到右边栏的下部。如果是【下边栏】,则移动到下边栏的右部。 本质上,可以理解为,区分【主要窗口】和【次要二级窗口】。
    Sort By Type 是否根据文件类型排序
    AutoScroll To Source (根据当前Tool Window所选文件)编辑区自动滚动到源文件所在。
    AutoScroll From Source (根据编辑区所选择的当前源文件)Tool Window自动滚动到所选文件位置。
    Remove from Sidebar 将当前Tool Window从任意一个侧边栏,去除。(添加时,从Tool-Window里面,选择)。 似乎是去除Tool菜单窗口的唯一方式。
    Group Tabs 如果一个菜单窗口,有多个tab,可以选择折叠,或平铺。 只有少部分菜单窗口,有这功能,比如Project。
    Wide Screen Support 用于很宽的那种屏幕。左边栏和右边栏的高度,会一直到底。下边栏会被夹在左边栏和右边栏中间。 Idea官方文档——宽屏支持及设置

    这个【documentation】窗口

    1. 可以使用【Float Mode】模式,浮动于IDE窗口内部顶层。
    2. 可以使用【Windowed Mode】模式,以一个独立Microsoft窗口的模式出现。
    3. 但是【Pined Mode】模式对其无效。无论怎么设置,它都是无法自动缩回的。

    这个就是【documentation】天坑一般的存在。

    对于其它【代码】提示的设置。

    1. 鼠标移到上面,500ms后自动弹出代码提示。(需要打开【Show quick documentation on mouse move】开关)
    2. Ctrl + Q,可以手动调用【代码提示】的切换模式。
    3. 可以为【documentation】窗口,添加快捷键 Setting——Keymap,这样可以一键调出 【documentation】大窗口。(但是因为【documentation大窗口】的局限,根本没必要。)

    【鼠标移动上面自动弹出代码提示】参考资料:
    idea关闭Documentation窗口
    IntelliJ idea鼠标移动到类上显示文档document(javadoc)内容

    展开全文
  • 关于窗口重画初级问题 初初级问题: 我在视图画图象或者文字,当窗口改变后(包括最小化后还原,被别窗口挡住后重新显示等)为什么不见了? 这 就是窗口重绘或者说重画问题。当窗口改变后,会产生无效...

    关于窗口重画的初级问题

    初初级问题:

    我在视图画的图象或者文字,当窗口改变后(包括最小化后还原,被别的窗口挡住后重新显示等)为什么不见了?

     

    这 就是窗口重绘或者说重画的问题。当窗口改变后,会产生无效区域,这个无效的区域需要重画。什么是无效区域?自己到网上搜索或者看相关资料。我这里给出一个 特殊的解释:以最小化后还原为例,假设只有一个程序在运行,窗口最小化时显示计算机桌面,并不妨假设桌面是蓝色的背景,当窗口还原时,窗口所占的这一块区 域该显示些什么东西呢?操作系统并不知道,因此,就形成一块无效区域。要是我们告诉操作系统,显示一个红方块,于是它就显示一个红方块,我们的程序过一会 想显示一个绿方块呢?同样也要告诉它。在哪里告诉它呢?在OnDraw或OnPaint函数这里(这里不准备讨论他们的区别,并且只关注OnDraw)。OnDraw函数在什么时候执行呢?在存在无效区域窗口需要重绘时执行。

     

    下面开始做例子(为简化程序,不显示方块显示线条),建立一个SDI工程,并添加一个菜单项DrawLine,添加OnDrawline函数:

    显示线条A(20,20,50,50)

    void CDrawView::OnDrawline()

    {

           // TODO: Add your command handler code here

           CClientDC dc(this);

           dc.MoveTo(20,20);

           dc.LineTo(50,50);

    }

    编译运行,出现一个线条,最小化还原,没有了。更改OnDraw函数:

    显示线条B(100,100,70,70)

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           pDC->MoveTo(100,100);

           pDC->LineTo(70,70);

    }

    运行,最小化还原,你会发现线条B一直存在,线条A没有了。

     

    到这里,你应该有一个疑问:我们新建一个SDI程序,什么都没做啊,为什么这个时候还是能显示菜单,框架这些东西?我们并没有告诉操作系统要显示什么啊?这是因为一般Windows会发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。

     

    初级问题:

    我要在菜单函数里面画图怎么办?或者说,我希望点击菜单就画图,不想把代码放在OnDraw里面。

     

    这个问题主要是思路没有转过弯来。其实很简单,在菜单函数里面设置一个开关,然后在OnDraw里面根据这个开关来决定是否显示就可以了。例如:

    BOOL bShowLineA=FALSE;

    void CDrawView::OnDrawline()

    {

           // TODO: Add your command handler code here

           bShowLineA=TRUE;

            Invalidate();//这个函数暂时只需要知道是用来“调用”OnDraw函数的

    }

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

            if(bShowLineA)

           {

               pDC->MoveTo(20,20);

              pDC->LineTo(50,50);

           }    

    }

    单击菜单项DrawLine就会画线条A,当然你还可以再搞一个函数令bShowLineA=FALSE达到删除线条的目的。

     

    上述做法存在很大局限:必须事先知道要画什么图。考虑这样一种情况:我们用鼠标画图,鼠标按下时决定开始线条开始点,鼠标弹起时决定结束点并画图。你也许会说,还是可以用上面的做法啊,用变量来代替数字就可以了,例如:

    void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

    {

           // TODO: Add your message handler code here and/or call default

           start=point;

           CView::OnLButtonDown(nFlags, point);

    }

    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

    {

           // TODO: Add your message handler code here and/or call default

           end=point;

           Invalidate();

           CView::OnLButtonUp(nFlags, point);

    }

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           pDC->MoveTo(start.x,start.y);

           pDC->LineTo(end.x,end.y);

    }

    这样的确是可以解决一部分问题,考虑更复杂的情况:画若干条线条,还要画一些圆、正方形,甚至还要显示一行文字。这个时候上面的方法就不太适合了。但原理是一样的:在菜单函数里面计算,保存数据结果,通知系统更新;在OnDraw函数里面根据新的结果数据进行重画。在菜单函数里面如何保存数据结果呢?可以使用一个结构(或者类)保存在内存里(例如可以使用数组,链表等等方式),也可以把数据保存在一个文件里,然后,在OnDraw里面读取这个结构(前面说的数组、链表、文件等)的数据进行重画。总之,具体问题具体分析。

     

    记住一个大原则:画图代码(确切的说是用来显示的代码)放在OnDraw里面。

     

    那么,是不是任何时候画图代码都必须要放在OnDraw里面?也不全是,例如操作的一些中间过程就要放在其他函数。一个经典的例子是用鼠标画直线,并且动态显示中间画图过程,鼠标弹起才最终决定最后的直线。那么,在鼠标移动事件中就要动态的画线了,然后保存最终结果,在OnDraw里面只需要画这个最终结果就可以了。当然,这个中间过程其实还是可以放到OnDraw里面来的。特别是一些复杂的图形处理,例如画不规则图形,就需要开一个线程专门用来计算显示画线的过程,这个不在我们讨论范围之内。

     

    我还发现一个初学者有趣的心理活动,包括我自己也是一样的,就是舍不得在OnDraw里面放较多的代码。如下:

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           pDC->MoveTo(start.x,start.y);

           pDC->LineTo(end.x,end.y);

            ....

            下面还有很多的画图的代码。

    }

    上面这种情况他们总是担心会不会效率太低了?因为窗口动不动就要刷新,这么多代码会不会太慢了?但是,要是下面这样的代码他们就放心多了:

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           fun();

    }

    fun

    {

    很多很多很多的画图的代码

    }

    呵呵,有时候我跟别人说,把画图代码放在OnDraw里面,他们就会认为,每一行代码都放到OnDraw里面。

     

    还 有一些“顽固分子”说,我把画图的代码放在菜单函数里面,然后禁止窗口重画就行了,然后到处去问怎么禁止窗口自动重画。他们都忽略了一个事实,显示器只有 一个!他们都把窗口当作一个个的实体了。他们的想法是:把这个窗口画好了,就再也不动了,最小化吗?好办,请工人把这个窗口拿走,就可以看到后面的窗口 了,还原,就让工人再搬回来就是了。可事实是:窗口(显示器)永远都只有一个。我们只看显示器里面中间的一个象素点:这个时候,这个点在我们的程序里面是 红色的,然后把我们的窗口最小化,这个点并没有随着我们的窗口跑掉啊,它还是在那里,可是下一个窗口是绿色的,你说,这个时候是不是要重新把这个点涂成绿 色的?这就是重画。还原时,又要重新把它涂成红色,如此反复。

     

    觉得太罗嗦,好像还没说清楚,累啊^_^

    ------------------------------------------------------------------------------
    由UpdateData(FALSE)想到的窗口刷新问题
    作者:zuilang
    一,前言
        有网友提醒我:“在MSDN裡面能找到的東西,再寫BLOG是要被罵的。”确实,全抄MSDN没有一点意思,但加一点自己的理解,或许对初学者有一点用。因此,首先声明,本文适合MFC初学者。
    二,前提知识
    2关于Invalidate、InvalidateRect和UpdateWindow
        以下资料来源不祥,似乎是vckbase讨论的(不保证每一句都正确,如有错误,请指出)。
    (1)Invalidate
           Invalidate标记一个需要重绘的无效 区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。以为您 Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理才得以进行。
           Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放函数哪个地方,(作用相当于)都是(放在)最后的(但并不是推荐你一律放在函数最后一行)。
           Invalidate()之后:...OnPaint()->OnPrepareDC()->OnDraw(),所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。
     
    (2)InvalidateRect
           InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效,InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。
           InvalidateRect(hWnd,&rect,TRUE);向 hWnd窗体发出WM_PAINT的消息,强制客户区域重绘制,rect是你指定要刷新的区域,此区域外的客户区域不被重绘,这样防止客户区域的一个局部 的改动,而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE,则还向窗体发送WM_ERASEBKGND消息,使背景重绘,当然在客户区域重绘 之前。
     
    (3)UpdateWindow
           UpdateWindow只向窗体发送 WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送 WM_PAINT。如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则 UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息 不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后 的语句。(windows程序设计第5版 P98)
    三,问题
        初学者很容易碰到下面这个问题:(其中m_nEdit是一个编辑框的int型成员变量)
    void CTestDlg::OnButton1()
    {
           // TODO: Add your control notification handler code here
           for(int i=0;i<10;i++)
           {
                  m_nEdit=i;
                  UpdateData(FALSE);
           }
    }
        程序运行的结果是,编辑框里面直接就显示了9,是程序运行太快了看不清楚吗?改:
    void CTestDlg::OnButton1()
    {
           // TODO: Add your control notification handler code here
           for(int i=0;i<10;i++)
           {
                  m_nEdit=i;
                  Sleep(1000);
                  UpdateData(FALSE);
           }
    }关于窗口重画的初级问题

    初初级问题:

    我在视图画的图象或者文字,当窗口改变后(包括最小化后还原,被别的窗口挡住后重新显示等)为什么不见了?

     

    这 就是窗口重绘或者说重画的问题。当窗口改变后,会产生无效区域,这个无效的区域需要重画。什么是无效区域?自己到网上搜索或者看相关资料。我这里给出一个 特殊的解释:以最小化后还原为例,假设只有一个程序在运行,窗口最小化时显示计算机桌面,并不妨假设桌面是蓝色的背景,当窗口还原时,窗口所占的这一块区 域该显示些什么东西呢?操作系统并不知道,因此,就形成一块无效区域。要是我们告诉操作系统,显示一个红方块,于是它就显示一个红方块,我们的程序过一会 想显示一个绿方块呢?同样也要告诉它。在哪里告诉它呢?在OnDraw或OnPaint函数这里(这里不准备讨论他们的区别,并且只关注OnDraw)。OnDraw函数在什么时候执行呢?在存在无效区域窗口需要重绘时执行。

     

    下面开始做例子(为简化程序,不显示方块显示线条),建立一个SDI工程,并添加一个菜单项DrawLine,添加OnDrawline函数:

    显示线条A(20,20,50,50)

    void CDrawView::OnDrawline()

    {

           // TODO: Add your command handler code here

           CClientDC dc(this);

           dc.MoveTo(20,20);

           dc.LineTo(50,50);

    }

    编译运行,出现一个线条,最小化还原,没有了。更改OnDraw函数:

    显示线条B(100,100,70,70)

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           pDC->MoveTo(100,100);

           pDC->LineTo(70,70);

    }

    运行,最小化还原,你会发现线条B一直存在,线条A没有了。

     

    到这里,你应该有一个疑问:我们新建一个SDI程序,什么都没做啊,为什么这个时候还是能显示菜单,框架这些东西?我们并没有告诉操作系统要显示什么啊?这是因为一般Windows会发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。

     

    初级问题:

    我要在菜单函数里面画图怎么办?或者说,我希望点击菜单就画图,不想把代码放在OnDraw里面。

     

    这个问题主要是思路没有转过弯来。其实很简单,在菜单函数里面设置一个开关,然后在OnDraw里面根据这个开关来决定是否显示就可以了。例如:

    BOOL bShowLineA=FALSE;

    void CDrawView::OnDrawline()

    {

           // TODO: Add your command handler code here

           bShowLineA=TRUE;

            Invalidate();//这个函数暂时只需要知道是用来“调用”OnDraw函数的

    }

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

            if(bShowLineA)

           {

               pDC->MoveTo(20,20);

              pDC->LineTo(50,50);

           }    

    }

    单击菜单项DrawLine就会画线条A,当然你还可以再搞一个函数令bShowLineA=FALSE达到删除线条的目的。

     

    上述做法存在很大局限:必须事先知道要画什么图。考虑这样一种情况:我们用鼠标画图,鼠标按下时决定开始线条开始点,鼠标弹起时决定结束点并画图。你也许会说,还是可以用上面的做法啊,用变量来代替数字就可以了,例如:

    void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

    {

           // TODO: Add your message handler code here and/or call default

           start=point;

           CView::OnLButtonDown(nFlags, point);

    }

    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

    {

           // TODO: Add your message handler code here and/or call default

           end=point;

           Invalidate();

           CView::OnLButtonUp(nFlags, point);

    }

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           pDC->MoveTo(start.x,start.y);

           pDC->LineTo(end.x,end.y);

    }

    这样的确是可以解决一部分问题,考虑更复杂的情况:画若干条线条,还要画一些圆、正方形,甚至还要显示一行文字。这个时候上面的方法就不太适合了。但原理是一样的:在菜单函数里面计算,保存数据结果,通知系统更新;在OnDraw函数里面根据新的结果数据进行重画。在菜单函数里面如何保存数据结果呢?可以使用一个结构(或者类)保存在内存里(例如可以使用数组,链表等等方式),也可以把数据保存在一个文件里,然后,在OnDraw里面读取这个结构(前面说的数组、链表、文件等)的数据进行重画。总之,具体问题具体分析。

     

    记住一个大原则:画图代码(确切的说是用来显示的代码)放在OnDraw里面。

     

    那么,是不是任何时候画图代码都必须要放在OnDraw里面?也不全是,例如操作的一些中间过程就要放在其他函数。一个经典的例子是用鼠标画直线,并且动态显示中间画图过程,鼠标弹起才最终决定最后的直线。那么,在鼠标移动事件中就要动态的画线了,然后保存最终结果,在OnDraw里面只需要画这个最终结果就可以了。当然,这个中间过程其实还是可以放到OnDraw里面来的。特别是一些复杂的图形处理,例如画不规则图形,就需要开一个线程专门用来计算显示画线的过程,这个不在我们讨论范围之内。

     

    我还发现一个初学者有趣的心理活动,包括我自己也是一样的,就是舍不得在OnDraw里面放较多的代码。如下:

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           pDC->MoveTo(start.x,start.y);

           pDC->LineTo(end.x,end.y);

            ....

            下面还有很多的画图的代码。

    }

    上面这种情况他们总是担心会不会效率太低了?因为窗口动不动就要刷新,这么多代码会不会太慢了?但是,要是下面这样的代码他们就放心多了:

    void CDrawView::OnDraw(CDC* pDC)

    {

           CDrawDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           fun();

    }

    fun

    {

    很多很多很多的画图的代码

    }

    呵呵,有时候我跟别人说,把画图代码放在OnDraw里面,他们就会认为,每一行代码都放到OnDraw里面。

     

    还 有一些“顽固分子”说,我把画图的代码放在菜单函数里面,然后禁止窗口重画就行了,然后到处去问怎么禁止窗口自动重画。他们都忽略了一个事实,显示器只有 一个!他们都把窗口当作一个个的实体了。他们的想法是:把这个窗口画好了,就再也不动了,最小化吗?好办,请工人把这个窗口拿走,就可以看到后面的窗口 了,还原,就让工人再搬回来就是了。可事实是:窗口(显示器)永远都只有一个。我们只看显示器里面中间的一个象素点:这个时候,这个点在我们的程序里面是 红色的,然后把我们的窗口最小化,这个点并没有随着我们的窗口跑掉啊,它还是在那里,可是下一个窗口是绿色的,你说,这个时候是不是要重新把这个点涂成绿 色的?这就是重画。还原时,又要重新把它涂成红色,如此反复。

     

    觉得太罗嗦,好像还没说清楚,累啊^_^

    ------------------------------------------------------------------------------
    由UpdateData(FALSE)想到的窗口刷新问题
    作者:zuilang
    一,前言
        有网友提醒我:“在MSDN裡面能找到的東西,再寫BLOG是要被罵的。”确实,全抄MSDN没有一点意思,但加一点自己的理解,或许对初学者有一点用。因此,首先声明,本文适合MFC初学者。
    二,前提知识
    2关于Invalidate、InvalidateRect和UpdateWindow
        以下资料来源不祥,似乎是vckbase讨论的(不保证每一句都正确,如有错误,请指出)。
    (1)Invalidate
           Invalidate标记一个需要重绘的无效 区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。以为您 Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理才得以进行。
           Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放函数哪个地方,(作用相当于)都是(放在)最后的(但并不是推荐你一律放在函数最后一行)。
           Invalidate()之后:...OnPaint()->OnPrepareDC()->OnDraw(),所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。
     
    (2)InvalidateRect
           InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效,InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。
           InvalidateRect(hWnd,&rect,TRUE);向 hWnd窗体发出WM_PAINT的消息,强制客户区域重绘制,rect是你指定要刷新的区域,此区域外的客户区域不被重绘,这样防止客户区域的一个局部 的改动,而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE,则还向窗体发送WM_ERASEBKGND消息,使背景重绘,当然在客户区域重绘 之前。
     
    (3)UpdateWindow
           UpdateWindow只向窗体发送 WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送 WM_PAINT。如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则 UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息 不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后 的语句。(windows程序设计第5版 P98)
    三,问题
        初学者很容易碰到下面这个问题:(其中m_nEdit是一个编辑框的int型成员变量)
    void CTestDlg::OnButton1()
    {
           // TODO: Add your control notification handler code here
           for(int i=0;i<10;i++)
           {
                  m_nEdit=i;
                  UpdateData(FALSE);
           }
    }
        程序运行的结果是,编辑框里面直接就显示了9,是程序运行太快了看不清楚吗?改:
    void CTestDlg::OnButton1()
    {
           // TODO: Add your control notification handler code here
           for(int i=0;i<10;i++)
           {
                  m_nEdit=i;
                  Sleep(1000);
                  UpdateData(FALSE);
           }
    }
        程序开始没有变化,静静运行了一会,直接显示9!看来不是显示太快的原因。
    四,思考
        因为UpdateData(FALSE)是更新窗口(编辑框也是窗口)的内容,当然也会更新窗口的“画面”,那么,是不是也是跟Invalidate、InvalidateRect一样的问题呢?尝试一下:
    void CTestDlg::OnButton1()
    {
           // TODO: Add your control notification handler code here
           for(int i=0;i<10;i++)
           {
                  m_nEdit=i;
                  Sleep(100);//去掉这一句在这里确实因为显示太快而看不清。
                  UpdateData(FALSE);
                  UpdateWindow();
           }
    }
        终于得到我们要的结果了^_^。那么UpdateData(FALSE)到底做了什么?想了解,就去看深入浅出MFC。
        程序开始没有变化,静静运行了一会,直接显示9!看来不是显示太快的原因。
    四,思考
        因为UpdateData(FALSE)是更新窗口(编辑框也是窗口)的内容,当然也会更新窗口的“画面”,那么,是不是也是跟Invalidate、InvalidateRect一样的问题呢?尝试一下:
    void CTestDlg::OnButton1()
    {
           // TODO: Add your control notification handler code here
           for(int i=0;i<10;i++)
           {
                  m_nEdit=i;
                  Sleep(100);//去掉这一句在这里确实因为显示太快而看不清。
                  UpdateData(FALSE);
                  UpdateWindow();
           }
    }
        终于得到我们要的结果了^_^。那么UpdateData(FALSE)到底做了什么?想了解,就去看深入浅出MFC。

    转载于:https://www.cnblogs.com/sideny/p/3278779.html

    展开全文
  • 【1、最基本弹出窗口代码】其实代码非常简单: window.open (page.html)--> 因为这是一段javascripts代码,所以它们应该放在标签和之间。是对一些版本低浏览器起作用,在这些老浏览器中不会将标签中代码作为...

    【1、最基本的弹出窗口代码】
    其实代码非常简单:
    <SCRIPT LANGUAGE="javascript">
    <!--
    window.open ('page.html')
    -->
    </SCRIPT>

     因为这是一段javascripts代码,所以它们应该放在<SCRIPT LANGUAGE="javascript">标签和</script>之间。<!-- 和 -->是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。
     window.open ('page.html') 用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。
     用单引号和双引号都可以,只是不要混用。
     这一段代码可以加入HTML的任意位置,<head>和</head>之间可以,<body>间</body>也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。

     【2、经过设置后的弹出窗口】
     下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。

    <SCRIPT LANGUAGE="javascript">
    <!--
    window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
    //写成一行
    -->
    </SCRIPT>

     参数解释:

    <SCRIPT LANGUAGE="javascript"> js脚本开始;
    window.open 弹出新窗口的命令;
    'page.html' 弹出窗口的文件名;
    'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替;
    height=100 窗口高度;
    width=400 窗口宽度;
    top=0 窗口距离屏幕上方的象素值;
    left=0 窗口距离屏幕左侧的象素值;
    toolbar=no 是否显示工具栏,yes为显示;
    menubar,scrollbars 表示菜单栏和滚动栏。
    resizable=no 是否允许改变窗口大小,yes为允许;
    location=no 是否显示地址栏,yes为允许;
    status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
    </SCRIPT> js脚本结束

     【3、用函数控制弹出窗口】
     下面是一个完整的代码。
    <html>
    <head>
    <script LANGUAGE="JavaScript">
    <!--
    function openwin() {
    window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
    //写成一行
    }
    //-->
    </script>
    </head>
    <body οnlοad="openwin()">
    ...任意的页面内容...
    </body>
    </html>

     这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。
    怎么调用呢?

     方法一:<body οnlοad="openwin()"> 浏览器读页面时弹出窗口;
     方法二:<body οnunlοad="openwin()"> 浏览器离开页面时弹出窗口;
     方法三:用一个连接调用:
    <a href="#" οnclick="openwin()">打开一个窗口</a>
    注意:使用的“#”是虚连接。
     方法四:用一个按钮调用:
    <input type="button" οnclick="openwin()" value="打开窗口">

     【4、同时弹出2个窗口】

     对源代码稍微改动一下:
    <script LANGUAGE="JavaScript">
    <!--
    function openwin() {
    window.open ("page.html", "newwindow", "height=100, width=100, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
    //写成一行
    window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
    //写成一行
    }
    //-->
    </script>

     为避免弹出的2个窗口覆盖,用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。
    注意:2个窗口的name(newwindows和newwindow2)不要相同,或者干脆全部为空。OK?

     【5、主窗口打开文件1.htm,同时弹出小窗口page.html】

     如下代码加入主窗口<head>区:

    <script language="javascript">
    <!--
    function openwin() {
    window.open("page.html","","width=200,height=200")
    }
    //-->
    </script>
    加入<body>区:
    <a href="1.htm" οnclick="openwin()">open</a>即可。

     【6、弹出的窗口之定时关闭控制】

     下面我们再对弹出的窗口进行一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则...),让它10秒后自动关闭是不是更酷了?

     首先,将如下代码加入page.html文件的<head>区:
    <script language="JavaScript">

    function closeit() {

    setTimeout("self.close()",10000) //毫秒

    }

    </script>
     然后,再用<body οnlοad="closeit()"> 这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。)

     【7、在弹出窗口中加上一个关闭按钮】
    <FORM>
    <INPUT TYPE='BUTTON' VALUE='关闭' onClick='window.close()'>
    </FORM>
    呵呵,现在更加完美了!

     【8、内包含的弹出窗口-一个页面两个窗口】

    上面的例子都包含两个窗口,一个是主窗口,另一个是弹出的小窗口。
    通过下面的例子,你可以在一个页面内完成上面的效果。

    <html>
    <head>
    <SCRIPT LANGUAGE="JavaScript">
    function openwin()
    {
    OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");
    //写成一行
    OpenWindow.document.write("<TITLE>例子</TITLE>")
    OpenWindow.document.write("<BODY BGCOLOR=#ffffff>")
    OpenWindow.document.write("<h1>Hello!</h1>")
    OpenWindow.document.write("New window opened!")
    OpenWindow.document.write("</BODY>")
    OpenWindow.document.write("</HTML>")
    OpenWindow.document.close()
    }
    </SCRIPT>
    </head>
    <body>
    <a href="#" οnclick="openwin()">打开一个窗口</a>
    <input type="button" οnclick="openwin()" value="打开窗口">
    </body>
    </html>

     看看 OpenWindow.document.write()里面的代码不就是标准的HTML吗?只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。

     【9、终极应用--弹出的窗口之Cookie控制】

     回想一下,上面的弹出窗口虽然酷,但是有一点小毛病(沉浸在喜悦之中,一定没有发现吧?)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页),那么每次刷新这个页面,窗口都会弹出一次,是不是非常烦人?:-(
     有解决的办法吗?Yes! ;-) Follow me.
     我们使用cookie来控制一下就可以了。
     首先,将如下代码加入主页面HTML的<HEAD>区:

    <script>
    function openwin(){
    window.open("page.html","","width=200,height=200")
    }
    function get_cookie(Name) {
    var search = Name + "="
    var returnvalue = "";
    if (document.cookie.length > 0) {
    offset = document.cookie.indexOf(search)
    if (offset != -1) {
    offset += search.length
    end = document.cookie.indexOf(";", offset);
    if (end == -1)
    end = document.cookie.length;
    returnvalue=unescape(document.cookie.substring(offset, end))
    }
    }
    return returnvalue;
    }

    function loadpopup(){
    if (get_cookie('popped')==''){
    openwin()
    document.cookie="popped=yes"
    }
    }

    </script>

     然后,用<body οnlοad="loadpopup()">(注意不是openwin而是loadpop啊!)替换主页面中原有的<BODY>这一句即可。你可以试着刷新一下这个页面或重新进入该页面,窗口再也不会弹出了。

    展开全文
  • 根据查询资料学习了一下创建MFC 并且嵌入窗口,环境win10,VS2017.首次输出时提示MSB 8011错误可通过以管理员身份运行VS解决
  • Mac OS 关于窗口操作快捷键区别

    千次阅读 2017-03-02 10:11:18
    开始用苹果不久,始终很疑惑为何苹果有很多相似的窗口操作功能,最近找了些资料发现其中区别,还是有必要: 1. ⌘+H (command+H, Hide): 隐藏窗口;系统判定你可能马上还要用此程序,只是想暂时隐藏,可以用...

    开始用苹果不久,始终很疑惑为何苹果有很多相似的窗口操作功能,最近找了些资料发现其中区别,还是有必要的:

    1. ⌘+H (command+H, Hide): 隐藏窗口;系统判定你可能马上还要用此程序,只是想暂时隐藏,可以用Command+tab调出

       ⌘+Alt+H:隐藏所有其他程序窗口(除当前窗口外)。

    2. ⌘+M (command+M, Minimum,Minimize): 最小化。你可以在Dock上看到该程序

    3. ⌘+W (command+W, Windows): 关闭窗口。不能用Command+tab调出,但还在内存中,可以点击Dock图标打开。

    4. ⌘+Q (command+Q, Quit): 退出程序。程序完全退出。

    5. ⌘+·(command+`, Alternative): 切换活跃窗口。 command+w 

    6. ⌘+Ctrl+F. 最大化窗口。这个命令好多地方找不到,可能是新加的:)


    其他

    ⌘+Alt+M: 全部最小化

    ⌘+Alt++:➕号,Zoom放大窗口

    ⌘+Alt+-:-号,缩小窗口

    ⌘+Alt+H:隐藏所有其他程序窗口(除当前窗口外)



    展开全文
  • 关于窗口重绘初级问题 作者:zuilang关于窗口重画初级问题既然是初级问题,我尽量少说一点原理,并且使用通俗易懂话。 初初级问题:我在视图画图象或者文字,当窗口改变后(包括最小化后还原,被别窗口...
  • 关于无边框窗口的兼容性问题

    千次阅读 2015-08-12 10:33:33
    之后我又去Win7下测试,发现在开启Areo情况下,不管是不是开启了透明,窗口都可以正常显示(和Win8一样),如果没有开启Areo,即选择“Win7 Basic”主题,无边框窗口和在Xp下一样,无法显示,于是经过查资料研究,...
  • 从消息队列中取出一条消息,系统不进行处理,仅进行Translate以及Dispatch,具体处理过程完全交给被Dispatch的窗口完成,而标准EDIT控件并不能处理TAB键入,只是由默认的窗口过程发出一声警告声。 假如使用...
  • 在工作中尝试把一个FLASH居中全屏放置,窗口RESIZE时候和页面SCROLL时候都要动态变化,需要取得当前窗口显示区域WIDTH与HEIGHT,翻了翻资料脑子就一半面一半水搅匀了。类似参数我全列出来: window...
  • 关于JDialog将值返回给父窗口的方法

    千次阅读 2012-02-05 22:43:13
    这个问题困扰了我很久,就是在JFrame中新建一个继承自JDialog的窗口,然后当窗口消失时需要得到窗口内某个控件值。 后来查阅资料最终找到了实现方法: JDialog dialog = new JDialog(); ... //设置成模态...
  • 首先我简要描述下问题: 一个父窗口拥有多个子窗口(都有WS_...首先以为是窗口层次(即Z轴)的原因,于是通过调整窗口的层次,结果,还是没有解决问题。 其次 考虑到是窗口刷新的问题,于是网上搜索一些资料及查看MS
  •  在工作中尝试把一个FLASH居中全屏放置,窗口RESIZE时候和页面SCROLL时候都要动态变化,需要取得当前窗口显示区域WIDTH与HEIGHT,翻了翻资料脑子就一半面一半水搅匀了。类似参数我全列出来: ...
  •  在工作中尝试把一个FLASH居中全屏放置,窗口RESIZE时候和页面SCROLL时候都要动态变化,需要取得当前窗口显示区域WIDTH与HEIGHT,翻了翻资料脑子就一半面一半水搅匀了。类似参数我全列出来: window....
  • 问题描述:最近在用MFC的一个窗口控件怎么都显示不了完整的图片,就算resize图片的大小都不行,于是我仔细的查看了变量,找了网上的资料,原来是窗口的大小不对,只要把子窗口的大小调整到父窗口的大小,如果你是...
  • 文/rdxx 出处/ctocio.com.cn,http://www.pin5i.com/showtopic-16861.html  初认.NET开发不久,发现每次从VSS中取出Web项目后打开总是失败,按道理我配置了ISS  虚拟目录(等于从VSS取出后W
  • 模态窗口有很多优点,也有很多缺点,一直以来对模态窗口的使用态度是扬长避短,发挥它的优势,规避它的短处!但今天又发现了模态窗口的一个问题:即模态窗口中的内容不能被选择和复制!上网找了些资料,有很多解决...
  • 运行以后发觉,某些会弹窗口的超链接,就会打开窗口,妈的,我就花了N多力气去网上找资料,网上的资料从来没有一个人说实话,也没有一个好像是高手,气得我直跺脚,又是只能自己解决,每次都这样,也不知道是不是...
  • 关于查阅资料的申请书怎么写 申请书是个人或集体向组织、机关、企事业单位或社会团体表述愿望、提出请求时使用一种文书。那么查阅资料申请书怎么写呢?下面是小编为大家精心整理查阅资料申请书,希望能给您带来...
  • 网上找很多资料都是窗口置顶失效,但是我遇到窗口置底失效。本来我是想写一篇如何将窗口置顶置底和恢复正常的的博文,结果总结代码时候,发现: 我写成品窗口没问题,但是抽出来代码出bug了,我直接疑惑。 ...
  • 从MSDN和网上大多数资料来看,自动注销时触发Session_End事件有2中方式,一种是Session.Abandon(),另外一种是关闭所有窗口等待Sessiontimeout过期。前一种是可靠,不过需要用户手动去执行Logout操作,后者则...
  • 关于文件句柄的资料

    2016-05-23 18:09:56
    句柄是WINDOWS用来标识被应用程序所建立或使用对象唯一整数,WINDOWS使用各种各样句柄标识诸如应用程序实例,窗口,控件,位图,GDI对象等等。WINDOWS句柄有点像C语言中文件句柄。 句柄是操作系统在生成...
  • 在一开始接触git时候,就看着git窗口发呆,无从下手。 当时就有个想法:自己学会之后,一定要出一份教程,一份通俗易懂教程,从安装到基本使用,再到深入理解,一步步写出来,配上图片。 有了想法之后,就开始...
  • 关于在DLL中获取主调用窗口的句柄

    千次阅读 2008-05-06 21:03:00
    近来在弄远程DLL注入,在DLL中创建了窗口,因某种需要,需获取宿主窗口的句柄,找了n多资料都没有很好的解决办法,然后找到如下一篇文章:通过进程ID获得该进程主窗口的句柄 一个进程可以拥有很多主窗口,也可以不...
  • 随时随地阅读更多技术实战干货,...关于Idea中右边maven projects窗口找不到了如何调出来? 具体idea版本我不太清楚,我用是2016版,其他版本应该也是一样。 首先idea自带了maven控件,不像Eclipse还需要...
  • 因为一个项目中需要开辟一个工作线程进行...然后我找了一大圈资料,有人说子线程中不能创建(事实证明这是错),要用sendmessage去传递消息出来,在主线程中创建。然后又差了一堆博客,有两个写得不错,虽然内容...
  • 看了 【网站】上面文章 http://www.tctl.com.cn/accp/1472/1475/58689.html 内容是 :关于显示网页标题栏讨论,我在网上查了些资料,都说没有办法屏蔽标题栏显示问题 原话:用window.open弹出窗口时,如我...
  • 问题描述: 通过xshell进行远程连接服务器,启动服务之后,发现关闭xshell之后服务也会对应...通过查找资料与测试 ./startserver.sh & 在命令后面添加一个空格和&字符然后再关闭xshell,服务会一直在运行 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 556
精华内容 222
关键字:

关于窗口的资料