[00013]-[2015-08-27]-[01]-[Windows 程序设计 ---GDI+ 截图---> BMP OR JPG OR PNG ...]

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)
{
return -1;
}

pImageCodecInfo = (ImageCodecInfo*)malloc(size);
if(pImageCodecInfo==NULL)
{
return -1;
}

Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);

for(UINT i = 0; i < num; i++)
{
if(wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return i;
}
}

free(pImageCodecInfo);
return -1;
}

BOOL SaveHDCToFile(HDC hDC, LPRECT lpRect)
{
BOOL bRet = FALSE;
int nWidth = lpRect->right - lpRect->left;
int nHeight = lpRect->bottom - lpRect->top;

HDC memDC = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, nWidth, nHeight);
SelectObject(memDC, hBmp);
BitBlt(memDC, 0, 0, nWidth, nHeight,
hDC, 0, 0, SRCCOPY);

CLSID bmpClsid;
// //L"image/bmp" L"image/jpeg" L"image/gif" L"image/tiff" L"image/png"
GetEncoderClsid(L"image/jpeg", &bmpClsid);

Gdiplus::Bitmap* pBmpSrc = Gdiplus::Bitmap::FromHBITMAP(hBmp, NULL);

if(pBmpSrc->Save(L"1.jpg", &bmpClsid) == Ok)
{
bRet = TRUE;
}

delete pBmpSrc;

SelectObject(memDC, (HBITMAP)NULL);
DeleteDC(memDC);
DeleteObject(hBmp);
return bRet;
}

void CDemo01Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
HDC hDC = ::GetWindowDC(m_hWnd);
RECT rect;
::GetWindowRect(m_hWnd, &rect);
CString str;
str.Format("left=%d top=%d right=%d bottom=%d", rect.left, rect.top, rect.right, rect.bottom);
MessageBox(str);
SaveHDCToFile(hDC, &rect);
::ReleaseDC(m_hWnd, hDC);
}

void CDemo01Dlg::OnButton2() 
{
// TODO: Add your control notification handler code here
HDC hDC = ::GetDC(m_hWnd);
RECT rect;
::GetClientRect(m_hWnd, &rect);
CString str;
str.Format("left=%d top=%d right=%d bottom=%d", rect.left, rect.top, rect.right, rect.bottom);
MessageBox(str);
SaveHDCToFile(hDC, &rect);
::ReleaseDC(m_hWnd, hDC);
}

时间: 2024-11-09 02:03:11

[00013]-[2015-08-27]-[01]-[Windows 程序设计 ---GDI+ 截图---> BMP OR JPG OR PNG ...]的相关文章

关于《Windows程序设计(第五版)》中一个实例程序的疑问

最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实例源码吧: 1 /*----------------------------------------------------------------- 2 ENVIRON.C -- Environment List Box 3 (c) Charles Petzold,1998 4 Copy by XXXX,2

Windows程序设计画图实现哆啦A梦

在看雪论坛上看到的一个帖子,很喜欢,转载一下.原文地址:http://bbs.pediy.com/showthread.php?t=138630哆啦A梦是画出来的,不知道作者算这些坐标位置算了多久,真的很犀利.记得原来看<Windows程序设计>的时候,每次看到GDI都不是很理解,也没有仔细去研究.现在编程也很少与GDI打交道,还是等以后有空了在深入了解一下吧.把这个代码转载一份到博客,以后再回头研究一下.顺便贴一下程序运行后的截图:(很酷吧~~~)字数补丁~代码疯子~程序人生~字数补丁~代码

《Windows程序设计》复习题

<Windows程序设计>模拟题 一.单项选择题 1. 在VC++中,项目文件的扩展名是(B). A)exe                                             B)dsp C) dsw                                             D)cpp 2. 在MFC中,利用ClassWizard不能(D ). A)建立新类                                    B)进行消息映射 C) 增加类

2015年百度之星程序设计大赛 - 资格赛:IP聚合

1 /* 2 pro:2015年百度之星程序设计大赛 - 资格赛:IP聚合 3 ID:forever95 4 Date:2015-5-25 5 */ 6 //事实证明C++就是一坨屎 7 #include <iostream> 8 #include <string> 9 #include <cstdio> 10 #include <cstdlib> 11 #include <istream> 12 #include <algorithm&g

我关注的一周技术动态 2015.08.30

服务化和资源管理技术 1. Docker基础技术:AUFS http://coolshell.cn/articles/17061.html 要点: 支持层次化镜像是 docker 的一大创新之一, 本文详细介绍了实现层次化镜像的技术手段之一 aufs 的使用方法, 读完之后你就会理解docker层次化镜像的奥秘了. 2. Docker基础技术:DeviceMapper http://coolshell.cn/articles/17200.html 要点: devicemapper 是支持 doc

windows 程序设计自学:添加字符串资源

1 #include <windows.h> 2 #include "resource.h" 3 4 LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window 5 UINT uMsg, // message identifier 6 WPARAM wParam, // first message parameter 7 LPARAM lParam // second message parameter 8 ); 9

windows 程序设计自学:添加图标资源

1 #include <windows.h> 2 #include "resource.h" 3 4 LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window 5 UINT uMsg, // message identifier 6 WPARAM wParam, // first message parameter 7 LPARAM lParam // second message parameter 8 ); 9

windows 程序设计自学:窗口正中显示Hello,World

1 #include <windows.h> 2 3 LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window 4 UINT uMsg, // message identifier 5 WPARAM wParam, // first message parameter 6 LPARAM lParam // second message parameter 7 ); 8 9 int WINAPI WinMain( HINSTANCE h

《windows程序设计》第一章,建议想学API的每天看一章

开始 壹佰软件开发小组  整理编译   本书介绍了在Microsoft Windows 98.Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法.这些程序用C语言编写并使用原始的Windows Application Programming Interface(API).如在本章稍后所讨论的,这不是写作Windows程序的唯一方法.然而,无论最终您使用什么方式写作程序,了解Windows API都是非常重要的. 正如您可能知道的,Windows 98已