Q:如何在对话框中加入工具条
在 OnInitDialog
中加入下面代码:
BOOL CYourDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Create the toolbar. To understand
the meaning of the styles used, you
// can take a look at the MSDN
for the Create function of the CToolBar class.
ToolBar.Create(this,
WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS |CBRS_FLYBY |
CBRS_BORDER_BOTTOM);
// I have assumed that you have named your
toolbar's resource as IDR_TOOLBAR1.
// If you have given it a different
name, change the line below to accomodate
// that by changing the
parameter for the LoadToolBar
function.
ToolBar.LoadToolBar(IDR_TOOLBAR1);
CRect
rcClientStart;
CRect
rcClientNow;
GetClientRect(rcClientStart);
// To
reposition and resize the control
bar
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,0,
reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left -
rcClientStart.left,rcClientNow.top-rcClientStart.top);
CRect
rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);
while
(pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild =
pwndChild->GetNextWindow();
}
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() -
rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() -
rcClientNow.Height();
MoveWindow(rcWindow, FALSE);
//
And position the control bars
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST, 0);
return TRUE; // return TRUE unless
you set the focus to a control
}
Q:如何改变对话框的形状?
可用下面一些涵数:
CreatePolygonRgn
CreateRectRgn
CreateRoundRectRgn 等.
CRgn m_rgn; // Put this in your dialog's header
file. i.e. a member variable
// This Gets the size of the Dialog: This
piece of code is to be placed in the
// OnInitDialog Function of your
dialog.
CRect rcDialog
GetClientRect(rcDialog);
// The
following code Creates the area and assigns it to your
Dialog
m_rgn.CreateEllipticRgn(0, 0, rcDialog.Width(),
rcDialogHeight());
SetWindowRgn(GetSafeHwnd(), (HRGN) m_rgn,
TRUE);
Q:如何实现非客户区移动?
可用下面二种方法:
// Handler for
WM_LBUTTONDOWN message
void CYourDialog::OnLButtonDown(UINT nFlags,
CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x,
point.y));
}
// Handler for WM_NCHITTEST message
LONG
CYourDialog::OnNcHitTest( UINT uParam, LONG lParam )
{
int xPos =
LOWORD(lParam);
int yPos = HIWORD(lParam);
UINT nHitTest =
CDialog::OnNcHitTest(CSize(xPos, yPos));
return (nHitTest == HTCLIENT) ?
HTCAPTION : nHitTest;
}
Q:如何使对话框初始为最小化状态?
在
OnInitDialog 中加入下面代码:
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE,
NULL);
Q:如何限定对话框大小范围?
在 WM_SIZING中加入下面代码:
void
CYourDialog::OnSizing(UINT fwSide, LPRECT pRect)
{
if(pRect->right - pRect->left <=200)
pRect->right =
pRect->left + 200;
if(pRect->bottom - pRect->top
<=200)
pRect->bottom = pRect->top + 200;
CDialog::OnSizing(fwSide, pRect);
}
Q:如何在对话框中加入状态条?
定义 CStatusBar 变量:
CStatusBar m_StatusBar;
定义状态条指定状态:
static
UINT BASED_CODE indicators[] =
{
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM
};
在 OnInitDialog
中加入下面代码:
m_StatusBar.CreateEx(this,SBT_TOOLTIPS,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,AFX_IDW_STATUS_BAR);
//
Set the indicators namely caps and nums lock
status
m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
CRect
rect;
GetClientRect(&rect);
m_StatusBar.SetPaneInfo(0,ID_INDICATOR_CAPS,SBPS_NORMAL,rect.Width()/2);
m_StatusBar.SetPaneInfo(1,ID_INDICATOR_NUM,SBPS_STRETCH
,rect.Width()/2);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,ID_INDICATOR_NUM);
m_StatusBar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));
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()中用
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);
注:它必须是顶端窗口且不是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;
}
}
上一篇:用VC++在状态栏显示时钟
文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面