精华内容
下载资源
问答
  • 2011-06-19以前做一个项目,要求程序启动时候主对话框是隐藏。当时不知道怎么做,修改窗口风格、窗口类、OnInitDialog里ShowWindow、Create函数、WM_CREATE消息、PreCreateWindow等等都尝试了,没什么用,相当...

    2011-06-19

    以前做一个项目,要求程序启动的时候主对话框是隐藏的。当时不知道怎么做,修改窗口风格、窗口类、OnInitDialog里ShowWindow、Create函数、WM_CREATE消息、PreCreateWindow等等都尝试了,没什么用,相当郁闷。后来有在网上找到一个解决方案,算是解决了当时的燃眉之急,但是我觉得这个方案并不令人满意,至少我觉得它太复杂了。

    下面是网上搜索到的解决方案:(现在也不知道是出自哪里了)

    //===========================================================

    要想使 MFC对话框程序启动的时候直接隐藏(或者最小化到tray)有如下办法

    1  在OnInitDialog ()中
         SetTimer(1,100,null)
       在OnTimer(UINT nIDEvent) 中
          if( nIDEvent==1)
          {
             ShowWindow(sw_hide);
             KillTimer(1);
          }

        ///这种方法 会出现 程序在显示器上 闪一下的效果。。即使 timer 时间很短 ,也会有。

    2 重载 WM_WINDOWPOSCHANGING

    在重载函数内实现:
       OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
       {
           if( !m_bShowWindow)
               lpwndpos->flags &= ~SWP_SHOWWINDOW;
           CDialog::OnWindowPosChanging(lpwndpos);
     
        // TODO: Add your message handler code here
       }
       m_bShowWindow 是我的一个变量,初始值为false

      // 如果 m_bShowWindow  一直为false ,那么程序就见不到人了。。
       所以应该给 True
       在OnInitDialog ()中
         SetTimer(1,1000,null)
       在OnTimer(UINT nIDEvent) 中
          if( nIDEvent==1)
          {
              m_bShowWindow =true;
             KillTimer(1);
          }

     //使用这种方法 程序不会闪一下。。。

    //===========================================================

     

     一个偶然的机会,在研究用什么方法让任务栏不显示图标时终于发现了这个问题的最终应该也是最正确的解决方案。
    原来MFC对话框主窗口是在WinApp的InitInstance里创建的。
    新建一个名为OkCancel的MFC对话框程序,默认的theApp.InitInstance代码是:
    COkCancelApp theApp;
    BOOL COkCancelApp::InitInstance()
    {
     ...
     ...
     COkCancelDlg dlg;
     m_pMainWnd = &dlg;
     INT_PTR nResponse = dlg.DoModal(); //使用的是DoModal方法,所以就是为什么对话框总是显示了
     ...
     ...
    }
    把以上代码修改成自建消息循环的代码:
    BOOL COkCancelApp::InitInstance()
    {
     ...
     ...
     COkCancelDlg* pd=new COkCancelDlg;
     m_pMainWnd=pd;   

     /*这行代码不知道有多少用处,不设置也没多少影响。如果设置了m_pMainWnd那么在程序退出之前会自动调用m_pMainWnd->DestroyWindow()函数,但是这种机制在这里可能会造成错误,所以在后面还要把m_pMainWnd设置为0
    它是::AfxGetMainWnd()正确返回主窗口CWnd指针的前提。或许这个变量可以在别的方面大做文章*/
     pd->Create(IDD_OKCANCEL_DIALOG); //编辑对话框时设置为首次不可见,或者调用ShowWindow(0),但是后者效果不好
     MSG msg;
     while(::GetMessage(&msg,pd->m_hWnd,0,0)) //GetMessage还有因为错误返回-1的情况,但是这里暂时不理会这种情况
     {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }
     pd->DestroyWindow();
     delete pd;
     m_pMainWnd=0;
     ...
     ...
    }
    以上的消息循环其实就是标准的Win32程序的消息循环。
    但是以上代码会造成对话框在点关闭后只是隐藏而不是关闭,那么就要在对话框类里需要退出的位置向自己发送WM_QUIT消息,一般可以选择在OnCancel()函数里:
    void COkCancelDlg::OnCancel()
    {
     CDialog::OnCancel();
     this->PostMessage(WM_QUIT,0,0); //最好放在CDialog::OnCancel()的后面,但是这里不能由PostQuitMessage代替,不知道为什么。
    }
    ----------------------------------------------------------------------------------------------------

    另外隐藏任务栏图标,像QQ的做法就是创建一个隐藏的窗口,再以它为父窗口创建一个对话框窗口(虽然设置为工具栏风格也可以,但那样有猪多不爽)。我们的MFC对话框程序可以这么做:
    BOOL COkCancelApp::InitInstance()
    {
     ...
     ...
     CDialog* pd=new CDialog;
     pd->Create(IDD_DIALOG1); //IDD_DIALOG1是一个不显示的对话框资源ID

     COkCancelDlg dlg(pd);
     m_pMainWnd = &dlg;
     INT_PTR nResponse = dlg.DoModal();

     pd->DestroyWindow();
     delete pd;
     ...
     ...
    }

     

    以上方法其实很简单的,不知道为什么在网上找不到资料。

    展开全文
  • 去掉桌面快捷方式图标小箭头

    千次阅读 2014-01-15 17:37:00
    快捷方式标记,没有什么影响,桌面图标的小箭头去除首先,单击“开始”按钮,选择“运行”,在运行对话框中键入regedit后回车,即可进入注册表编辑器,选择HKEY_CLASSES_ROOT \lnkfile,在右边的窗口中找到字符...
    如何去除电脑桌面上的小箭头,下面是本人经过研究发现的,方法如下:
    那是快捷方式的标记,没有什么影响,桌面图标的小箭头去除首先,单击“开始”按钮,选择“运行”,在运行对话框中键入regedit后回车,即可进入注册表编辑器,选择HKEY_CLASSES_ROOT \lnkfile,在右边的窗口中找到字符串值“isshortcut”,按DELETE键将其删除。然后,仍在HKEY_CLASSES_ROOT \ 下找到piffile,同样在其右边窗口中将字符串值“isshortcut” 按 DELETE键将其删除。最后,关闭注册表编辑器,重新启动WINDOWS,那个烦人的小箭头已经没有了。
    展开全文
  • 窗口函数

    千次阅读 2007-01-18 13:46:00
    对话框、滚动条、列表框、文本框、按钮、菜单都窗口,桌面上的图标窗口。桌面也窗口。窗口也可以隐藏,所以还会有看不到的窗口。 什么是「窗体」窗体指桌面上的独立窗口(桌面窗口的子窗口),也称为「顶层...

    一、基本概念

    什么是「窗口」:

    「窗口」就是屏幕上的一个矩形区域,它接收使用者的输入并以文字或图形的格式显示输出内容。
    对话框、滚动条、列表框、文本框、按钮、菜单都是窗口,桌面上的图标也是窗口。桌面也是窗口。
    窗口也可以隐藏,所以还会有看不到的窗口。
    什么是「窗体」
    窗体指桌面上的独立窗口(桌面窗口的子窗口),也称为「顶层窗口」或「独立窗口」,作为其他子窗口的容器。对话框是一个窗体。
    什么是「控件」
    控件指窗体上的组件,控件是一个子窗口。文本框、按钮都是控件
    什么是「焦点控件」
    在一个窗体上,拥有输入焦点的控件称为焦点控件。
    fap模拟程序在录制「模拟区块」时,将焦点控件作为「目标控件」。
    什么是「窗口类名」
    「窗口类名」是系统用来表示一组窗体属性的分类标识。 例如普通通对话框的类名是“#32770”,标准文本框的类名是“Edit”,标准按钮的类名是“Button”
    什么是「控件ID」
    「控件ID」是一个独立窗体用来唯一标识子窗口的数字编号,通常在一个独立的窗口上没有重复的控件ID。
    窗体自身没有ID。
    什么是「句柄」
    句柄(handle)是一个整数。它标识一种系统资源,如窗口、位图等等,如果你要操作一种系统资源,必须先获得句柄。
    什么是「窗口句柄」
    窗口句柄(hwnd)是一个整数编号。用来标识一个窗口。如果你要控制窗口,必须先获得窗口句柄

    二、查找窗口句柄

    hwnd = win.find(class,title)
    找独立窗体,返回找到窗体的句柄.
    class参数为字符串格式指定窗体类,
    title参数为字符串格式指定窗体标题(必须是完整标题或者不指定标题)

    类名与标题可以忽略其中的一个,如果为空值或为nil值则匹配所有,

    我们来看一个例子,使用一些浏览器在论坛上发贴子,有时候点一下设置字体颜色等对话框会突然浏览器卡死掉,写了好一会的贴子,放弃实在可惜。隐藏的死锁的对话框有时候按ALT可以切换到前台,有时候按ALT没有用,这时候我们就要用到模拟精灵了。
    打开IE调出同样的取色对话框,用模拟精灵录制一个模拟区块发现类名是Internet Explorer_TridentDlgFrame,然后我们运行下面的LAScript脚本就可以激活卡死的浏览器了。
    --查找取色对话框
    hwnd = win.find("Internet Explorer_TridentDlgFrame","");

    --关了你
    win.close(hwnd);

    如果不知道这些隐藏的死锁的对话框的类名,可以使用win库提供的枚举窗口函数搜索窗口。


    hwnd = win.findX(parent,after,class,title)
    在指定的窗口内查找子窗口,仅检查子窗口,而不检查更深层的子窗口的子窗口。
    parent指定父窗体,如果为零表示桌面窗体。
    after指定前面的窗体。0表示忽略这个参数第第一个子窗口开始查找。
    class参数为字符串格式指定窗体类,
    title参数为字符串格式指定窗体标题(必须是完整标题或者不指定标题)

    类名与标题可以忽略其中的一个,如果为空值或为nil值则匹配所有,

    hwnd = win.FindXX( hwndParent ,"类名","标题包含的字符串",ID)
    在指定窗体中查找控件窗口。以所有子窗口作为查找范围(检查更深层的子窗口的子窗口)

    hwndParent指定父窗体,查找范围是主窗体下面所有层的子窗口。而且查找速度非常快。
    不要将hwndParent指定为0或nil。

    类名与标题可以忽略其中的一个,如果为空值或为nil值则匹配所有,
    标题可以是标题的任何部份(不需要完整的标题)。

    最后一个参数为数字值指定控件ID。

    三、枚举桌面窗体

    win.findX只能忽略标题或者匹配完整的标题。可是标题很多时候都是动态的。
    而win.findXX虽然可以指定标题的部份子串,可是并不适合用来查找顶层的独立窗体。

    所以我们需要枚举桌面的全部窗体,然后分析窗体属性。
    我们用泛型for循环来遍历所有桌面窗体。请看下面的例子。

    --[[
    首先我们自已来实现一个迭代器
    参数cls指窗体类名,可以省略(表示忽略类名查找所有窗体),
    返回值是一个迭代器函数。
    --]]

    function win.gfind(cls)
         --泛型for开始循环以前调用这个函数创建一个闭包
         local after = _NULL -- 在闭包中保存值
         local cls = cls;
         local title = title local iter = function ()-- 迭代函数
              after = win.findX(_NULL,after,cls,"")
              if(after==_NULL)then
                   return nil;
              else
                   return after,win.getString(after);
              end
         end
         return iter; --返回一个迭代函数给泛型for;
    end

    --下面是使用win.gfind的一个示例,查找指定类名的窗体

    win.consoleOpen();

    for hwnd,title in win.gfind("#32770") do
         print(hwnd,title); --可以看到列出的窗口句柄及标题
         --在这里你可以使用string库的函数分析标题
         print("进程ID",win.PID(hwnd) );
         --找到窗体以看用break中断循环
    end;

    四、根据文件名、进程ID查找窗体。

    strng.gfind枚举窗体的方法仍有不足,因为大多时候我们要查找的只是某个程序的窗体。
    这就要用到一个新的函数win.fromFile

    hwnd = win.fromFile(exefilename,"类名","标题包含的字符串")
    hwnd = win.fromPID(pid,"类名","标题包含的字符串")

    这两个函数的用法完全相同,不同的是第一个参数:
    win.fromFile的第一个参数是应用程序的文件名, win.fromPID的每一个参数是进程ID。

    后面两个都是可选参数,"类名"和"标题包含"都是可以省略的。
    所有找到的窗体句柄都增加到返回值队列中。返回值可能有多个。

    下面的写法都是正确的。

    hwnd = win.fromFile("文件名.exe")
    hwnd = win.fromFile("文件名.exe","#32770")
    hwnd = win.fromFile("文件名.exe","#32770","标题包含"

    hwnd = win.fromPID(pid)
    hwnd = win.fromPID(pid,"#32770")
    hwnd = win.fromPID(pid,"#32770","标题包含")

    如果需要全部的返回值的话,最好是把返回值放到table表构造器{}中创建一个table数组。

    --读取所有句符合条件的名柄,将所有返回值放在{ }内部生成table数组
    thwnd = { win.fromFile("文件名.exe","#32770","标题包含") };

    --遍历数组
    for i,hwnd in ipairs(thwnd) do
    print(hwnd,win.class(hwnd),win.id(hwnd),win.getString(hwnd))
    end


    --读取所有句符合条件的名柄,将所有返回值放在{ }内部生成table数组
    --不同的是这个函数的第一个参数指定进程ID
    --通常win.exec运行外部文件成功会返回一个进程ID,
    --通过win.tPID可以列出系统所有进程ID及详细信息。

    thwnd = { win.fromPID(pid,"#32770","标题包含") };

    --遍历数组
    for i,hwnd in ipairs(thwnd) do
    print(hwnd,win.class(hwnd),win.id(hwnd),win.getString(hwnd))
    end;



    win.fromFile win.fromPID 返回所有窗体(不包括控件),但是不一定是顶层窗体

    hwnd = win.getTop(hwnd)--通过这个函数读取顶层窗体句柄


    五、其他获取窗体句柄的函数

    hwnd = win.fromPos(x,y)
    可查找指定坐标的窗体,
    参数x,y指定坐标值.

    示例:

    x,y = mouse.getPos(); --读取当前鼠标所在坐标
    hwnd = win.fromPos(x,y); --从指定的坐标读取窗体句柄
    win.setForeground(hwnd); --把找到的窗体激活并移动到最前面

    hwnd = win.getParent(hwnd)
    返回指定窗体的父窗体.
    hwnd参数为窗体句柄.

    hwnd = win.getTop(hwnd)
    返回指定窗体的最顶层父窗体.
    hwnd参数为窗体句柄.

    hwnd = win.desktop();
    返回顶层桌面窗体句柄

    hwnd = win.getFocus(hwnd)
    hwnd参数为窗体句柄,返回值为窗体上当前拥用输入焦点的控件句柄.

    在「fap模拟程序」中,在每个「模拟区块」后面的「脚本区块」,可以用下面的函数获取前面执行过的「模拟区块」相关句柄。
    m = ape:getModule("模拟区块名字");
    hwnd = m:getWindow(); --读取「目标窗体」句柄
    hwnd = m:getCtrl(); --读取「目标控件」句柄
    hwnd = m:getCtrlX(); --读取「指向控件」句柄

    六、显示隐藏窗体

    win.show(hwnd[,true|false|mode])
    参数hwnd指定窗口句柄,参数二设置为true显示,设置为false隐藏,其他可选项如下:

    _SW_HIDE = 0
    _SW_NORMAL = 1
    _SW_SHOWMINIMIZED = 2
    _SW_MAXIMIZE = 3
    _SW_SHOWNOACTIVATE = 4
    _SW_SHOW = 5
    _SW_MINIMIZE = 6
    _SW_SHOWMINNOACTIVE= 7
    _SW_SHOWNA = 8
    _SW_RESTORE = 9
    _SW_SHOWDEFAULT = 10
    _SW_MAX = 11

    win.show(hwnd); --显示
    win.show(hwnd,true); --显示
    win.show(hwnd,false); --隐藏
    win.show(hwnd,_SW_HIDE ); --隐藏

    mode参数的使用方法与 web.show 函数相同

    七、窗体控制命令

    win.close(hwnd); --关闭窗口
    win.min(hwnd); --最小化窗口
    win.max(hwnd); --最大化窗口
    win.restore(hwnd); --恢复窗口大

    八、读取窗体属性

    cls = win.class(hwnd) --读取类名
    hid = win.id(hwnd) --读取控件ID,注意只有控件才有ID,普通窗体是没有ID的
    str = win.getString(hwnd) --读取控件文本或者窗体标题。
    pid = win.PID(hwnd); --读取窗口所在的进程ID
    tid = win.threadID(hwnd); --读取指定窗体线程ID
    hung = win.isHung(hwnd); --检测窗体是否失去响应,返回bool值。

    九、窗口消息函数

    win.postMessage(hwnd,msg,wparam,lparam)
    --向目标窗口发送消息,参数都是数字值(wparam,lparam参数可以是字符串,将自动转换为指针)

    win.sendMessage(hwnd,msg,wparam,lparam)
    --向目标窗口发送消息,参数都是数字值(wparam,lparam参数可以是字符串,将自动转换为指针)

    hwnd指定窗口句柄,msg指定消息,wparam、lparam指定参数。
    使用方法与其他编程语言相同,至于不同消息的具体数值,可查阅windows编程相关资料。

    十、前台窗体

    hwnd = win.getForeground()
    --返回桌面上最前面的窗体句柄。

    win.setForeground(hwnd);
    --把找到的窗体激活并移动到最前面

    win.topMost(hwnd,true)
    --设置窗体始终在最前面

    win.topMost(hwnd,false)
    --取消窗体始终在最前面

    十一、窗体大小

    x,y,x2,y2 = win.getRect(hwnd);
    --hwnd参数指定窗体句柄。
    --如果执行失败,返回nil值。
    -- 如果执行成功,x,y返回值为左上角坐标,x2,y2为右下角坐标


    win.setRect(hwnd,x,y,x2,y2)
    --设置窗体位置与大小。
    --hwnd为窗体句柄,x,y为左上角坐标, x2,y2为右下角坐标。

    十二、控制台窗口

    win.consoleOpen()
    --打开控制台窗口,您可以使用标准IO库读取用户输入或输出信息,
    --也可以直接用print()函数输出信息;


    win.consoleClose()
    --关闭控制台窗口

    不要在调用io.open函数以后调用win.consoleOpen()函数,这会导致io.open打开的文件对象重定向到标准输入输出而无法使用。

     

    十三、在窗体上拷贝或粘贴文本

    win.paste(hwnd) --向窗体发送粘贴命令
    win.copy(hwnd) --向窗体发送拷贝命令

    十四、自动发送字符串

    用法1、
    指定窗口句柄

    local hwnd = win.getForeground(); --读取前台窗体句柄。
    hwnd = win.getFocus(hwnd); --读取前台窗体的焦点控件句柄。

    win.sendString(hwnd,"") --以默认方式发送文本。
    win.sendStringX(hwnd,"") --以ANSI方式发送文本。
    win.sendStringXX(hwnd,"") --以SEND方式发送文本。
    --失败返回nil,成功返回true;

    用法2、
    不指定窗口句柄,模拟精灵将自动获取前台窗体的焦点控件句柄

    win.sendString("发送内容") --以默认方式发送文本。
    win.sendStringX("发送内容") --以ANSI方式发送文本。
    win.sendStringXX("发送内容") --以SEND方式发送文本。
    --失败返回nil,成功返回true;

    十五、后台模拟鼠标与按键

    win库的鼠标键盘模拟函数与key库、mouse库不同,
    不会影响真正的鼠标键盘,也看不到鼠标移动,但是可以让目标窗口收到鼠标键盘命令。
    但这种方法对于大部份游戏无效。

    这种方法主要用于桌面程序。
    如果是网页上的web程序。请使用web窗体可以完美的支持后台操作而无需任何复杂的技术。

    要准确的找到窗口句柄!
    如果你发现下面的函数对于桌面程序没有起到预期的作用。大多时候只有一个原因。
    就是句柄弄错。例如向窗体发送一个应当发向按钮的指令。或者向按钮发送一个应当发向对话框的指令。

    1. win.mouseDown() 按下鼠标左键,有两种用法

    win.mouseDown(hwnd,x,y) --指定窗口发送
    win.mouseDown(x,y) --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄

    失败返回nil,成功返回true;

    2. win.mouseUp() 释放鼠标左键,有两种用法

    win.mouseUp(hwnd,x,y) --指定窗口发送
    win.mouseUp(x,y) --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄

    失败返回nil,成功返回true;

    3. win.keyDown() 发送按键 有两种用法

    win.keyDown(hwnd,"键名") --指定窗口发送
    win.keyDown("键名") --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄

    失败返回nil,成功返回true;

    4. win.keyUp() 发送释放键 有两种用法

    win.keyUp(hwnd,"键名") --指定窗口发送
    win.keyUp("键名") --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄

    失败返回nil,成功返回true;

    5. win.click() 点击指定按钮,有三种用法

    win.click() --无参数,自动查找顶层窗口,自动查找焦点按钮并点击
    win.click(hwnd) --指定窗体,自动查找焦点按钮并点击
    win.click(hwnd,ID) --指定窗体,指定按钮ID(用模拟精灵的录制功能查查看按钮ID)

    十六、显示自定义的对话框

    对话框弹出以后当前线程就被阻塞等待用户操作,直到对话框被关闭。

    str = win.openDlg("标题","All Files (*.*)|*.*||")
    打开文件对话框,返回一组选择的文件路径,第一、第二个参数都可以省略。
    允许选择多个文件,每个文件路径增加一个返回值。

    str = win.saveDlg("标题","All Files (*.*)|*.*||")
    保存文件对话框,第一、第二个参数均可省略

    str = win.dirDlg("标题")
    选择目录对话框,参数可省略

    str = win.inputBox("信息","标题")
    两个参数都可以省略,弹出一个输入对话框获取用户输入。
    如果用户按取消返回空字符串。

    win.messagePrint(str)
    str参数指定显示信息,这是一个字符串格式参数.
    这个函数的作用是在模拟精灵的浮动工具栏上打印信息.
    如果str的第一个字符是@,则会在前面自动添加一个方向变化的箭头,多次调用就会出现一个旋转的指针。

    ok = win.messageBoxTest("询问用户的信息","标题"))
    返回布尔值表示用户是否按了“确定”按钮。

    id = win.messageBox("信息","标题",样式 )
    第二第三个参数都可以省略。
    可用第三个参数设置对话框样式,第二个参数设置标题。

    简单的弹出一个对话题:

    win.messageBox("这是一个简单的对话框");
    win.messageBox("这是一个简单的对话框","我的标题");

    弹出自定义样式的对话框(更多的样式常量请参考《模拟编程WINAPI使用手册》):

    _MB_YESNOCANCEL = 0x00000003;
    _MB_ICONQUESTION = 0x00000020;
    _IDYES = 6;
    _IDNO = 7;

    id = win.messageBox("这是一个自定义对话框","标题",MB_YESNOCANCEL | MB_ICONQUESTION)

    if(id == _IDYES)then
        win.messageBox("你按了[是]")
    elseif(id == _IDNO)then
        win.messageBox("你按了[否]")
    else
        win.messageBox("你按了[取消]")
    end

    十七、向窗口发送消息

    1、发送消息到指定窗口,不等待返回值
    win.postMessage(hwnd,msg,wParam,lParam);
    hwnd参数指定窗口句柄,msg参数指定消息ID,wParam,lParam为附加参数。

    2、发送消息到指定窗口等待返回值
    win.sendMessage(hwnd,msg,wParam,lParam);
    hwnd参数指定窗口句柄,msg参数指定消息ID,wParam,lParam为附加参数。

    3、发送消息到指定线程,不等待返回值
    win.postThreadMessage(tid,msg,wParam,lParam);
    tid参数指定线程id,msg参数指定消息ID,wParam,lParam为附加参数。

    下面是一个例子,通过发送消息自动关闭显示器。

    --声明常量
    _WM_SYSCOMMAND = 0x0112
    _SC_MONITORPOWER = 0xF170
    hwnd = win.fromFile( "Fairy_Ape.exe" ) --获取模拟精灵自身的主窗体句柄
     
     
    --自动关闭显示器
    win.sendMessage(hwnd,_WM_SYSCOMMAND,_SC_MONITORPOWER,1);
     
    --延时5秒
    delay(5000);
     
    --打开显示器
    win.sendMessage(hwnd,_WM_SYSCOMMAND,_SC_MONITORPOWER,-1);
     
    展开全文
  • 特点:Splash窗口一般被设计为一个无边对话框,在Windows任务栏不显示当前窗口的图标信息。 我们通常在Splash窗口中只显示一个图片,并展示软件的信息等 使用场景:Splash窗口显示的时候,程序一般在后台做一些...

    一、Splash窗口

    • 什么是Splash窗口?一般在大型应用程序启动时会显示一个启动画面,这个启动画面即Splash窗口
    • 特点:Splash窗口一般被设计为一个无边对话框,在Windows任务栏不显示当前窗口的图标信息。
    • 我们通常在Splash窗口中只显示一个图片,并展示软件的信息等
    • 使用场景:Splash窗口显示的时候,程序一般在后台做一些比较耗时的启动准备工作,等到软件的准备工作完成之后,Splash窗口就会关闭,然后软件的主窗口显示出来
    • QSplashScreen类:此类就是实现Splash窗口的,它提供了载入图片,自动设置窗口无边框效果等功能

    如何设置Splash窗口:

    • 在构造函数中使用setWindowFlags函数,参数为Qt::SplashScreen

    • 设置完成之后,窗体就变为无边框,在Windows任务栏不显示当前窗口的图标信息

    备注:如果想要窗体无边框,但在Windows任务栏显示当前窗口的图标信息,就使用下面函数

    二、登录窗口

    • 有的应用程序在使用的时候,需要输入用户名和密码才可以进入软件

    三、演示案例

    • 下面我们将Splash窗口与登录窗口做一个合并,做一个登录界面

    窗体设计:

    • 主窗体创建好之后,我们再创建一个对话框,类名为QDlgLogin,这个类就是我们的Splash窗口与登录窗口

    • 将窗体的取消按钮clicked()信号与窗体的reject()槽函数相关联

    构造函数

    • setWindowFlags函数:将当前窗口设置为Splash模式,无边框,在Windows任务栏显示标题
    QDlgLogin::QDlgLogin(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::QDlgLogin)
    {
        ui->setupUi(this);
        ui->editPSWD->setEchoMode(QLineEdit::Password); //设置密码编辑框输入模式为密码输入模式
    
        this->setAttribute(Qt::WA_DeleteOnClose); //当前窗体关闭时窗体对象删除
        this->setWindowFlags(Qt::SplashScreen); //当前窗体设置为SplashScreen格式,无边框,在Windows任务栏不显示标题
        //this->setWindowFlags(Qt::FramelessWindowHint); //当前窗体无边框,但在Windows任务栏显示标题
    
        QPixmap mImage = QPixmap(":/pictures/timg.jpg");//加载图片
        ui->label->setPixmap(mImage);
        readSettings(); //读取存储的用户名和密码
    }

    readSettings、writeSettings函数

    void QDlgLogin::readSettings()
    {
        QString organization="WWB-Qt"; //注册表
        QString appName="samp6_5";
        QSettings settings(organization,appName); //打开一个QSettings对象
    
        bool saved=settings.value("saved",false).toBool(); //读取saved键,并判断返回是否存在saved键,缺省值为flase
        m_user=settings.value("Username","user").toString();//读取Username键的值,缺省值为user
        QString defaultPSWD=encrypt("12345"); //默认的密码(加密过的)
        m_pswd=settings.value("PSWD",defaultPSWD).toString();//读取PSWD键的值,缺省值为defaultPSWD
    
        if(saved) //如果saved有键,就将Username显示在editUser控件中
            ui->editUser->setText(m_user);
        ui->chkBoxSave->setChecked(saved); //设置当前是否保存用户名
    }
    void QDlgLogin::writeSettings()
    {
        QSettings settings("WWB-Qt","samp6_5");//打开一个QSettings对象
    
        settings.setValue("Username",m_user); //将m_user设置为Username键的值
        settings.setValue("PSWD",m_pswd);//将m_pswd设置为PSWD键的值
        settings.setValue("saved",ui->chkBoxSave->isChecked());//将chkBoxSave的选择结果设置为saved键的值
    }

    encrypt函数

    • 此函数的参数为未加密的密码字符串,进过MD5加密后返回加密后的字符串
    QString QDlgLogin::encrypt(const QString &str)
    {
        //将传入进来的密码字符串转换为字节数组,因为加密算法需要字节对象
        QByteArray btArray;
        btArray.append(str); 
        
        //指定MD5加密算法的QCryptographicHash对象
        QCryptographicHash hash(QCryptographicHash::Md5);
        hash.addData(btArray); //将btArray作为参数加密
        QByteArray resultArray=hash.result();//得到hash加密后的结果
        
        QString md5=resultArray.toHex(); //将字节数组内容转换为字符串
        return md5; //返回加密后的密码
    }

    确定按钮的clicked函数

    • 当点击确定按钮时,判断是否正确并登录到主窗口
    • 由于QCryptographicHash对象只提供了加密功能,没有提供解密功能,所以判断的时候我们只能使用加密后的密码进行判断
    void QDlgLogin::on_btnOK_clicked()
    {
        QString user=ui->editUser->text().trimmed();//得到输入的用户名
        QString pswd=ui->editPSWD->text().trimmed();//得到输入的密码
        QString encrptPSWD=encrypt(pswd);//将输入的密码进行MD5加密
        
        //如果账户名和密码都正确
        if((user==m_user)&&(encrptPSWD==m_pswd))
        {
            writeSettings();//将用户名和密码写入注册表
            this->accept();//对话框关闭
        }
        else//如果输入错误
        {
            m_tryCount++;
            if(m_tryCount>3)//错误次数大于3次,直接退出
            {
                QMessageBox::critical(this,QStringLiteral("错误"),
                                      QStringLiteral("输入错误次数过多"));
                this->reject(); //窗体退出
            }
            else//错误次数小于等于3次,只提示不退出
                QMessageBox::critical(this,QStringLiteral("错误提示"),
                                      QStringLiteral("用户名或密码错误"));
        }
    }

    鼠标按下、移动、松开事件函数

    • mousePressEvent:鼠标左键按下时记录下当前鼠标的坐标
    • mouseMoveEvent:鼠标左键按下开始移动
    • mouseReleaseEvent:鼠标左键松开时
    void QDlgLogin::mousePressEvent(QMouseEvent *event)
    {
        //如果是鼠标左键按下
        if(event->button()==Qt::LeftButton)
        {
            m_moving=true; //当前窗口被鼠标单击选中
            m_lastPos=event->globalPos()-pos();//记录下鼠标相对于当前窗口的位置
        }
        return QDialog::mouseMoveEvent(event);
    }
    void QDlgLogin::mouseMoveEvent(QMouseEvent *event)
    {
        //当前窗口被选中&&鼠标左键被按下&&鼠标移动的位置大于鼠标一开始选中的位置
        if(m_moving&&(event->buttons()&&Qt::LeftButton)&&
            (event->globalPos()-m_lastPos).manhattanLength()>QApplication::startDragDistance())
        {
            move(event->globalPos()-m_lastPos); //窗口移动到参数所给的位置
            m_lastPos=event->globalPos()-pos();//更新移动后鼠标相对于当前窗口的位置
        }
        return QDialog::mouseMoveEvent(event);
    }
    void QDlgLogin::mouseReleaseEvent(QMouseEvent *event)
    {
        m_moving=false; //当前鼠标没有按下并且不移动
    }

    Splash窗口与登录窗口的调用

    • 因为设计的Splash登录窗口要在主窗口之前被调用,所以我们需要更改一下main函数
    • 窗体以模式显示的方式调用对话框(exec),如果对话框返回的结果是QDialog::Accepted,说明对话框执行成功

    展开全文
  • // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化...
  • 很多朋友电脑都配置有刻录机,通常情况下需要安装专门...把一张空白光盘放入刻录机,打开“计算机”窗口,双击刻录机图标,弹出“刻录光盘”对话框,选择刻录类型。这里有两个选项:一个“类似于USB闪存驱动器...
  • 写这个连连看游戏刚开始导入各种资源文件改好ID后运行正常,但通过进一步编程后不知道为什么开始报各种”未声明标识符“bug(可能中途改了一些什么设置.....),现项目最近运行log文件如下: ``` 生成...
  • 在选项设置对话框中,可以单独设置主窗口和任务栏窗口的文本颜色、字体、背景颜色、网速单位、显示的文本等。 在“常规设置”选项卡中,可以设置是否在程序时自动检查更新,以及是否需要在开机自动运行。可以设置...
  • // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 m_slider.SetRange(0, 1000); //...
  • // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 ...
  •  自己一个不善管理时间人,有时为了一两个小程序浪费一天时间,所以最近为自己做一个类似课程表软件,就是我先规定XX点到XX点要干什么,把一天计划输入进去,到时间分界点时,我软件会自动提醒我...
  • 1. 什么是 TortoiseSVN? 2. TortoiseSVN 特性 3. 许可协议 4. 开发 4.1. TortoiseSVN 历史 4.2. 致谢 5. 阅读指南 6. 本文使用术语 1. 开始 1.1. 安装 TortoiseSVN 1.1.1. 系统要求 1.1.2. 安装 1.2. 基本...
  • 对话框包含由调用程序定义的信息和标题,以及预先定义的图标和按钮。  这个方法的第一个参数hWnd,代表消息框拥有的窗口。这个参数到底有什么作用呢?做了一个例子,刚好测试到这一点。  假如hwnd句柄指向的...
  • 我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 实现原理: 程序里我们先建立一个主工程,作为主界面,然后再建立一个对 话框类,将其加入工程中,然后在程序中调用自己新建对话框类...
  • // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 if (LoadPrintLib() == FALSE) { ...
  • TM3.0与Windows 2003未知冲突

    千次阅读 2005-01-11 11:33:00
    用TM3.0已经有几周时间了,以前一直用得QQ,不过在这几周时候里面,我发现在它和我现在所...此时我以为系统被病毒什么的破坏了,结果我再到TM3.0中来准备找朋友说话时候,TM3.0出现一个对话框什么窗口初始化失
  • 如何改变窗口的图标 屏幕保护程序的原理是什么 应该如何制作屏幕保护程序 如何在Visual C++ 6.0中用回车键切换输入焦点 如何实现类似QQ程序的界面 如何一步一步地弹出和关闭窗口 如何弹出鼠标提示窗口 如何制作类似...
  • window面试题

    2012-09-18 23:57:00
    1.什么是句柄 句柄windows程序中的一个重要的...重叠窗口,具有应用程序主窗口的全部特点,它的非客户区包括一个可伸缩的框架,菜单条,标题栏和最小化,最大化按钮 弹出窗口,具有消息框或者对话框的全部特点...
  • MFC程序框架剖析

    2015-03-05 09:53:19
    在MFC程序中,窗口的创建由CreateEx函数实现的 15、CWnd::CreateWindowEx函数 主要作用当修改了CreateEx函数的CREATESTRUCT参数时,CreateWindowEx函数会根据参数发生的相应变化来创 建一个符合我们要求的窗口 ...
  • 4.1 什么是MFC 以及MFC 特点 (例子代码EX04-00) 4.2 MFC 应用程序框架 (例子代码EX04-01) 4.3 应用程序框架说明 4.4 文档-视图体系结构 4.4.1 文档-视图相互作用函数 4.4.2 单文档-视图应用程序结构 ...
  • 串操作编程中最常用也最基本操作之一. 8 打开对话框选择多个文件 11 用VC设计托盘图标程序 12 一、NOTIFYICONDATA结构 12 二、Shell_NotifyIcon函数 13 三、托盘图标程序设计示例 13 VC常用数据类型使用转换详解...
  • // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化...
  • wxPython学习手册

    热门讨论 2014-04-19 08:01:58
    4.2 PyCrust有用特性是什么? 79 4.2.1 自动完成 80 4.2.2 调用提示和参数默认 80 4.2.3 语法高亮 81 4.2.4 Python 帮助 81 4.2.5 命令重调用 82 4.2.6 剪切和粘贴 83 4.2.7 标准shell环境 84 4.2.8 动态更新 85 ...
  • 2.4.4 配置Windows防火墙 (5) 如果用户不知道应用程序用的是什么端口单击添加程序按钮可以直接添加...(1) 双击控制面板窗口Windows Update图标 (2) 在Windows Update 对话框中选择安装更新方法这里选择让我选择
  • 4.3.2 不同窗口的样式 46 4.3.3 应用多个样式 47 4.3.4 Shell类的主要方法 47 4.3.5 创建多个窗口 49 4.4 SWT包类结构 51 4.5 本章小结 52 第5章 SWT基本组件 53 5.1 SWT控件类概述 53 5.1.1 窗口小...
  • 4.3.2 不同窗口的样式 46 4.3.3 应用多个样式 47 4.3.4 Shell类的主要方法 47 4.3.5 创建多个窗口 49 4.4 SWT包类结构 51 4.5 本章小结 52 第5章 SWT基本组件 53 5.1 SWT控件类概述 53 5.1.1 窗口小...
  •  4、Win32k.sys是什么文件  现象:我刚装了Windows XP,可是接下去再装毒霸就发现病毒,位于 F:WINNT SYSTEM32里Win32k.sys文件,删又不可删,隔离又不行,在 Windows 98下或DOS下删就会导致Windows XP不可...
  •  如果对Windows开发有什么问题话,请翻阅PetZold著作吧。在《Window程序设计》(第5版)中,这位杰出“Windows先锋奖”(Windows Pioneer Award)获得者根据最新Windows操作系统权威技术修订了他经典著作...

空空如也

空空如也

1 2 3 4 5 6
收藏数 117
精华内容 46
关键字:

对话框窗口的图标是什么