如何有效的使用对话框之二

 

如何有效的使用对话框之二
译者:徐景周(原作:Nishant S )
 

1.     如何有效的使初始窗口不显示

当我们想让窗口初始时不显示时,通常会用ShowWindow(SW_HIDE) ,但实际上还是在启动是可以看到窗口一闪而过的痕迹。所以,可以使用下面的方法来实现它:

l         先在构造涵数中设置布乐变量 visible为false.

visible = false;

l         重载 WM_WINDOWPOSCHANGING,并添加下面代码:

void CTest_deleteDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
{
    if(!visible)
        lpwndpos->flags &= ~SWP_SHOWWINDOW;
 
    CDialog::OnWindowPosChanging(lpwndpos);
}

l         然后设布乐visible变量值true,并在要显示窗口时,再用ShowWindow(SW_SHOW)既可。

visible = true;
ShowWindow(SW_SHOW);

 

2.     对话框的全屏显示

对话框的全屏显示可以在OnInitDialog()SetWindowPosHWND_TOPMOST 来实现对话框的重新大小。

BOOL CFullScrDlgDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
 
    //...
 
    int cx, cy; 
    HDC dc = ::GetDC(NULL); 
    cx = GetDeviceCaps(dc,HORZRES) + 
        GetSystemMetrics(SM_CXBORDER); 
    cy = GetDeviceCaps(dc,VERTRES) +
        GetSystemMetrics(SM_CYBORDER); 
    ::ReleaseDC(0,dc); 
 
    //去除标题和边框
    SetWindowLong(m_hWnd, GWL_STYLE, 
        GetWindowLong(m_hWnd, GWL_STYLE) & 
    (~(WS_CAPTION | WS_BORDER))); 
 
    // 置对话框为最顶端并扩充到整个屏幕
    ::SetWindowPos(m_hWnd, HWND_TOPMOST, 
        -(GetSystemMetrics(SM_CXBORDER)+1), 
        -(GetSystemMetrics(SM_CYBORDER)+1), 
        cx+1,cy+1, SWP_NOZORDER); 
 
    //...
 
    return TRUE; 
}

 

3.     如何在2K/xp下使窗口获取焦点

在2K/XP下我们可以用 AttachThreadInputSetForegroundWindow来有效的获取焦点。

//捕捉并设置当前焦点窗口为我们的窗口
AttachThreadInput(
    GetWindowThreadProcessId(
        ::GetForegroundWindow(),NULL),
    GetCurrentThreadId(),TRUE);
 
//置我们的为焦点窗口
SetForegroundWindow();
SetFocus(); 
 
//释放thread
AttachThreadInput(
    GetWindowThreadProcessId(
        ::GetForegroundWindow(),NULL),
    GetCurrentThreadId(),FALSE);

 

4.     使你的对话框位于最顶端

可以直接在 OnInitDialog()中用SetWindowPos来实现。

SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

 

5.     如何动态放大/缩小对话框

还是可以用SetWindowPos或MoveWindow来实现它。

void CTest_deleteDlg::OnMakeSmall() 
{
    SetWindowPos(NULL,0,0,200,200,SWP_NOZORDER|SWP_NOMOVE);      
}
 
void CTest_deleteDlg::OnExpand() 
{
    SetWindowPos(NULL,0,0,500,300,SWP_NOZORDER|SWP_NOMOVE);           
}

或:

//伸、缩在IDC_DYCREDITSIDC_COPYRIGHTSTATIC控件间,做为分隔线

BOOL CAbout::OnInitDialog()

{

      CDialog::OnInitDialog();

//"关于"对话框中对话框可收缩效果

         CRect Rect1,Rect2;                                                                  //对话框收缩时大小         

        

         GetDlgItem(IDC_DYCREDITS)->GetWindowRect(Rect1);

         GetDlgItem(IDC_COPYRIGHT)->GetWindowRect(Rect2);

         m_nReducedHeight = Rect1.Height()+(Rect1.top -Rect2.bottom)/2; //收缩后窗体高度

         dlgRect.bottom -= (Rect1.Height()+(Rect1.top -Rect2.bottom)/2);

         MoveWindow(&dlgRect);                                            //如果要显示对话框起始动态效果的话,不能使用该句

 

      m_bVertical=false;                                //默认收缩对话框

}

// ---------------------------------------------------------

//       名称: OnMore

