- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章VC++基于Dx实现的截图程序示例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文所述的程序示例为VC++图象特效的截图示例,需要DirectX 3.0以上版,代码中的GetScreen函数是本截图程序的关键。运行这个程序可用Esc键结束。代码中需要ddutil.h与ddutil.cpp文件,请自行下载添加。关于InitDDraw()函数,功能是初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区),以及创建一个定时器.
具体的功能代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
|
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ddraw.h>
#include <math.h>
#include "ddutil.h"
#define TITLE "截图示例" //窗口标题
#define CLASSNAME "GetScreen" //窗口类名
#define COLORS 16
HINSTANCE
hInst;
//应用程序实例句柄
HWND
hWndMain;
//主窗口句柄
LPDIRECTDRAW lpDD;
// DirectDraw对象
LPDIRECTDRAWSURFACE lpDDSPrimary;
// 主页面
LPDIRECTDRAWSURFACE lpDDSBack;
// 后台缓冲区
LPDIRECTDRAWSURFACE lpDDSPic1;
// 离屏页面1
LPDIRECTDRAWPALETTE lpDDPal;
// 调色板
BOOL
bActive;
// 应用程序是否活跃?
HBITMAP
hbm;
RECT rect;
//函数声明
void
FreeObjects(
void
);
BOOL
InitDDraw(
void
);
BOOL
InitSurfaces(
void
);
void
UpdateFrame(
void
);
void
MakeRect(RECT *rect,
long
left,
long
top,
long
right,
long
bottom);
///////////////////////////////////////////////
// 截图函数,是本程序的关键
// 函数名:GetScreen
// 参数:指向屏幕矩形的指针
// 返值:Bitmap设备
//////////////////////////////////////////////
HANDLE
GetScreen(LPRECT lpRect)
{
//定义屏幕的DC和内存DC
HDC
hScrDC,hMemDC;
//定义Bitmap设备
HANDLE
hBitmap,hOldBitmap;
//定义屏幕坐标变量
unsigned
int
nX,nY,nX2,nY2;
unsigned
int
nWidth,nHeight;
//定义屏幕分辩率变量
unsigned
int
xScrn,yScrn;
//确保屏幕矩形不为空
if
(IsRectEmpty(lpRect))
return
NULL;
//创建屏幕的DC
hScrDC=CreateDC(
"DISPLAY"
,NULL,NULL,NULL);
//创建的内存DC
hMemDC=CreateCompatibleDC(hScrDC);
//将屏幕矩形坐标付给坐标变量
nX=lpRect->left;
nY=lpRect->top ;
nX2=lpRect->right ;
nY2=lpRect->bottom ;
//获得屏幕分辩率
xScrn=GetDeviceCaps(hScrDC,HORZRES);
yScrn=GetDeviceCaps(hScrDC,VERTRES);
if
(nX<0)
nX=0;
if
(nY<0)
nY=0;
if
(nX2>xScrn)
nX2=xScrn;
if
(nY2>yScrn)
nY2=yScrn;
//获得屏幕宽度与长度
nWidth=nX2-nX;
nHeight=nY2-nY;
//获得屏幕图像并付给一个Bitmap设备
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
hOldBitmap=(
HBITMAP
)SelectObject(hMemDC,hBitmap);
BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);
hBitmap=(
HBITMAP
)SelectObject(hMemDC,hOldBitmap);
//清除设备
DeleteDC(hScrDC);
DeleteDC(hMemDC);
return
hBitmap;
}
//*******************************************************************
//函数:FreeObject
//功能:释放所有DirectDraw对象
//*******************************************************************
void
FreeObjects(
void
)
{
//释放hbm位图对象
DeleteObject(hbm);
if
( lpDD != NULL )
//释放DirectDraw对象
{
if
( lpDDSPrimary != NULL )
//释放主页面
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if
( lpDDSPic1 != NULL )
//释放离屏页面1
{
lpDDSPic1->Release();
lpDDSPic1 = NULL;
}
if
( lpDDPal != NULL )
//释放调色板
{
lpDDPal->Release();
lpDDPal = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
//*******************************************************************
//函数:RestoreAll
//功能:页面丢失后,恢复页面内存
//*******************************************************************
HRESULT
RestoreAll(
void
)
{
HRESULT
ddrval;
//恢复主页面,这也将恢复换页链中的所有页面
ddrval = lpDDSPrimary->Restore();
//恢复离屏页面
ddrval = lpDDSPic1->Restore();
//重新绘制页面图象
InitSurfaces();
return
ddrval;
}
//*******************************************************************
//函数:WindowProc
//功能:主窗口的消息处理过程
//*******************************************************************
LRESULT
CALLBACK WinProc(
HWND
hWnd,
UINT
message,
WPARAM
wParam,
LPARAM
lParam )
{
switch
( message )
{
case
WM_SETCURSOR:
SetCursor(LoadCursor( NULL, IDC_ARROW ));
return
TRUE;
case
WM_ACTIVATEAPP:
//应用程序激活消息
bActive = wParam;
break
;
case
WM_KEYDOWN:
//击键消息
switch
( wParam )
{
case
VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break
;
}
break
;
case
WM_DESTROY:
//销毁窗口消息
FreeObjects();
PostQuitMessage(0);
break
;
}
//调用缺省的过程处理过程
return
DefWindowProc(hWnd, message, wParam, lParam);
}
//******************************************************************
//函数:InitWindow()
//功能:创建主窗口。
//******************************************************************
BOOL
InitWindow(
HINSTANCE
hInstance,
int
nCmdShow )
{
WNDCLASS wc;
//窗口类结构
//填充窗口类结构
wc.style = 0;
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (
HBRUSH
)GetStockObject(BLACK_BRUSH);
//选择黑色刷做为窗口背景
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASSNAME;
//注册窗口类
RegisterClass( &wc );
//创建主窗口
hWndMain= CreateWindowEx(
0,
CLASSNAME,
//窗口的类名称,必须与上面的wc.lpszClassName一致
TITLE,
//窗口的标题名
WS_POPUP,
0,
0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL,
NULL,
hInstance,
NULL );
if
( !hWndMain )
return
FALSE;
//显示并更新窗口
ShowWindow( hWndMain, nCmdShow );
return
TRUE;
}
//******************************************************************
//函数:InitDDraw()
//功能:初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区)
// 以及创建一个定时器。
//******************************************************************
BOOL
InitDDraw(
void
)
{
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
HRESULT
ddrval;
//创建DirectDraw对象
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if
( ddrval != DD_OK )
return
FALSE;
//取得全屏独占模式
ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if
( ddrval != DD_OK )
return
FALSE;
//设置显示器显示模式为当前屏幕的分辩率,16位增强显示模式
ddrval = lpDD->SetDisplayMode(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), COLORS);
if
( ddrval != DD_OK )
return
FALSE;
//填充换页链结构
ddsd.dwSize =
sizeof
( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
//后台缓冲区数量为2
ddsd.dwBackBufferCount = 2;
//创建换页链,包括了主页面及其后台缓冲区
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if
( ddrval != DD_OK )
return
FALSE;
//获得指向后台缓冲区的页面指针
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
if
( ddrval != DD_OK )
return
FALSE;
//创建离屏页面
ZeroMemory(&ddsd,
sizeof
(ddsd));
ddsd.dwSize =
sizeof
(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth =GetSystemMetrics(SM_CXSCREEN);
ddsd.dwHeight = GetSystemMetrics(SM_CYSCREEN);
if
(lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK)
return
FALSE;
//调用页面初始化函数
if
( !InitSurfaces() )
return
FALSE;
return
TRUE;
}
//******************************************************************
//函数:WinMain()
//功能:应用程序入口
//******************************************************************
int
PASCAL WinMain(
HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
MSG msg;
hInst=hInstance;
//获得屏幕分辩率
rect.left=rect.top=0;
rect.right=GetSystemMetrics(SM_CXSCREEN);
rect.bottom=GetSystemMetrics(SM_CYSCREEN);
//调用截屏函数
hbm=(
HBITMAP
)GetScreen(&rect);
//初始化主窗口
if
(!InitWindow( hInstance, nCmdShow))
return
FALSE;
//初始化DirectDraw环境
if
(!InitDDraw())
{
MessageBox(hWndMain,
"初始化DirectDraw过程中出错!"
,
"Error"
, MB_OK);
FreeObjects();
DestroyWindow(hWndMain);
return
FALSE;
}
//进入消息循环
while
(1)
{
if
(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if
(!GetMessage(&msg, NULL, 0, 0 ))
return
msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
if
(bActive)
{
UpdateFrame();
}
else
WaitMessage();
}
return
msg.wParam;
}
//******************************************************************
//函数:InitSurfaces()
//功能:初始化页面图象
//******************************************************************
BOOL
InitSurfaces(
void
)
{
if
(hbm == NULL)
return
FALSE;
DDCopyBitmap(lpDDSPic1, hbm, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
return
TRUE;
}
//更新屏幕
void
UpdateFrame(
void
)
{
HRESULT
ddrval;
//清屏后台缓冲区
DDBLTFX ddBltFx;
ddBltFx.dwSize =
sizeof
(DDBLTFX);
ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
//调用灰度的实现函数
RECT srect, drect;
MakeRect(&srect, 0, 0, rect.right ,rect.bottom);
MakeRect(&drect, 0, 0, rect.right , rect.bottom);
//将背景图象Blit到后台缓冲区
lpDDSBack->Blt(&drect, lpDDSPic1, &srect, DDBLT_WAIT, NULL);
// 换页
while
( 1 )
{
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );
//调用换页函数
if
( ddrval == DD_OK )
//成功则退出while循环
break
;
else
if
( ddrval == DDERR_SURFACELOST )
//如果页面丢失,则恢复页面,再继续while循环
RestoreAll();
else
break
;
}
}
void
MakeRect(RECT *rect,
long
left,
long
top,
long
right,
long
bottom)
{
rect->left=left;
rect->top=top;
rect->right=right;
rect->bottom=bottom;
}
|
。
最后此篇关于VC++基于Dx实现的截图程序示例代码的文章就讲到这里了,如果你想了解更多关于VC++基于Dx实现的截图程序示例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当应用程序启动时,您将从 ViewController(中间的那个)开始。从那里我在右边添加了 VC。当用户点击此 VC 上的按钮时,我希望该 View 消失(我目前只需将其框架更改为 900 即可实
我在 Xcode 7 中使用简单的主/详细信息分割 View 模板,并希望用户从具有主要类别的高级 Master VC 开始,然后选择一个并深入到各个项目 - 仍然在左侧- 然后当他们从第二个主 VC
我有一个名为“firstVC”的 View Controller 和另一个名为“secondVC”的 View Controller 。第二个 VC 将以模态方式呈现在第一个 VC 上,当用户按下第二
我被困在一个问题上,我有一个案例 我有一个父 VC 它有2个容器[childVC A, childVC B] API 正在调用 childVC (UIViewController) A 一旦 chil
我从呈现的 VC 导航到 VC(让我们调用 VC A)。在 VC A 中,我有一个容器 View ,它有一个 VC(让我们调用 VC B)。从 VC B 我提出了另一个 VC(我们称之为 VC C)。
我有一个主 VC(称为 VC A),它有一个子 VC(VC B)。当我点击 VC B 上的按钮时,我将其作为子 VC 关闭,但是一旦完成,我想实例化另一个 VC(VC C)。我通过在 VC B 上创建
我们正在寻求改变用户退出我们应用程序的方式。为了做到这一点,我们要关闭当前 VC 下面的所有 VC,并将另一个 VC 作为根 VC。现在我们正在这样做,我相信这不会从内存中消除下面的任何 VC。 le
我仅使用 segue 在我的应用程序中导航。 我只是想知道,如果我从 1st-VC 导航到 V2,再到 V3,然后再到 4th-VC,如何直接从 4th-VC 导航回 1st VC,而不返回到 V3、
最新的 Xcode/Swift/iOS。 我有一个主 VC(称为 StartVC),其中包含一个子 VC(称为 TopBarVC)via 和嵌入式 segue。子 VC 包含一个按钮,按下该按钮时,会
我试图将从 map 中获得的地址传递到我的其他 View Controller 中并保持相同的设置(即开关仍然打开) mapVC 名为 MapViewController,tableVC 名为 Add
我有一个嵌入在 navigationcontroller 中的 viewcontroller,它将另一个 viewcontroller 推送到堆栈上。这个推送的 View Controller 有一个
昨天更新后,我在 iPad 上遇到了这个问题:如果我加载第二个 View Controller ,它看起来比第一个 View Controller 小(见下图)。有趣的是,自从我在 iPad 上更新了
我的项目有这样的设计: VC1 ---firstSegue----> VC2 ---secondSegue---> VC3 通过使用协议(protocol)/委托(delegate)方法,我可以毫无问
图像不是从一个 VC 到另一个 VC。 问题是将它显示到主 UIViewController 中的 ImageView 。我已将所有内容正确连接到 Storyboard中。 点击here查看我的 St
如何在vc++中调用vc++dll。 在.h文件中 typedef int (*LPVAR)(char * ptr_f, char *CC); HINSTANCE hDLL; 在.cpp 文件中 hD
当我从 VC1 转到 VC2 时,如果 VC2 被解雇,我可以通过在 VC2 中设置协议(protocol)并让 VC1 符合它,轻松地将数据传回 VC1。我想做类似的事情,但有以下区别 当我从 VC
我有一个 VC(A),它有一个容器 View 并根据 segementControl 值更改它的 VC(B-C),我在 A ViewController 中发送请求并获得响应,我想确保 B 和C Vi
所以我在我的应用程序中实现了通用链接,当按下按钮时,我打开了我的第二个应用程序: UIApplication.shared.open(aUrl!) 我也接到了电话: func application(
我想在 ios 中模拟联系人列表。当点击 + 按钮添加联系人时,会出现一个新的 View Controller ,为您提供文本字段以输入联系人姓名和用于保存该联系人的其他信息。一旦你点击完成按钮,下一
我有两个 ViewControllers - Slider 和 Foo。我将 Slider 添加为 Foo subview 并将其框架设置在 Foo VC 中,但是 Slider 的框架没有改变 ->
我是一名优秀的程序员,十分优秀!