Image to cursor icon

  • q7_382181
    了解作者
  • 49.7MB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-15 05:11
    上传日期
Windows MFC开发,ATL::Image bmp转icon, 并将icon设置光标,实现CImage加载图片转icon,并将icon设置为鼠标光标。主要是在mfc框架下使用
loadImageToIconAndSetCursor.zip
内容介绍
 // TestSaveImageInDiffTypeDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "TestSaveImageInDiffType.h" #include "TestSaveImageInDiffTypeDlg.h" #include "afxdialogex.h" #include <atlimage.h rel='nofollow' onclick='return false;'> #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CTestSaveImageInDiffTypeDlg 对话框 CTestSaveImageInDiffTypeDlg::CTestSaveImageInDiffTypeDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_TESTSAVEIMAGEINDIFFTYPE_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTestSaveImageInDiffTypeDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CTestSaveImageInDiffTypeDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CTestSaveImageInDiffTypeDlg::OnBnClickedButton1) ON_WM_SETCURSOR() END_MESSAGE_MAP() // CTestSaveImageInDiffTypeDlg 消息处理程序 BOOL CTestSaveImageInDiffTypeDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CTestSaveImageInDiffTypeDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CTestSaveImageInDiffTypeDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CTestSaveImageInDiffTypeDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } HICON HICONFromCBitmap(CBitmap& bitmap) { BITMAP bmp; bitmap.GetBitmap(&bmp); HBITMAP hbmMask = ::CreateCompatibleBitmap(::GetDC(NULL), bmp.bmWidth, bmp.bmHeight); ICONINFO ii = { 0 }; ii.fIcon = TRUE; ii.hbmColor = bitmap; ii.hbmMask = hbmMask; HICON hIcon = ::CreateIconIndirect(&ii);//一旦不再需要,注意用DestroyIcon函数释放占用的内存及资源 ::DeleteObject(hbmMask); return hIcon; } HRESULT SaveIcon(HICON hIcon, const wchar_t* path) { // Create the IPicture intrface PICTDESC desc = { sizeof(PICTDESC) }; desc.picType = PICTYPE_ICON; desc.icon.hicon = hIcon; IPicture* pPicture = 0; HRESULT hr = OleCreatePictureIndirect(&desc, IID_IPicture, FALSE, (void**)&pPicture); if (FAILED(hr)) return hr; // Create a stream and save the image IStream* pStream = 0; CreateStreamOnHGlobal(0, TRUE, &pStream); LONG cbSize = 0; hr = pPicture->SaveAsFile(pStream, TRUE, &cbSize); // Write the stream content to the file if (!FAILED(hr)) { HGLOBAL hBuf = 0; GetHGlobalFromStream(pStream, &hBuf); void* buffer = GlobalLock(hBuf); HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); if (!hFile) hr = HRESULT_FROM_WIN32(GetLastError()); else { DWORD written = 0; WriteFile(hFile, buffer, cbSize, &written, 0); CloseHandle(hFile); } GlobalUnlock(buffer); } // Cleanup pStream->Release(); pPicture->Release(); return hr; } int smallerImage(CImage* old_image, CImage* new_image) { HDC dcNew = new_image->GetDC(); SetStretchBltMode(dcNew, HALFTONE); old_image->StretchBlt(dcNew, 0, 0, new_image->GetWidth(), new_image->GetHeight()); new_image->ReleaseDC(); return 0; } void CTestSaveImageInDiffTypeDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CImage m_Image; m_Image.Load(L"fr.bmp"); CImage imageNew; imageNew.Create(350, 350, 32); smallerImage(&m_Image, &imageNew); imageNew.Save(L"temp.bmp"); HBITMAP m_cBMPPin; m_cBMPPin = imageNew.Detach(); CBitmap bitmap; bitmap.Attach(m_cBMPPin); HICON abc = HICONFromCBitmap(bitmap); SaveIcon(abc, L"fr.ico"); } BOOL CTestSaveImageInDiffTypeDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CImage m_Image; m_Image.Load(L"fr.bmp"); CImage imageNew; imageNew.Create(256, 256, 32); smallerImage(&m_Image, &imageNew); imageNew.Save(L"temp.bmp"); HBITMAP m_cBMPPin; m_cBMPPin = imageNew.Detach(); CBitmap bitmap; bitmap.Attach(m_cBMPPin); HICON abc = HICONFromCBitmap(bitmap); SetCursor(abc); return TRUE; return CDialogEx::OnSetCursor(pWnd, nHitTest, message); }
评论
    相关推荐
    • MFC Windows 程序设计
      MFC Windows 程序设计 很经典的书,就是卖的太贵了,好不容易找到的资源,拿来给大家分享,由于账号不能传大文件,所以整理了下,分开传上来。
    • MFC windows注册服务
      将可执行程序注册为一个windows服务 将可执行程序注册为一个windows服务
    • MFC Windows 程序设计
      这是一本很不错的书,教你怎样使用MFC的书!想深入学习MFC的都可以看看.我分四部分上传!每部分我编了号,总共15小部分
    • mfc windows程序设计
      mfc windows 程序设计 不用多说,学习mfc的经典书籍,不过是英文版本的。
    • MFC WINDOWS 程序设计
      这是一本非常好的mfcwindows的程序设计书籍,他对与初学者和有一定会编程基础的人员来说是非常有用的。
    • MFC Windows程序设计
      美国人写的MFC Windows程序设计
    • MFC Windows程序设计
      这是一本很不错的书,教你怎样使用MFC的书!想深入学习MFC的都可以看看.我分四部分上传!每部分我编了号,总共15小部分
    • MFCWindows
      这本书是学习MFCwindows编程的有力方法,可以通过这本书了解MFC的所有技术,从易到难从简入繁的给大家讲述MFCWINdows编程
    • MFC windows 数字时钟
      MFC windows 数字时钟,基于MFC单文档编写,提供闹钟功能能
    • MFCWindows
      hello,这个是MFCWindows,windows下编写ui界面必备。