积累的VC编程--图标、光标及位图(转)

1.图标透明

(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);

 

2.如何获得其他程序的图标,并显示在View中

  [问题提出]

  有的时候,如:类资源管理器会遇到获得程序图标并显示的操作,如何实现呢?

  [解决方法]

  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); 

  }

 

3.如何改变默认的光标形状

在对话框/窗口/你需要的地方加上对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.

 

 

4.改变应用程序的图标静态更改

  修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是32*32的,注意要一起修改。

 

  动态更改: 向主窗口发送WM_SETICON消息.代码如下:

 

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

ASSERT(hIcon);

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

 

 

5.更改窗口图标并将其显示在任务栏

以下两个函数可以为应用程序中的各子窗口显示一个任务条到任务栏并更改它们的图标。对那些象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;

}

 

6.如何将位图缩放显示在Static控件中

//在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);

}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值