动态对话框
来源:互联网 发布:取消淘宝手机验证码 编辑:程序博客网 时间:2024/04/29 14:03
6.4 动画窗体界面
0357 动画显示窗体
要实现动画显示窗体效果需要使用AnimateWindow函数,并设置0x00000010风格,由于该函数并没有被封装,所以需要进行手动导入User32动态库。并定义0x00000010风格为AW_CENTER。
#define AW_CENTER 0x00000010 //动画
#define AW_HIDE 0x00010000 //隐藏
BOOL CDonghuaDlg::OnInitDialog()
{
……
CenterWindow();
DWORD dwStyle = AW_CENTER;
HINSTANCE hInst = LoadLibrary("User32.DLL");
typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));
MYFUNC* AnimateWindow;
AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");
AnimateWindow(this->m_hWnd,1000,dwStyle);
FreeLibrary(hInst);
return TRUE;
}
void CDonghuaDlg::OnClose()
{
DWORD dwStyle = AW_CENTER;
HINSTANCE hInst = LoadLibrary("User32.DLL");
typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));
MYFUNC* AnimateWindow;
AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");
AnimateWindow(this->GetSafeHwnd(),700,AW_HIDE|dwStyle);
FreeLibrary(hInst);
CDialog::OnClose();
}
0358 淡入淡出的窗体
要实现淡入淡出的窗体效果需要使用AnimateWindow函数,并设置0x00080000风格,由于该函数并没有被封装,所以需要进行手动导入User32动态库。并定义0x00080000风格为AW_BLEND。
程序代码如下:
#define AW_BLEND 0x00080000 //淡入淡出
#define AW_HIDE 0x00010000 //隐藏
BOOL CFadeDlg::OnInitDialog()
{
……
CenterWindow();
DWORD dwStyle = AW_BLEND;
HINSTANCE hInst = LoadLibrary("User32.DLL");
typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));
MYFUNC* AnimateWindow;
AnimateWindow = (MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");
AnimateWindow(this->m_hWnd,1000,dwStyle);
FreeLibrary(hInst);
return TRUE;
}
void CFadeDlg::OnClose()
{
DWORD dwStyle = AW_BLEND;
HINSTANCE hInst=LoadLibrary("User32.DLL");
typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));
MYFUNC* AnimateWindow;
AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");
AnimateWindow(this->GetSafeHwnd(),1000,AW_HIDE | dwStyle);
FreeLibrary(hInst);
CDialog::OnClose();
}
0359 如QQ般隐藏的窗体
如果把一些较小的窗体做成像QQ般隐藏的窗体将会更加吸引用户。要实现如QQ般隐藏的窗体需要在定时器中判断鼠标和窗体的位置,然后使用MoveWindow方法移动窗体,从而实现是隐藏还是显示。
程序代码如下:
void CQQHideDlg::OnTimer(UINT nIDEvent)
{
CRect rc;
CRect rect;
GetWindowRect(&rect);
rc.CopyRect(&rect);
CPoint pOint;
GetCursorPos(&pOint);
if(rect.top < 0 && PtInRect(rect,pOint))
{
rect.top = 0;
MoveWindow(rect.left,rect.top,rc.Width(),rc.Height());
}
else if(rect.top > -3 && rect.top < 3 && !PtInRect(rect,pOint))
{
rect.top = 3-rect.Height();
MoveWindow(rect.left,rect.top,rc.Width(),rc.Height());
}
CDialog::OnTimer(nIDEvent);
}
0360 可横向伸展的对话框
在一些应用程序中,经常会见到一些可伸展的对话框,要实现可横向伸展的对话框需要在对话框中放置一个控件,然后跟根据控件的位置来显示或隐藏部分对话框。
程序代码如下:
BOOL CExtendDlg::OnInitDialog()
{
…… //此处代码省略
m_bExpand=FALSE;
CRect rcDlg, rcMarker;
GetWindowRect(rcDlg);
m_nExpandedWidth = rcDlg.Width();
GetDlgItem(IDC_STATIC1)->GetWindowRect(rcMarker);
m_nNormalWidth = (rcMarker.left - rcDlg.left);
Display();
return TRUE;
}
void CExtendDlg::Display()
{
CRect rcDlg;
GetWindowRect(rcDlg);
if (m_bExpand)
{
rcDlg.SetRect( rcDlg.left, rcDlg.top,
rcDlg.left + m_nExpandedWidth,
rcDlg.top + rcDlg.Height());
}
else
{
rcDlg.SetRect(rcDlg.left, rcDlg.top,
rcDlg.left + m_nNormalWidth,
rcDlg.top + rcDlg.Height());
}
MoveWindow(rcDlg);
}
void CExtendDlg::OnButton1()
{
m_bExpand = !m_bExpand;
Display();
}
0361 可纵向伸展的对话框
要实现可纵向伸展的对话框效果,主要是通过MoveWindow函数来调整对话框的大小,从而实现对话框的伸展效果。
程序代码如下:
BOOL CExtendDlg::OnInitDialog()
{
…… //此处代码省略
m_bExpand=FALSE;
CRect rcDlg, rcMarker;
GetWindowRect(rcDlg);
m_nExpandedHeight = rcDlg.Height();
GetDlgItem(IDC_STATIC1)->GetWindowRect(rcMarker);
m_nNormalHeight = (rcMarker.top - rcDlg.top);
Display();
return TRUE;
}
void CExtendDlg::Display()
{
CRect rcDlg;
GetWindowRect(rcDlg);
if (m_bExpand)
{
rcDlg.SetRect( rcDlg.left, rcDlg.top,
rcDlg.left + rcDlg.Width(),
rcDlg.top + m_nExpandedHeight);
}
else
{
rcDlg.SetRect(rcDlg.left, rcDlg.top,
rcDlg.left + rcDlg.Width(),
rcDlg.top + m_nNormalHeight);
}
MoveWindow(rcDlg);
}
void CExtendDlg::OnButton1()
{
m_bExpand = !m_bExpand;
Display();
}
0362 调用Office助手
Office助手是一个非常漂亮的工具,要实现Office助手效果,需要使用Microsoft提供的第三方控件Microsoft Agent Control 2.0,导入时根据需要选择相应的类。
程序代码如下:
BOOL COfficeDlg::OnInitDialog()
{
…… //此处代码省略
CString str = "merlin.acs";
COleVariant value1(str);
m_Agent.GetCharacters().Load("merlin",value1);
return TRUE;
}
void COfficeDlg::OnButton1()
{
m_Character = m_Agent.GetCharacters().Character("merlin");
long prm = 0;
COleVariant value(prm);
m_Character.Show(value);
}
void COfficeDlg::OnButton2()
{
CString str = "Announce";
m_Character = m_Agent.GetCharacters().Character("merlin");
m_Character.Play(str);
}
void COfficeDlg::OnButton3()
{
CString str = "Congratulate";
m_Character = m_Agent.GetCharacters().Character("merlin");
m_Character.Play(str);
}
void COfficeDlg::OnButton4()
{
CString str = "Congratulate_2";
m_Character = m_Agent.GetCharacters().Character("merlin");
m_Character.Play(str);
}
void COfficeDlg::OnButton5()
{
CString str = "Domagic1";
m_Character = m_Agent.GetCharacters().Character("merlin");
m_Character.Play(str);
}
void COfficeDlg::OnButton6()
{
m_Character = m_Agent.GetCharacters().Character("merlin");
long prm = 0;
COleVariant value(prm);
m_Character.Hide(value);
}
0363 屏幕滚动字幕
屏幕滚动字幕是在主窗体中绘制要输出的字幕,绘制字幕时需要重载OnPaint方法,通过在定时器中使用MoveWindow方法使窗体从屏幕的右侧向左侧移动。
程序代码如下:
BOOL CCaptionDlg::OnInitDialog()
{
…… //此处代码省略
SetTimer(1,10,NULL);
CRect rect;
GetClientRect(&rect);
x = GetSystemMetrics(SM_CXSCREEN);
y = GetSystemMetrics(SM_CYSCREEN);
MoveWindow(x,y-70,rect.Width(),rect.Height());
num = 1;
return TRUE;
}
void CCaptionDlg::OnPaint()
{
CPaintDC dc(this);
CString str="二十四桥仍在,波心荡、冷月无声。念桥边红药,年年知为谁生。";
dc.TextOut(0,0,str);
}
void CCaptionDlg::OnTimer(UINT nIDEvent)
{
CRect rect,rc;
GetClientRect(&rect);
MoveWindow(x-num,y-50,rect.Width(),rect.Height());
if(num >= x+rect.Width())
num = 1;
else
num++;
CDialog::OnTimer(nIDEvent);
}
0364 在窗体中显示彩虹文字
在窗体中显示彩虹文字,需要调用CDC类的BeginPath、EndPath和AbortPath等方法,并使用随机函数rand来设置颜色。如图6.12所示。
图6.12 在窗体中显示彩虹文字
程序代码如下:
void CRainbowDlg::OnTimer(UINT nIDEvent)
{
CDC* pDC = GetDC();
Font.CreatePointFont(400,"宋体",pDC);
pDC->SelectObject(&Font);
pDC->BeginPath();
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(70,45,"彩虹文字");
pDC->EndPath();
pDC->SelectClipPath(RGN_COPY);
pDC->AbortPath();
Font.DeleteObject();
CRect rect;
GetClientRect(&rect);
int R,G,B;
for(int i=0;i<rect.Height();i=i+5)
{
R = rand()/2;
G = rand()/2;
B = rand()/2;
CPen pen1;
pen1.CreatePen(PS_SOLID,5,RGB(255*R,255*G,255*B));
pDC->SelectObject(&pen1);
pDC->LineTo(0,i);
pDC->MoveTo(rect.Width(),i);
pen1.DeleteObject();
}
CDialog::OnTimer(nIDEvent);
}
0365 在窗体中实现文字横拉效果
在窗体中实现文字横拉效果,就是利用API函数中的SetTextCharacterExtra函数,该函数的作用主要是改变各字符串之间的间隔大小,该函数语法如下:
int SetTextCharacterExtra( int nCharExtra );
参数说明如下。
l nCharExtra:要在字符间插入的额外空间的数量,采用设备场景的逻辑坐标系统。
如图6.13所示。
图6.13 在窗体中实现文字横拉效果
程序代码如下:
void CDraughtDlg::OnTimer(UINT nIDEvent)
{
CDC* pDC = GetDC();
CFont Font;
Font.CreatePointFont(200,"宋体");
pDC->SelectObject(&Font);
if(num<25)
{
pDC->SetTextCharacterExtra(num);
pDC->TextOut(40,50,"明日科技有限公司");
num++;
}
else
{
CBrush m_brush (RGB(255,255,255));
CRect m_rect;
GetClientRect(m_rect);
pDC->FillRect(m_rect,&m_brush);
num = 1;
}
Font.DeleteObject();
CDialog::OnTimer(nIDEvent);
}
0366 在窗体中实现万花筒效果
通过rand函数随机取出小圆半径的大小,使用cos和sin求出小圆上的点,然后使用CDC类的LineTo方法将各个点进行连接,从而绘制出不同的图案,实现万花筒效果。如图6.14所示。
程序代码如下:
BOOL CKaleidoscopeDlg::OnInitDialog()
{
…… //此处代码省略
CRect rect;
GetClientRect(&rect);
r1 = 150;
r2 = 50;
s = 34;
xo = rect.Width() / 2;
yo = rect.Height() / 2;
SetTimer(1,300,NULL);
return TRUE;
}
void CKaleidoscopeDlg::OnTimer(UINT nIDEvent)
{
this->RedrawWindow();
r2 = rand()%(r1-10);
if(r2-2 <= 1)
s = 30;
else
s = rand()%(r2-2);
CDC* pDC = GetDC();
CPen pen;
int R,G,B;
R = rand()/2;
G = rand()/2;
B = rand()/2;
pen.CreatePen(PS_SOLID,1,RGB(255*R,255*G,255*B));
pDC->SelectObject(&pen);
pDC->MoveTo(xo-(r1-r2+s),yo);
for(int i=1;i<20000;i++)
{
a1 = (PI/360)*i;
a2 = (r1*1.0/r2)*a1;
xt = int(-(r1-r2)*cos(a1)-s*cos(a2-a1)+xo);
yt = int((r1-r2)*sin(a1)-s*sin(a2-a1)+yo);
pDC->LineTo(xt,yt);
}
pen.DeleteObject();
CDialog::OnTimer(nIDEvent);
}
图6.14 在窗体中实现万花筒效果
0367 在窗体中实现动画效果
要实现背景图案的动画效果,就要让背景上的图案不停的变换,所以在实例中使用定时器不停地改变窗体背景,先在窗体取40个点,然后通过定时器控制每次显示不相邻的20个点,并将这20个点用线连接起来。如图6.15所示。
图6.15 在窗体中实现动画效果
程序代码如下:
BOOL CPictureCartoonDlg::OnInitDialog()
{
…… //此处代码省略
lpi=0;
arrays[0] = CPoint(148,0);
n=40;
for(int i=1;i<n;i++)
{
lpi+=(2*PI/n);
if(lpi<=2*PI/4)
{
arrays[i] = CPoint(148+148*sin(2*i*PI/n),148-148*cos(2*i*PI/n));
}
if(lpi>2*PI/4 && lpi<=2*PI/2)
{
arrays[i] = CPoint(148+148*sin(PI-2*i*PI/n),148+148*cos(PI-2*i*PI/n));
}
if(lpi>2*PI/2 && lpi<=2*PI*3/4)
{
arrays[i] = CPoint(148-148*sin(2*i*PI/n-2*PI/2),148+148*cos(2*i*PI/n-2*PI/2));
}
if(lpi>2*PI*3/4 && lpi<=2*PI)
{
arrays[i] = CPoint(148-148*sin(2*PI-2*i*PI/n),148-148*cos(2*PI-2*i*PI/n));
}
}
result = TRUE;
SetTimer(1,300,NULL);
return TRUE;
}
void CPictureCartoonDlg::OnTimer(UINT nIDEvent)
{
CRect rc;
m_picture.GetClientRect(&rc);
CDC* pDC = m_picture.GetDC();
pDC->FillRect(&rc,NULL);
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
pDC->SelectObject(&pen);
if(result)
{
for(int j=0;j<n;j=j+2)
{
for(int k=0;k<=j;k=k+2)
{
pDC->MoveTo(arrays[j]);
pDC->LineTo(arrays[k]);
}
}
}
else
{
for(int j=1;j<=n;j=j+2)
{
for(int k=1;k<=j;k=k+2)
{
pDC->MoveTo(arrays[j]);
pDC->LineTo(arrays[k]);
}
}
}
result = !result;
CDialog::OnTimer(nIDEvent);
}
http://book.csdn.net/bookfiles/565/10056518719.shtml
- 动态对话框
- 动态对话框的创建
- 动态对话框的实现
- Qt动态生成对话框
- qt 动态对话框
- 对话框动态生成控件
- 动态加载 对话框背景
- 动态加载 对话框背景
- 动态创建进度条对话框
- 动态设置对话框大小
- 动态创建对话框方法
- Qt 动态对话框
- 动态关闭消息对话框
- Qt下的动态对话框
- 动态库中创建对话框
- 对话框的动态创建 转
- 全动态代码实现对话框
- qTip2动态生成弹出对话框
- FlashXP命令行
- 角点检测相关资源
- Linux平台下文件的压缩与解压参数说明
- Fiddler调试本机
- c# GDI+简单绘图(一)
- 动态对话框
- Linux文件类型
- ubuntu codeblocks 更改调试终端
- 关于我的SQL
- c# GDI+简单绘图(二)
- C++ explicit
- 在ASP.NET中使用FCKeditor的方法
- C# GDI+ 简单绘图 (三) 实现仿QQ截图功能
- 大家好