分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

译者:徐景周(原作: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;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有