您的位置:首页 > 其它

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

2004-11-29 14:02 531 查看
如何有效的使用对话框之二
译者:徐景周(原作:Nishant S )
本文是《如何有效使用对话框》一文的继续.



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

当我们想让窗口初始时不显示时,通常会用ShowWindow(SW_HIDE) ,但实际上还是在启动是可以看到窗口一闪而过的痕迹。所以,可以使用下面的方法来实现它:
(1.1)先在构造函数中设置布乐变量 visible值为false.

visible = false;

(1.2)重载 WM_WINDOWPOSCHANGING,并添加下面代码:

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

    CDialog::OnWindowPosChanging(lpwndpos);
}

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

visible = true;
ShowWindow(SW_SHOW);



2. 对话框的全屏显示

对话框的全屏显示可以在OnInitDialog()中用 SetWindowPos 和 HWND_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下我们可以用 AttachThreadInput 和SetForegroundWindow来有效的获取焦点。

//捕捉并设置当前焦点窗口为我们的窗口
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_DYCREDITS和IDC_COPYRIGHT两STATIC控件间,做为分隔线
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);

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



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() 
{

    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;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: