MFC:位图和图标的设置

一.  图标的设置

  1.   加载图标  

       API函数:AfxGetApp()->LoadIconW();

 

         2.  显示图标

      API函数:SetClassLong();

      函数原型:DWORD WINAPI SetClassLong(_In_ HWND hWnd,_In_ int nIndex,_In_ LONG dwNewLong);

      参数:

hWnd:窗口句柄及间接给出的窗口所属的类

              一般可设置为m_hWnd

nlndex:指定将被替换的32位值。在额外类存储空间中设置32位值,应指定一个大于或等于0的偏移量。

有效值的范围从0到额外类的存储空间的字节数一4;

例如,若指定了12个字节或多于12个字节的额外类存储空间,则索引值为8时,对应的是第三个32位整数值。

如果要设置WNDCLASSEX结构中的任何值,需要指定下面索引之一:

GCL_CBCLSEXTRA:设置与类相关的尺寸的字节大小。设定该值不改变己分配的额外字节数。

GCL_CBWNDEXTRA:设置与类中的每一个窗口相关的尺寸的字节大小。设定该值不改变已分配额外字节数。查看如何进入该内存,参看SetWindowLOng。

GCL_HBRBACKGROUND:替换与类有关的背景刷子的句柄。

GCL_HCURSOR:替换与类有关的光标的句柄。GCL_HICON:替换与类有关的图标的句柄。

GCL_HMODULE:替换注册类的模块的句柄。GCL_STYLE:替换窗口类的风格位。

GCL_MENUNAME :替换菜单名字符串的地址。该字符串标识与类有关的菜单资源。

GCL_WNDPROC :替换与窗口类有关的窗口过程的地址。

dwNewLong:指定的替换值。

返回值:

返回值的类型:DWORD

如果函数成功,返回值是原来类结构中32位整数;如果没有初始化,返回值为0。如果函数失败,返回值也为0。若想获得更多错误信息,请调用GetLastError函数。

 

二. 位图设置

 1.  加载位图

    API函数:LoadBitmap();

    2.  显示位图

    获取位图像素:GetBitmap();

    设置位图:SetBitmap();

 三.  可以设置宏通过相对路径加载Bitmap和Icon

    1.  通过相对路径获取Bitmap句柄,同时可以设置位图的长和宽

         #define HBMP(filepath,width,hight) (HBITMAP)LoadImage(AfxGetInstanceHandle(), filepath,IMAGE_BITMAP, width, hight,LR_LOADFROMFILE|LR_CREATEDIBSECTION)

    2.  通过相对路径获取Icon句柄,显示默认大小

     #define ICON(filepath) (HICON)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_ICON,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE)

案例(当鼠标放到控件上,控件会随机移动)

  1.  新建一个MFC对话框RuningButton,在对话框中添加两个Button按钮,在解决方案管理器中->右击方案名->添加->类(MyButtom:基类为CButton)

  2.  给Button2添加一个控件变量(m_button:变量类型为MyButtom),使其与类MyButtom关联

  3.  给控件添加一个点击事件

 

 1 //头文件
 2 #pragma once
 3 #include <afxwin.h>
 4 class MyButton :
 5     public CButton
 6 {
 7 public:
 8     MyButton();
 9     ~MyButton();
10     DECLARE_MESSAGE_MAP()
11     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
12 };
13 
14 //cpp源文件
15 #include "stdafx.h"
16 #include "MyButton.h"
17 
18 
19 MyButton::MyButton()
20 {
21 }
22 
23 
24 MyButton::~MyButton()
25 {
26 }
27 BEGIN_MESSAGE_MAP(MyButton, CButton)
28     ON_WM_MOUSEMOVE()
29 END_MESSAGE_MAP()
30 
31 
32 void MyButton::OnMouseMove(UINT nFlags, CPoint point)
33 {
34     // TODO: 在此添加消息处理程序代码和/或调用默认值
35 
36     int x = rand() % 400;
37     int y = rand() % 400;
38 
39     this->MoveWindow(x, y, 128, 128);
40 
41     CButton::OnMouseMove(nFlags, point);
42 }

 

 

  4.  加载位图

 1 //RuningButtonDlg.h
 2 
 3 private:
 4     MyButton m_button;
 5 
 6 //RuningButtonDlg.cpp
 7 
 8 BOOL CRuningButtonDlg::OnInitDialog()
 9 {
10     CDialogEx::OnInitDialog();
11 
12     // 将“关于...”菜单项添加到系统菜单中。
13 
14     // IDM_ABOUTBOX 必须在系统命令范围内。
15     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
16     ASSERT(IDM_ABOUTBOX < 0xF000);
17 
18     CMenu* pSysMenu = GetSystemMenu(FALSE);
19     if (pSysMenu != nullptr)
20     {
21         BOOL bNameValid;
22         CString strAboutMenu;
23         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
24         ASSERT(bNameValid);
25         if (!strAboutMenu.IsEmpty())
26         {
27             pSysMenu->AppendMenu(MF_SEPARATOR);
28             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
29         }
30     }
31 
32     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
33     //  执行此操作
34     SetIcon(m_hIcon, TRUE);            // 设置大图标
35     SetIcon(m_hIcon, FALSE);        // 设置小图标
36 
37     // TODO: 在此添加额外的初始化代码
38 
39     m_button.SetWindowTextW(TEXT("运动的按钮"));
40 
41     CBitmap bitmap;
42     bitmap.LoadBitmapW(IDB_BITMAP1);
43 
44     BITMAP bmp;
45     bitmap.GetBitmap(&bmp);
46 
47     /*m_button.SetBitmap(bitmap);
48 
49     m_button.MoveWindow(0, 0, bmp.bmWidth, bmp.bmHeight);*/
50 
51 
52     //通过相对路径加载位图
53 #define HBMP(filepath,width,hight) (HBITMAP)LoadImage(AfxGetInstanceHandle(), filepath,IMAGE_BITMAP, width, hight,LR_LOADFROMFILE|LR_CREATEDIBSECTION)
54 
55     m_button.SetBitmap(HBMP(TEXT("../32604.bmp"), 100, 100));
56     m_button.MoveWindow(0, 0, 100, 100);
57 
58     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
59 }

 

  5.  运行效果

 

转载于:https://www.cnblogs.com/tiger-elder-brother/p/10233086.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值