<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    精通 VC++ 實效編程280例 - 01 窗口

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注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中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全