zoukankan      html  css  js  c++  java
  • 积累的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);
    }

  • 相关阅读:
    doc文档生成带目录的pdf文件方法
    Android uses-permission 权限大全
    AndroidManifest.xml配置文件详解 (转)
    解决导入Android例子时“Unable to resolve target 'android-x' ”的错误
    Eclipse导入Android项目的方法(转)
    数据结构与算法问题 AVL二叉平衡树
    TinyXml 与 Rapidxml效率对照
    HDU 1176-免费馅饼(DP_逆推)
    【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
    交换机基础
  • 原文地址:https://www.cnblogs.com/lidabo/p/3703522.html
Copyright © 2011-2022 走看看