手机网站关键词优化,西安网站设计建设公司,我想弄个网站,云浮 网站建设窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的非客户区和应用绘画的客户区.
在MFC中,CWnd类为各种窗口提供了基类.
1,通过窗柄取得CWnd指针
可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针.
void CD…窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的非客户区和应用绘画的客户区.
在MFC中,CWnd类为各种窗口提供了基类.
1,通过窗柄取得CWnd指针
可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针.
void CDemoDlg::OnButton1()
{HWND hWnd GetSafeHwnd();//取得当前窗口的句柄CWnd* pWnd CWnd::FromHandle(hWnd);//通过窗柄取得CWnd指针CString strText _T();strText.Format(pWnd0x%X\nthis0x%X\n,pWnd,this);AfxMessageBox(strText);
}2,取得应用主窗口的指针
在CWinThread::m_pMainWnd中保存主窗口指针.可首先调用AfxGetApp函数取得应用的指针,然后通过应用指针取得主窗口的指针.
void CDemoDlg::OnButton2()
{CDemoApp* pApp (CDemoApp*)AfxGetApp();//取得应用指针CWnd* pMainWnd pApp-m_pMainWnd;//取得主窗口指针CString strText _T();strText.Format(pMainWnd0x%X\nthis0x%X\n,pMainWnd,this);AfxMessageBox(strText);
}3,取得指定点的窗口
可调用CWnd::WindowFromPoint函数,取得指定点的窗口. a,在CDemoDlg类中重载CWnd::PreTranslateMessage函数.
BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg)
{if (pMsg-message WM_MOUSEMOVE){CPoint point(LOWORD(pMsg-lParam),HIWORD(pMsg-lParam));::ClientToScreen(pMsg-hwnd, point);//按屏幕坐标转换客户区坐标OnMouseMove(0,point);}return CDialog::PreTranslateMessage(pMsg);
}b,在CDemoDlg类中添加WM_MOUSEMOVE消息处理函数.
void CDemoDlg::OnMouseMove(UINT nFlags, CPoint point)
{CWnd* pWnd WindowFromPoint(point);//取得指定点的窗口if (pWnd ! NULL){TRACE(%d\n,pWnd);if (IsChild(pWnd)){CString strText _T();pWnd-GetWindowText(strText);SetWindowText(strText);}}CDialog::OnMouseMove(nFlags, point);
}4,最大化和最小化窗口
可调用CWnd::SendMessage函数发送最大化或最小化窗口消息,来最大化和最小化窗口.
LRESULT SendMessage(
UINT message,//发送的消息,值为WM_SYSCOMMAND时表示系统命令消息.
WPARAM wParam 0,//当消息值为WM_SYSCMMAND,参数字参值为SC_MAXIMIZE,SC_MINIMIZE,
LPARAM lParam 0 );//SC_RESTORE时分别表示最大化窗口,最小化窗口,恢复窗口.void CDemoDlg::OnButton3()
{//最大化窗口SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0);
}
void CDemoDlg::OnButton4()
{//最小化窗口SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
}
void CDemoDlg::OnButton5()
{//恢复窗口SendMessage(WM_SYSCOMMAND,SC_RESTORE,0);
}5关闭窗口
可调用CWnd::SendMessage函数,发送WM_CLOSE消息来关闭窗口.框架调用CWnd::OnClose函数处理WM_CLOSE消息. 默认,OnClose调用函数CWnd::DestroyWindow函数来关闭窗口.
void CDemoDlg::OnButton6()
{//关闭窗口SendMessage(WM_CLOSE,0,0);
}
void CDemoDlg::OnClose()//添加WM_CLOSE消息处理函数
{//判断是否关闭if (IDYES MessageBox(_T(是否关闭窗口?),NULL,MB_YESNO)){CDialog::OnClose();}
}6设置窗口的大小和位置
可通过两个方法设置窗口大小和位置:1.调用CWnd::SetWindowPos函数;2.调用CWnd::MoveWindow函数.
void CDemoDlg::OnButton7()
{//设置窗口的大小和位置SetWindowPos(NULL,0,0,320,200,SWP_NOZORDER);
}
void CDemoDlg::OnButton8()
{//设置窗口的大小和位置MoveWindow(0,200,200,320);
} 7居中显示窗口
可调用CWnd::CenterWindow函数居中显示窗口.
void CDemoDlg::OnButton9()
{//居中显示窗口CenterWindow();
} 8顶层显示窗口
可调用CWnd::SetWindowPos函数顶层显示窗口,按最顶层设置对话框窗口的层次.
void CDemoDlg::OnButton10()
{//设置窗口层次SetWindowPos(wndTopMost,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);//SWP_NOSIZE:表示窗口保持当前的大小,SWP_NOMOVE:表示窗口保持当前的位置
}9设置窗口图标
首先调用CWinApp::LoadIcon函数加载图标资源,然后调用CWnd::SetIcon函数设置图标.
void CDemoDlg::OnButton11()
{//加载图标HICON hIcon AfxGetApp()-LoadIcon(IDI_ICON);//设置图标SetIcon(hIcon,FALSE);//假:设置程序小图标,真:设置任务栏大图标
} 10取得和设置窗口的标题
可分别调用CWnd::GetWindowText和CWnd::SetWindowText函数,取得和设置窗口标题.
void CDemoDlg::OnButton12()
{CString strText _T();GetWindowText(strText);//取得窗口标题SetDlgItemText(IDC_TEXT,strText);//设置编辑框文本
}
void CDemoDlg::OnButton13()
{CString strText _T();GetDlgItemText(IDC_TEXT,strText);//取得编辑框文本SetWindowText(strText);//设置窗口标题
}11显示或隐藏窗口的标题栏
可调用CWnd::ModifyStyle函数显示或隐藏窗口的标题栏.
void CDemoDlg::OnButton14()
{//删除标题栏风格ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
}
void CDemoDlg::OnButton15()
{//添加标题栏风格ModifyStyle(0,WS_CAPTION,SWP_FRAMECHANGED);
}12改变窗口形状
标准窗口的形状是矩形的.要改变窗口的形状,首先调用CRgn类的成员函数创建相应形状的区域,然后调用CWnd::SetWindowRgn函数按窗口区域设置它. 可分别用CRgn类的CreateRectRgn,CreateEllipticRgn,CreatePolygonRgn和CreateRoundRectRgn函数来创建矩形,椭圆形,多边形和圆矩形区域.
void CDemoDlg::OnButton16()
{CRect rect;GetClientRect(rect);//创建矩形区域CRgn rgn;rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);//设置窗口的区域SetWindowRgn((HRGN)rgn,TRUE);
}
void CDemoDlg::OnButton17()
{CRect rect;GetClientRect(rect);//创建椭圆形区域CRgn rgn;rgn.CreateEllipticRgn(0,0,rect.Width(),rect.Height());//设置窗口的区域SetWindowRgn((HRGN)rgn,TRUE);
}
void CDemoDlg::OnButton18()
{CRect rect;GetClientRect(rect);CPoint point[6];point[0].x 0;point[0].y rect.Height() / 2;point[1].x rect.Width() / 3;point[1].y 0;point[2].x 2 * rect.Width() / 3;point[2].y 0;point[3].x rect.Width();point[3].y rect.Height() / 2;point[4].x 2 * rect.Width() / 3;point[4].y rect.Height();point[5].x rect.Width() / 3;point[5].y rect.Height();//创建多边形区域CRgn rgn;rgn.CreatePolygonRgn(point,6,ALTERNATE);//设置窗口的区域SetWindowRgn((HRGN)rgn,TRUE);
}
void CDemoDlg::OnButton19()
{CRect rect;GetClientRect(rect);//创建圆矩形区域CRgn rgn;rgn.CreateRoundRectRgn(0,0,rect.Width(),rect.Height(),rect.Width() / 2,rect.Height() / 2);//设置窗口的区域SetWindowRgn((HRGN)rgn,TRUE);
}13设置窗口的透明区域
要设置窗口的透明区域,首先调用CRgn::CreateRectRgn创建一个区域,然后调用CRgn::CombineRgn函数,去掉需要透明的区域,最后调用CWnd::SetWindowRgn函数按窗口区域设置它.
void CDemoDlg::OnButton20()
{CRect rect1;GetWindowRect(rect1);CRect rect2;GetClientRect(rect2);ClientToScreen(rect2);CRgn rgn1;rgn1.CreateRectRgn(rect1.left,rect1.top,rect1.right,rect1.bottom);CRgn rgn2;rgn2.CreateRectRgn(rect2.left,rect2.top,rect2.right,rect2.bottom);CRgn rgn;rgn.CreateRectRgn(0,0,1,1);rgn.CombineRgn(rgn1,rgn2,RGN_DIFF);//设置窗口区域SetWindowRgn((HRGN)rgn,TRUE);
}14透明窗口
要实现透明窗口,首先调用CWnd::ModifyStyleEx函数,添加窗口的WS_EX_LAYERED(0x00080000)扩展风格,然后调用SDK的SetLayeredWindowAttributes函数设置窗口的透明和透明色.
void CDemoDlg::OnButton21()
{//添加WS_EX_LAYERED(0x80000)扩展风格ModifyStyleEx(0,0x80000);//加载User32.DLL动态链接库HMODULE hModule LoadLibrary(User32.DLL);if (hModule ! NULL){typedef BOOL (WINAPI *FUNC)(HWND,COLORREF,BYTE,DWORD);//取得SetLayeredWindowAttributes函数指针FUNC func (FUNC)GetProcAddress(hModule,SetLayeredWindowAttributes);if (func ! NULL){func(GetSafeHwnd(),0,128,2);}FreeLibrary(hModule);}
}15窗口闪烁
可调用CWnd::FlashWindow函数闪烁窗口.
void CDemoDlg::OnButton22()
{//设置计时器SetTimer(1,1000,NULL);
}
void CDemoDlg::OnButton23()
{//关闭计时器KillTimer(1);//窗口返回原状态FlashWindow(FALSE);
}
void CDemoDlg::OnTimer(UINT nIDEvent)
{if (nIDEvent 1){//窗口从一个状态闪烁到另一个状态FlashWindow(TRUE);}CDialog::OnTimer(nIDEvent);
}16图片窗口
要实现图片窗口,首先调用CRgn::CreateRectRgn和CRgn::CombineRgn函数创建并合并多个区域,然后调用CWnd::SetWindowRgn函数按窗口区域设置它.
VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数):
void CDemoDlg::OnButton24()
{CRect rect;GetWindowRect(rect);//加载位图CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);//将位图选入设备环境CDC dc;CDC *pDC GetDC();dc.CreateCompatibleDC(pDC);dc.SelectObject(bmp);//将位图中黑色区域变成透明区域CRgn rgn1;rgn1.CreateRectRgn(0,0,rect.Width(),rect.Height());for (int x 0;x rect.Width();x){for (int y 0;y rect.Height();y){COLORREF cr dc.GetPixel(x,y);if (cr RGB(0,0,0)){CRgn rgn2;rgn2.CreateRectRgn(x,y,x1,y1);rgn1.CombineRgn(rgn1,rgn2,RGN_XOR);}}}//设置窗口区域SetWindowRgn((HRGN)rgn1,TRUE);ReleaseDC(pDC);
}//添加WM_ERASEBKGND消息处理函数
BOOL CDemoDlg::OnEraseBkgnd(CDC* pDC)
{CRect rect;GetWindowRect(rect);CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);CDC dc;dc.CreateCompatibleDC(pDC);dc.SelectObject(bmp);pDC-BitBlt(0,0,rect.Width(),rect.Height(),dc,0,0,SRCCOPY);return TRUE;
}17动画窗口
可调用SDK的动画窗口函数,实现动画窗口.
BOOL CDemoDlg::OnInitDialog()
{CDialog::OnInitDialog();//...居中窗口CenterWindow();//显示动画窗口AnimateWindow(GetSafeHwnd(), 3000, AW_BLEND);return TRUE;
}18桌面窗口
可调用CWnd::GetDesktopWindow函数,取得桌面窗口.
void CDemoDlg::OnButton25()
{//取得桌面窗口CWnd* pWnd CWnd::GetDesktopWindow();//取得窗口大小CRect rect;pWnd-GetClientRect(rect);CString strText _T();strText.Format(_T(桌面窗口大小:%dX%d),rect.Width(),rect.Height());AfxMessageBox(strText);
}19最小化桌面所有窗口
窗口中可利用快捷键WinM最小化所有窗口.因此,可通过向任务栏窗口发送ID为0x1F5(WinM)的WM_HOTKEY消息,来最小化桌面所有窗口. 首先调用CWnd::FindWindow函数取得窗口,然后调用CWnd::SendMessage函数向窗口发送消息.
void CDemoDlg::OnButton26()
{//取得任务栏窗口CWnd* pWnd CWnd::FindWindow(_T(Shell_TrayWnd),NULL);//发送ID为0x1F5(WinM)的WM_HOTKEY消息pWnd-SendMessage(WM_HOTKEY,0x1F5);
}20取任务栏窗口
可调用CWnd::FindWinow函数,取得任务栏窗口.
void CDemoDlg::OnButton27()
{//取得任务栏窗口CWnd* pWnd CWnd::FindWindow(_T(Shell_TrayWnd),NULL);//取得窗口大小CRect rect;pWnd-GetClientRect(rect);CString strText _T();strText.Format(_T(任务栏窗口大小:%dX%d),rect.Width(),rect.Height());AfxMessageBox(strText);
}21显示或隐藏任务栏
显示或隐藏任务栏;首先调用CWnd::FindWindow函数取得窗口,然后调用CWnd::ShowWindow函数隐藏或显示窗口.
void CDemoDlg::OnButton28()
{//取得任务栏窗口CWnd* pWnd CWnd::FindWindow(_T(Shell_TrayWnd),NULL);//隐藏窗口if (pWnd-IsWindowVisible()){pWnd-ShowWindow(SW_HIDE);}
}
void CDemoDlg::OnButton29()
{//取得任务栏窗口CWnd* pWnd CWnd::FindWindow(_T(Shell_TrayWnd),NULL);//显示窗口if (!pWnd-IsWindowVisible()){pWnd-ShowWindow(SW_SHOW);}
}22枚举桌面所有顶层窗口
BOOL CDemoDlg::OnInitDialog()
{CDialog::OnInitDialog();//...初化列表框控件CListCtrl* pList (CListCtrl*)GetDlgItem(IDC_LIST);pList-ModifyStyle(LVS_ICON | LVS_SMALLICON | LVS_LIST,LVS_REPORT);pList-SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);pList-InsertColumn(0,_T(窗口类名),LVCFMT_LEFT,115);pList-InsertColumn(1,_T(窗口标题),LVCFMT_LEFT,150);return TRUE;
}枚举桌面所有顶层窗口有两个方法:
a,调用CWnd::GetDesktopWindow和CWnd::GetWindow函数:首先调用CWnd::GetDesktopWindow函数,取得桌面窗口,然后调用CWnd::GetWindow函数,枚举所有子窗口.
void CDemoDlg::OnButton30()
{CListCtrl* pList (CListCtrl*)GetDlgItem(IDC_LIST);pList-DeleteAllItems();pList-SetRedraw(FALSE);//取得桌面窗口CWnd* pDesktopWnd CWnd::GetDesktopWindow();//取得第一个子窗口CWnd* pWnd pDesktopWnd-GetWindow(GW_CHILD);while(pWnd ! NULL){int nItem pList-GetItemCount();//取得窗口类名CString strClassName _T();::GetClassName(pWnd-GetSafeHwnd(),strClassName.GetBuffer(256),256);strClassName.ReleaseBuffer();pList-InsertItem(nItem,strClassName);//取得窗口标题CString strWindowText _T();::GetWindowText(pWnd-GetSafeHwnd(),strWindowText.GetBuffer(256),256);strWindowText.ReleaseBuffer();pList-SetItemText(nItem,1,strWindowText);//继续取得下个子窗口pWnd pWnd-GetWindow(GW_HWNDNEXT);}pList-SetRedraw(TRUE);
}b,调用SDK的EnumWindows函数. //添加全局函数
BOOL CALLBACK EnumWndPorc(HWND hWnd,LPARAM lParam)
{if (hWnd NULL){return FALSE;}CListCtrl* pList (CListCtrl*)lParam;int nItem pList-GetItemCount();//取得窗口类名CString strClassName _T();::GetClassName(hWnd,strClassName.GetBuffer(256),256);strClassName.ReleaseBuffer();pList-InsertItem(nItem,strClassName);//取得窗口标题CString strWindowText _T();::GetWindowText(hWnd,strWindowText.GetBuffer(256),256);strWindowText.ReleaseBuffer();pList-SetItemText(nItem,1,strWindowText);return TRUE;
}
void CDemoDlg::OnButton31()
{CListCtrl* pList (CListCtrl*)GetDlgItem(IDC_LIST);pList-DeleteAllItems();pList-SetRedraw(FALSE);//枚举窗口::EnumWindows(EnumWndPorc,(LPARAM)pList);pList-SetRedraw(TRUE);
}