//       功能: 是否荣誉显示

//       变量:

//       返回:

//       编写: 徐景周,2002.4.8

// ---------------------------------------------------------

void CAbout::OnMore()

{

         m_bVertical = !m_bVertical;

        

         if(m_bVertical == FALSE)    //不显示

         {

                  SetDlgItemText(ID_MORE,_T("更多>>"));

 

                  SizeWindow(m_nReducedHeight,true);

 

//                m_DyCredits.EndScrolling();              //停止滚动

         }

         else                                                 //显示

         {

                  SetDlgItemText(ID_MORE,_T("<<隐藏"));

 

                  SizeWindow(m_nReducedHeight,false);

 

                  m_DyCredits.StartScrolling();                            //开始滚动

         }

        

         UpdateWindow();

}

 

// ---------------------------------------------------------

//       名称: SizeWindow

//       功能: 伸展或收缩对话框   

//       变量: ReduceHeight-收缩高度,bExtend-是否伸展

//       返回:

//       编写: 徐景周,2002.4.8

// ---------------------------------------------------------      

void CAbout::SizeWindow(int ReduceHeight, bool bExtend)

{

         CRect rc;

         GetWindowRect(&rc);

         if(bExtend)

         {

                   for (int i= 0; i < ReduceHeight; i++)

                   {

                            rc.bottom--;

                            MoveWindow(&rc);

                   }

         }

         else

         {

                   for (int i= 0; i < ReduceHeight; i++)

                   {

                            rc.bottom++;

                            MoveWindow(&rc);

                   }

         }

}

 

6.     如何让对话框回到屏幕中来

当对话框被拖离屏幕时,可用下面代码使其回到屏幕中。

SendMessage(DM_REPOSITION);

注:它必须是顶端窗口且不是chind窗口。

 

7.     如何给对话框添加或去掉最大/最小化按钮

OnCreate()OnInitDialog() 改变其显示风格既可。

int CTest_deleteDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;      
    // TODO: Add your specialized creation code here
    SetWindowLong(this->m_hWnd,GWL_STYLE,
        GetWindowLong(this->m_hWnd,GWL_STYLE) | 
            WS_MINIMIZEBOX | WS_MAXIMIZEBOX);      
    return 0;
}

或用:

ModifyStyle (NULL, WS_MAXIMIZEBOX);

 

8.     改变鼠标指针

可以在OnSetCursor中实现.

BOOL CTest_deleteDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
    // TODO: Add your message handler code here and/or call default
    SetCursor(AfxGetApp()->LoadStandardCursor(IDC_UPARROW));
    // Now we return instead of calling the base class
    return 0; 
    // return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

 

9.     改变对话框的前景和背景色

可以在InitInstance()中实现。

//红色背景、绿色前景
SetDialogBkColor(RGB(255,0,0),RGB(0,255,0)); 

 

10.             在任务条上不显示图标

先从CwinApp继承类中建立一个不显示的顶级窗口. 

CFrameWnd *abc=new CFrameWnd();
abc->Create(0,0,WS_OVERLAPPEDWINDOW);
CNoTaskBarIconDlg dlg(abc);
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
delete abc;

OnInitDialog中修改显示风格 WS_EX_APPWINDOW.

BOOL CNoTaskBarIconDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    ModifyStyleEx(WS_EX_APPWINDOW,0);
 
    SetIcon(m_hIcon, TRUE);  // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon
         
    // TODO: Add extra initialization here
         
    return TRUE;  // return TRUE  unless you set the focus to a control
}

 

11.             加入上、下文帮助

OnInitDialog 修改显示风格,加入上、下文HLP帮助显示.

BOOL HelpDialog::OnInitDialog() 
{
    //blah blah blah
    //blah blah blah
    ModifyStyleEx(0, WS_EX_CONTEXTHELP);
    return CDialog::OnInitDialog();
}

重载OnHelpInfo(...)用显示相关帮助信息

BOOL HelpDialog::OnHelpInfo(HELPINFO* pHelpInfo) 
{
    short state = GetKeyState (VK_F1);
    if (state < 0)   // F1 key is down, get help for the dialog
        return CDialog::OnHelpInfo(pHelpInfo);
    else
    {    // F1 key not down, get help for specific control
        if (pHelpInfo->dwContextId)
            WinHelp (pHelpInfo->dwContextId, 
                HELP_CONTEXTPOPUP);
        return TRUE;
    }
}

 

 

