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

发表于:2007-07-01来源:作者:点击数: 标签:
如何有效的使用对话框之二 译者:徐景周 ( 原作:Nish ant S ) 1. 如何有效的使初始窗口不显示 当我们想让窗口初始时不显示时,通常会用ShowWindow(SW_HIDE),但实际上还是在启动是可以看到窗口一闪而过的痕迹。所以,可以使用下面的方法来实现它: l 先在构
 

如何有效的使用对话框之二
译者:徐景周(原作: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();  //释放threadAttachThreadInput(    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);

注:它必须是顶端窗口且不是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:

未来工作室(Future Studio)


原文转自:http://www.ltesting.net