天天看點

積累的VC程式設計小技巧之圖示、光标及位圖

(1).Windows中的圖示其實是有兩個圖像組成的,其中一個用于與它要顯示的位置的圖像做“AND”操作,另一個作“XOR”操作。

::DrawIconEx(pDC->GetSafeHdc(),point.x,point.y,icon,icosize,icosize,0,NULL,DI_NORMAL);

  [問題提出]

  有的時候,如:類資料總管會遇到獲得程式圖示并顯示的操作,如何實作呢?

  [解決方法]

  SDK函數SHGetFileInfo來獲得有關檔案的很多資訊:如大小圖示,屬性,類型等. 

  [程式實作]

  建立名為My的SDI工程.在OnPaint()函數中加入:

  void CMyView::OnPaint() 

  {

   CPaintDC dc(this); // device context for painting

   HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); 

   if (hIcon && hIcon!=(HICON)-1) 

   dc.DrawIcon(10,10,hIcon); 

   // TODO: Add your message handler code here

   // Do not call CView::OnPaint() for painting messages

  }

  說明:_T("NotePad.exe")指的是要獲得什麼程式的圖示.

  或者在OnDraw()中(此時必須保證沒有OnPaint()函數,想想為何?)

  void CMyView::OnDraw(CDC* pDC)

   CMyDoc* pDoc = GetDocument();

   ASSERT_VALID(pDoc);

   // TODO: add draw code for native data here

   if (hIcon &&hIcon!=(HICON)-1) 

   pDC->DrawIcon(10,10,hIcon); 

在對話框/視窗/你需要的地方加上對WM_SETCURSOR消息的處理.

BOOL MyDialog::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)

{

    // TOD Add your message handler code here and/or call default

    ::SetCursor(AfxGetApp()->LoadCursor(IDC_MYCURSOR));

    return TRUE;

    //return CDialog::OnSetCursor(pWnd, nHitTest, message);

}

視窗類光标風格不能為NULL.

  修改圖示資源IDR_MAINFRAME。它有兩個圖示,一個是16*16的,另一個是32*32的,注意要一起修改。

  動态更改: 向主視窗發送WM_SETICON消息.代碼如下:

HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON);

ASSERT(hIcon);

AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);

以下兩個函數可以為應用程式中的各子視窗顯示一個任務條到工作列并更改它們的圖示。對那些象QQ一樣隐藏主視窗的應用程式特别有用。

//函數用途:更改一個視窗的圖示并将其顯示在工作列、任務切換條、任務管理器裡

//參數說明:

//hWnd 要改變圖示的視窗句柄

//hLargeIcon 顯示到任務切換條上的圖示 32*32

//hSmallIcon 顯示到除任務切換條之外的圖示 16*16

//hIcon 顯示的圖示,32*32,在顯示到任務切換條之外的其餘地方時會被自動壓縮成16*16的。

//注釋:

//此函數對于模式對話框無能為力。

//如果HICON 為NULL,函數不改變視窗圖示,但是将原有圖示顯示到工作列、

// 任務切換條、任務管理器裡。

//此函數是通過将視窗的父視窗指針置空來實作将圖示顯示到工作列、任務切換條、

// 任務管理器裡的,是以調用完成後,其父視窗指針不再可用。

BOOL SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon);

BOOL SendWndIconToTaskbar(HWND hWnd,HICON hIcon);

BOOL CUIApp::SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon)

 BOOL ret = TRUE;

 ASSERT(hWnd);

 if(!::IsWindow(hWnd))

  return FALSE;

 //擷取視窗指針

 CWnd* pWnd;

 pWnd = pWnd->FromHandle(hWnd);

 ASSERT(pWnd);

 if(!pWnd)

 //将父視窗設為NULL

 if(pWnd->GetParent())

  if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) == 0)

   return FALSE;

  if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))

   ret = FALSE;

  //設定視窗圖示

  if(hLargeIcon && hSmallIcon)

  {

   pWnd->SetIcon(hSmallIcon,FALSE);

   pWnd->SetIcon(hLargeIcon,TRUE);

  }

  return ret;

 }

BOOL CUIApp::SendWndIconToTaskbar(HWND hWnd,HICON hIcon)

  //擷取視窗指針

 if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))

  ret = FALSE;

 //設定視窗圖示

 pWnd->SetIcon(hIcon,TRUE);

 pWnd->SetIcon(hIcon,FALSE);

 return ret;

//在Staic控件内顯示位圖

void CShowBmpInDlgDlg::ShowBmpInStaic()

    CBitmap hbmp;

    HBITMAP hbitmap;

    //将pStatic指向要顯示的地方

    CStatic *pStaic;

    pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);

    //裝載資源 MM.bmp是我的一個檔案名,用你的替換

    hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"MM.bmp",

        IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

    hbmp.Attach(hbitmap);

    //擷取圖檔格式

    BITMAP bm;

    hbmp.GetBitmap(&bm);

    CDC dcMem;

    dcMem.CreateCompatibleDC(GetDC());

    CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);

    CRect lRect;

    pStaic->GetClientRect(&lRect);

    //顯示位圖

    pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),

        &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

    dcMem.SelectObject(&poldBitmap);