(1).Windows中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做“AND”操作,另一个作“XOR”操作。
透明:用“白色”AND,用“黑色”XOR
反色:用“白色”AND,用“白色”XOR
正常色:用“黑色”AND,用正常颜色XOR.
(2). WIN9X中好像是对像素的操作实现透明的
WIN2K中就有API直接实现透明了!
WIN2K中
GetWindowLong
SetWindowLong
SetLayeredWindowAttributes
三个API就可以实现透明了!
(3)
::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
HICON hIcon=::
ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
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)
return
FALSE;
//将父窗口设为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)
{
BOOL
ret = TRUE;
ASSERT(hWnd);
if(!::IsWindow(hWnd))
return FALSE;
//获取窗口指针
CWnd* pWnd;
pWnd
= pWnd->FromHandle(hWnd);
ASSERT(pWnd);
if(!pWnd)
return
FALSE;
//将父窗口设为NULL
if(pWnd->GetParent())
if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL)
== 0)
return
FALSE;
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);
}
积累的VC编程小技巧之图标、光标及位图,布布扣,bubuko.com
原文:http://www.cnblogs.com/lidabo/p/3703522.html