一. 图标的设置
- 加载图标
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. 运行效果