联系方式:

作者EMAIL:jingzhou_xu@163.com

未来工作室(Future Studio)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 嵌入式Qt无法弹出对话框可能是由以下几个原因造成的: 1. 缺少显示驱动:嵌入式系统可能缺少必要的显示驱动支持,导致无法正常显示对话框。解决方法是安装适配的显示驱动,并确保应用程序正确配置了该驱动。 2. 内存不足:如果嵌入式系统的内存不足,可能无法为对话框分配足够的内存空间。这时可以考虑优化内存使用,关闭一些不必要的进程或功能,以腾出更多的内存空间。 3. 指针问题:由于嵌入式系统的资源有限,可能存在指针问题,即对话框的指针未正确传递或释放。解决方法是检查代码中与对话框相关的指针传递及释放操作,确保没有内存泄漏或悬空指针。 4. Qt版本兼容性:有些Qt版本可能在某些嵌入式系统中存在兼容性问题,导致对话框无法弹出。可尝试升级Qt版本或者使用已知兼容性较好的版本。 5. 配置问题:有时嵌入式系统的配置文件可能未正确设置或缺失,导致对话框无法弹出。解决方法是检查系统配置文件,保证配置正确,并确保Qt相关的配置项被正确设置。 总之,嵌入式Qt无法弹出对话框的问题可能是由显示驱动、内存不足、指针问题、Qt版本兼容性或配置问题等造成的。根据具体情况进行逐一排查和解决,可以有效解决该问题。 ### 回答2: 嵌入式Qt无法弹出对话框的问题可能有多种原因,下面将列举一些可能导致该问题的原因和解决方案。 首先,可能是由于未正确设置Qt的相关参数导致无法弹出对话框。在嵌入式系统中,我们需要确保Qt的GUI环境正确初始化。可以尝试在代码中添加如下语句: ``` QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 高DPI缩放 QGuiApplication app(argc, argv); ``` 其次,可能是因为对话框被其他窗口或控件覆盖导致无法弹出。我们可以尝试将对话框设置为窗口的顶层控件,或者调整对话框的层级来确保其能够显示在最上层。 另外,也有可能是由于对话框的宽度或高度设置不当导致无法显示。可以检查对话框的大小是否适应显示设备的分辨率,并确保对话框的大小和位置设置正确。 最后,如果以上方法仍无法解决问题,可能需要检查系统的资源限制,例如内存使用情况等。如果系统资源不足,可能导致无法弹出对话框。可以尝试优化代码,减少内存占用,或者增加系统资源。 综上所述,嵌入式Qt无法弹出对话框的问题可能涉及多种原因,需要根据具体情况逐一排查。通过适当的设置相关参数、调整对话框的层级和大小、检查系统资源等方法,应该能够解决该问题。 ### 回答3: 嵌入式Qt无法弹出对话框的原因可能有多种。 首先,嵌入式系统可能没有正确配置窗口管理器或图形驱动程序,导致Qt无法正确显示和操作对话框。解决这个问题的方法是检查嵌入式系统的配置,确保窗口管理器和图形驱动程序正确安装和配置。 其次,嵌入式系统的内存和处理器资源可能有限,无法支持弹出对话框的操作。由于对话框需要占用一定的内存和处理器资源,如果系统资源不足,Qt无法创建和显示对话框。解决这个问题的方法是优化程序的资源占用,例如使用更少的内存和处理器资源来创建对话框,或者增加系统的内存和处理器资源。 另外,嵌入式系统可能没有正确设置对话框的父窗口或父窗口属性,导致对话框无法正确弹出。在Qt中,对话框通常需要设置一个父窗口,以确保对话框在正确的位置显示,并且能够和父窗口进行交互。解决这个问题的方法是正确设置对话框的父窗口或父窗口属性。 最后,嵌入式系统的其他因素,例如输入设备的兼容性或Qt库的版本问题,也可能导致无法弹出对话框。解决这个问题的方法是检查和更新系统的输入设备驱动程序,或者尝试使用不同版本的Qt库。 综上所述,嵌入式Qt无法弹出对话框的原因可能是配置问题、资源限制、父窗口设置问题或其他因素。要解决这个问题,需要仔细检查和修复相关的配置和设置,并确保系统的资源满足对话框的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Johnny-Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值