最近在看这本书,在这里把一些自己原来不太熟和没太用过的函数记下来。肯定不是完全的280个例子,因为有一部分我已经会了,就不发了,大家有兴趣的也去买书吧 ^_^
1、最大化和最小化窗口
SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0);//最大化
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);//最小化
SendMessage(WM_SYSCOMMAND,SC_RESTORE,0);//恢复窗口
2、关闭窗口
SendMessage(WM_CLOSE,0,0);
3、设置窗口大小和位置
SetWindowPos(NULL,0,0,320,200,SWP_NOZORDER);
MoveWindow(0,200,200,320);
4、居中显示窗口
CenterWindow();
5、设置顶层窗口
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
6、显示或隐藏窗口的标题栏
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);//删除标题栏风格
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);//添加标题栏风格
7、改变窗口形状
CRect rect;
GetClientRect(rect);
CRgn rgn;
rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);//设置矩形窗口
rgn.CreateEllipticRgn(0,0,rect.Width(),rect,Height());//设置椭圆形窗口
rgn.CreateRoundRectRgn(0,0,rect.Width(),rect.Height(),rect.Width()/2,rect.Height()/2);//设置圆矩形窗口
CPoint point[6];
point[0].x = 0;
point[0].y = rect.Height()/2;
point[1].x = rect.Width()/2;
point[1].y = 0;
point[2].x = 2*rect.Width()/3;
point[2].y = 0;
.....
rgn.CreatePolygonRgn(point,6,ALTERNATE);//设置多边形窗口
setWindowRgn((HRGN)rgn,TRUE);
8、窗口闪烁
SetTimer(1,1000,NULL);
if (nIDEvent == 1)
{
FlashWindow(TRUE);
}
CDialog::OnTimer(nIDEvent);
9、枚举所有窗口类名及名称
第一种方法:
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 = "";
::GetClassName(pWnd->GetSafeHwnd(),strClassName.GetBuffer(256),256);
strClassName.ReleaseBuffer();
pList->InsertItem(nItem,strClassName);
CString strWindowText = "";
::GetWindowText(pWnd->GetSafeHwnd(),strWindowText.GetBuffer(256),256);
strWindowText.ReleaseBuffer();
pList->SetItemText(nItem,1,strWindowText);
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
pList->SetRedraw(TRUE);
第二种方法:
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
pList->DeleteAllItems();
pList->SetRedraw(FALSE);
::EnumWindows(EnumWndProc,(LPARAM)pList);
pList->SetRedraw(TRUE);
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
if (hwnd == NULL)
{
return FALSE;
}
CListCtrl* pList = (CListCtrl*)lParam;
int nItem = pList->GetItemCount();
CString strClassName = "";
::GetClassName(hwnd,strClassName.GetBuffer(256),256);
strClassName.ReleaseBuffer();
pList->InsertItem(nItem,strClassName);
CString strWindowText = "";
::GetWindowText(hwnd,strWindowText.GetBuffer(256),256);
strWindowText.ReleaseBuffer();
pList->SetItemText(nItem,1,strWindowText);
return TRUE;
}
10、客户区背景图片
OnInitDialog():
CRect rect;
GetWindowRect(&rect);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
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,x+1,y+1);
rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);
}
}
}
SetWindowRgn((HRGN)rgn1,TRUE);
ReleaseDC(pDC);//以上的图片窗口的代码,使用后背景将变为资源中的第一个BMP位图
OnEraseBkGnd():
CRect rect;
GetWindowRect(&rect);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CDC dc;
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&bmp);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
return TRUE;
至此,窗口部分,整理完成,效果图如下: