setwindowpos setwindowpos wm_size

::首页 >>文档中心 >>在线杂志 >>对话框[ 在线杂志 第15期 ]


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

本文是《如何有效使用对话框》一文的继续.

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(); //释放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);
注:它必须是顶端窗口且不是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;    }}
译者联系方式:
作者EMAIL:jingzhou_xu@163.net
未来工作室(Future Studio)

setwindowpos setwindowpos wm_size

  

爱华网本文地址 » http://www.aihuau.com/a/25101010/39268.html

更多阅读

VS2010修改Mainframe的大小 vs2010修改快捷键

在vs2010中建立的MFC单文档程序,无论是在CMainFrame里的PreCreateWindow函数中对cs进行修改,还是使用SetWindowPos或MoveWindow函数,都无法实现对窗口的修改。现在的状态是,如果给窗口加上可以调节大小这一style,那么窗口会自动保留上次

MoveWindowandSetWindowPos vc movewindow

MoveWindow只能设置窗口的大小和位置;SetWindowPos拥有MoveWindow的全部功能之外,还可以设置窗口的层叠关系(如,把指定的窗口放在所有窗口的最上层--alwaysontop就可以用这个函数、或者把指定的窗口放在另一个窗口的下层,等等)。没有什么

SetWindowLong和SetWindowPos函数详解 setwindowlong 参数值

SetWindowPos函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。  函数原型:BOOL SetWindowP

声明:《setwindowpos setwindowpos wm_size》为网友孤天狼分享!如侵犯到您的合法权益请联系我们删除