睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
窗口是屏幕上的一個矩形區域。窗口分為3種:重疊窗口、彈出窗口和子窗口。每個窗口都有由系統繪制的“非客戶區”和應用程序繪制的“客戶區”。在 MFC 中,CWnd 類為各種窗口提供了基類。
1 通過 HWND 獲得 CWnd 指針
通過 HWND 獲得 Cwnd 指針可以調用 Cwnd::FromHandle 函數。
1
2
3
4
5
6
7
8 |
void CDemoDlg::OnButton1()
{
HWND hWnd = GetSafeHwnd(); //獲得當前窗口的句柄
CWnd* pWnd = CWnd::FromHandle(hWnd); //通過HWND獲得CWnd指針
CString strText = _T("");
strText.Format("pWnd=0x%X\nthis=0x%X\n",pWnd,this);
AfxMessageBox(strText);
} |
2 獲得應用程序主窗口的指針
主窗口指針保存在 CWinThread::m_pMainWnd 中。可以首先調用 AfxGetApp 函數獲得應用程序的指針,然后通過應用程序指針獲得主窗口的指針。
1
2
3
4
5
6
7
8 |
void CDemoDlg::OnButton2()
{
CDemoApp* pApp = (CDemoApp*)AfxGetApp(); //獲得應用程序指針
CWnd* pMainWnd = pApp->m_pMainWnd; //獲得主窗口指針
CString strText = _T("");
strText.Format("pMainWnd=0x%X\nthis=0x%X\n",pMainWnd,this);
AfxMessageBox(strText);
} |
3 獲得指定點的窗口
獲得指定點的窗口可以調用 CWnd::WindowFromPoint 函數。
a 在 CDemoDlg 類中重載 CWnd::PreTranslateMessage 函數。
1
2
3
4
5
6
7
8
9
10 |
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 消息處理函數。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
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, //當 message 值為 WM_SYSCMMAND,參數 wParam 值為 SC_MAXIMIZE、SC_MINIMIZE、
LPARAM lParam = 0 ); //SC_RESTORE 時分別表示最大化窗口、最小化窗口、恢復窗口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
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 函數關閉窗口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
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 函數。
1
2
3
4
5
6
7
8
9
10
11 |
void CDemoDlg::OnButton7()
{
//設置窗口的大小和位置
SetWindowPos(NULL,0,0,320,200,SWP_NOZORDER);
}
void CDemoDlg::OnButton8()
{
//設置窗口的大小和位置
MoveWindow(0,200,200,320);
} |
7 居中顯示窗口
使窗口居中顯示可以調用 CWnd::CenterWindow 函數。
1
2
3
4
5 |
void CDemoDlg::OnButton9()
{
//居中顯示窗口
CenterWindow();
} |
8 頂層顯示窗口
使窗口頂層顯示,可以調用 CWnd::SetWindowPos 函數,設置對話框窗口的層次為最頂層。
1
2
3
4
5 |
void CDemoDlg::OnButton10()
{
//設置窗口層次
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE); //SWP_NOSIZE:表示窗口保持當前的大小,SWP_NOMOVE:表示窗口保持當前的位置
} |
9 設置窗口圖標
首先調用 CWinApp::LoadIcon 函數加載圖標資源,然后調用 CWnd::SetIcon 函數設置圖標。
1
2
3
4
5
6
7 |
void CDemoDlg::OnButton11()
{
//加載圖標
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON);
//設置圖標
SetIcon(hIcon,FALSE); //FALSE:設置程序小圖標,TRUE:設置任務欄大圖標
} |
10 獲得和設置窗口的標題
獲得和設置窗口標題可以分別調用 CWnd::GetWindowText 和 CWnd::SetWindowText 函數。
1
2
3
4
5
6
7
8
9
10
11
12
13 |
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 函數。
1
2
3
4
5
6
7
8
9
10
11 |
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 函數可以分別用來創建矩形、橢圓形、多邊形和圓矩形區域。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 |
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 函數將其設置為窗口區域。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
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 函數設置窗口的透明度和透明色。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
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 函數。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
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函數):
http://guohaiyang.blog.163.com/blog/static/3213403720081027104147/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 |
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,x+1,y+1);
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 的 AnimateWindow 函數。
1
2
3
4
5
6
7
8
9
10 |
BOOL CDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// ...
//窗口居中
CenterWindow();
//顯示動畫窗口
AnimateWindow(GetSafeHwnd(), 3000, AW_BLEND);
return TRUE;
} |
18 桌面窗口
獲得桌面窗口,可以調用 CWnd::GetDesktopWindow 函數。
1
2
3
4
5
6
7
8
9
10
11 |
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 最小化桌面所有窗口
Window 中可以利用快捷鍵 Win+M 最小化所有窗口。因此,可以通過向任務欄窗口發送 ID 為 0x1F5(Win+M) 的 WM_HOTKEY 消息,使桌面所有窗口最小化。首先調用 CWnd::FindWindow 函數獲得窗口,然后調用 CWnd::SendMessage 函數向窗口發送消息。
1
2
3
4
5
6
7 |
void CDemoDlg::OnButton26()
{
//獲得任務欄窗口
CWnd* pWnd = CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
//發送ID為0x1F5(Win+M)的WM_HOTKEY消息
pWnd->SendMessage(WM_HOTKEY,0x1F5);
} |
20 獲取任務欄窗口
獲得任務欄窗口,可以調用 CWnd::FindWinow 函數。
1
2
3
4
5
6
7
8
9
10
11 |
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 函數隱藏或顯示窗口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
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 函數,枚舉所有子窗口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
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 函數。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 |
//添加全局函數
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);
} |
from:http://www.cnblogs.com/iwanc/archive/2013/06/09/2985807.html
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成