积累的VC编程小技巧之图标、光标及位图

简介: 1.图标透明 (1).Windows中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做“AND”操作,另一个作“XOR”操作。 透明:用“白色”AND,用“黑色”XOR 反色:用“白色”AND,用“白色”XOR 正常色:用“黑色”AND,用正常颜色XOR.

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

目录
相关文章
|
12天前
|
数据库 iOS开发 MacOS
Lyricsx让歌词悬浮于最顶层
Lyricsx让歌词悬浮于最顶层
18 0
【C语言】——实现鼠标与画布(黑框)交互,根据鼠标移动,进行你所想要的个性体验
在之前的学习内容中,我们学习了使用键盘控制我们的代码小游戏,硬件也不只有键盘吧,还缺啥?那肯定是我们的鼠标,键盘的交互,我们使用了下面这种类型的代码,进行AWSD移动操作,十分简单。而我们今天的鼠标,也同样简洁易懂。
【C语言】——实现鼠标与画布(黑框)交互,根据鼠标移动,进行你所想要的个性体验
C语言——函数的综合运用。自定义函数,gotoxy清屏函数与HideCursor隐藏光标,防闪屏,共同制作打飞机游戏。
①在变量中,我们必须进行定义赋值初始化后,才能在程序中使用,所以需要一个“地方”,整理好这些变量,在程序中整洁一些void startup() //数据初始化②打出画面中所显示的所需代码,也给一个函数void show() //显示画面③在游戏运行中,飞机的移动,发射等操作必须使用键盘,此时就要进行输入判断,给出相应的函数,实行不同的命令 ,其中分为两种,一种是程序运行时对输入做出变化,另一种是不变化void updateWithoutInput() //与用户输入无关的更新。
C语言——函数的综合运用。自定义函数,gotoxy清屏函数与HideCursor隐藏光标,防闪屏,共同制作打飞机游戏。
|
前端开发 C++
QML学习笔记(四)-Canva画板画图功能-跟随鼠标位置进行随笔画
参考博主文章进行整理了代码,实现功能参考:https://blog.csdn.net/UbuntuTouch/article/details/46375697 源码:https://github.com/sueRimn/QML-ExampleDemos 更多的鼠标实时画图-画直线画圆画矩形等看下...
2320 0
|
自然语言处理 容器 前端开发
教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)
教大家如何在word 2007中打出(非编辑器):  如果要在多个字符串上面加上划线,可以使用一下步骤 按下“Ctrl+F9”组合键,出现“{}”,在{}中输入“EQ \x\to(要加上划线的字符串)”,然后按F9。
1097 0
|
Web App开发 JavaScript 前端开发
新奇!让简单的页面瞬间变酷的图标填充效果
  有时候,你只是想创造一些真正很酷的效果。例如我们网站常见的关于我们(About us),我们的历史(Our history)等你想展示出一些让你的品牌与众不同的页面。图标填充效果可以帮你设计出一个很酷的网页,只需要几个图标即可,让简单的页面看起来也充满活力。
797 0
积累的VC编程小技巧之标题栏和菜单
1.窗口最大最小化按纽的控制 ①怎样在程序开始的时候让它最大化? ②vc++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能? ③如何在显示窗口时,使最大化按钮变灰?   ①在App类里的C…App::InitInstance()中把m_pMainWnd->Sh...
1038 0
|
.NET 数据安全/隐私保护 开发框架
积累的VC编程小技巧之编辑框
1.如何让对话框中的编辑框接收对话框的消息 ////////////////////////////////////////////////// 如何让对话框中的CEdit控件类接收对话框的消息////////////////////////////////////////////////1、在对话框中增加一个ID 为IDC_EDIT1的CEdit1控件2、通过ClassWizard 生成一个基于CEdit的新类CMyEdit,CMyEdit  m_wndEdit;3、在对话框OnInitDialog()中,将m_wndEdit子类化,使其能够接受对话框的消息。
1064 0
|
Windows
积累的VC编程小技巧之工具提示
1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);}   2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理。
1184 0