积累的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);
}

积累的VC编程小技巧之图标、光标及位图,布布扣,bubuko.com

时间: 2024-12-25 18:55:32

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

积累的VC编程小技巧之树操作

1.如何在TreeList中加图标? [问题提出]  请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀?  [解决方法]  1)    HICON hicon[8];    m_imageList.Create(16,16,0,8,8);    hicon[0]=AfxGetApp()->LoadIcon(IDI_ICON0);    hicon[1]=AfxGetApp()->LoadIcon(IDI_ICON1);    hicon[2

积累的VC编程小技巧之属性页

1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch:最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码: m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0); //使选项卡的按钮在下面 if(m_tabsheet.m_hWnd) m_tabsheet.

积累的VC编程小技巧之对话框

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之工具提示

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之框架窗口及其他

1.修改主窗口风格 AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名.窗口是叠加型的.可改变窗口大小等.要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs.CWnd::PreCreateWindow 函数先于窗口创建函数执行.如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT

积累的VC编程小技巧之文件操作

1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){    CString path = strPathName;    if (path.Right(1) != _T("\\"))        path += _T("\\");    path += _T("*.*");    CFileFind ff;    BOOL res =

积累的VC编程小技巧之组合框

1.如何正确的得到ComBox的指针 CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CComboBox*)::GetDlgItem(m_hWnd,IDC_DuanCB); 2.CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list). CCom

积累的VC编程小技巧之列表框

1.列表框中标题栏(Column)的添加 创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report.Align项里选择Top.Sort项里选择None. 然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码: CString strname[3]; strname[0]="Screen Name"; strname[1]=&

积累的VC编程小技巧之工具条和状态条

1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上). 其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类:也可以选择工程的根,然后点击右键,选择新的类:或者CTL+W,选择增加类/新的类 --- 然后在class type里选择Generic Class,在Name栏里输入新类的名