2014-01-27 98 views
0

我有一个程序,它的屏幕的镜头在帕斯卡:帕斯卡汉译

uses Graphics, 
    LCLIntf, 
    LCLType; 

var 
    Screen: TBitmap; 
    ScreenDC: HDC; 
begin 
    Screen := TBitmap.Create; 
    ScreenDC := GetDC(0); 
    Screen.LoadFromDevice(ScreenDC); 
    ReleaseDC(0, ScreenDC); 
    Screen.SaveToFile("Screen.bmp"); 
end. 

我的问题停留在LoadFromDevice()SaveToFile()功能。可以使用哪些函数(如果有的话)用C编程语言来实现这些函数。试图尽可能远离第三方库。 (WinAPI的)

+3

WinAPI的** **是一个第三方库。无论如何,谷歌搜索“winapi截图”应该给你很多的参考。 [第一个](http://wiki.freepascal.org/LCL_Internals)来自freepascal维基。 –

+1

http://stackoverflow.com/questions/997175/how-can-i-take-a-screenshot-and-save-it-as-jpeg-on-windows –

+2

没什么。在C中没有“屏幕”这样的东西。您将需要一些特定于平台的功能。在你的情况下,winapi听起来很不错。 –

回答

1

看看这个

HDC hDC = GetDC(g_hWnd); 
LPRECT rect = (LPRECT)malloc(sizeof(RECT)); 
GetWindowRect(g_hWnd,rect); 
int h = rect->right - rect->left; 
int w = rect->bottom - rect->top; 
LPRECT rect = (LPRECT)malloc(sizeof(RECT)); 

GetWindowRect(g_hWnd,rect); 
HBITMAP hBmp = CreateCompatibleBitmap(hDC,w,h); 
PBITMAPINFO pbmi; 
pbmi = CreateBitmapInfoStruct(g_hWnd,hBmp); 

CreateBMPFile(g_hWnd, TEXT("c:\\TEMPO\\TestG2.bmp"), pbmi, hBmp, hDC) ; 
ReleaseDC(g_hWnd,hDC); 
DeleteObject(hBmp); 
DeleteObject(pbmi); 

if (rect != nullptr) 
    free(rect); 
+4

你为什么选择'RECT'?为什么不使用堆栈分配? – Dirk