/*---------------------------------------
BITBLT.C – 利用BITBLT 函数抓取标题栏
图标区域到窗口显示区域
STRETCH.C – 利用 StretchBlt 函数抓取窗口
标题图标区域到窗口显示区域,
并拉伸显示
---------------------------------------*/
#include <windows.h>
LRESULT
CALLBACK
WndProc (
HWND
,
UINT
,
WPARAM
,
LPARAM) ;
int
WINAPI
WinMain (
HINSTANCE
hInstance
,
HINSTANCE
hPrevInstance
,
PSTR
szCmdLine
,
int
iCmdShow)
{
static
TCHAR
szAppName
[]
=
TEXT (
" BitBlt ") ;
HWND
hwnd ;
MSG
msg ;
WNDCLASS
wndclass ;
wndclass
.
style
=
CS_HREDRAW |
CS_VREDRAW ;
wndclass
.
lpfnWndProc
=
WndProc ;
wndclass
.
cbClsExtra
=
0 ;
wndclass
.
cbWndExtra
=
0 ;
wndclass
.
hInstance
=
hInstance ;
wndclass
.
hIcon
=
LoadIcon (
NULL
,
IDI_INFORMATION ) ;
wndclass
.
hCursor
=
LoadCursor (
NULL
,
IDC_ARROW ) ;
wndclass
.
hbrBackground
= (
HBRUSH)
GetStockObject (
WHITE_BRUSH ) ;
wndclass
.
lpszMenuName
=
NULL ;
wndclass
.
lpszClassName
=
szAppName ;
if (
!
RegisterClass (
&
wndclass))
{
MessageBox (
NULL
,
TEXT (
" This program requires Windows NT! "
),
szAppName
,
MB_ICONERROR ) ;
return
0 ;
}
hwnd
=
CreateWindow (
szAppName
,
TEXT (
" BitBlt Demo "
),
WS_OVERLAPPEDWINDOW
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
NULL
,
NULL
,
hInstance
,
NULL ) ;
ShowWindow (
hwnd
,
iCmdShow) ;
UpdateWindow (
hwnd) ;
while (
GetMessage (
&
msg
,
NULL
,
0
,
0))
{
TranslateMessage (
&
msg) ;
DispatchMessage (
&
msg) ;
}
return
msg
.
wParam ;
}
LRESULT
CALLBACK
WndProc (
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam)
{
static
int
cxClient
,
cyClient
,
cxSource
,
cySource ;
HDC
hdcClient
,
hdcWindow ;
int
x
,
y ;
PAINTSTRUCT ps ;
switch (
message)
{
case
WM_CREATE
:
// 窗口的边框的宽度 + 标题栏按钮的宽度 = 标题栏图标及按钮的宽度
cxSource
=
GetSystemMetrics (
SM_CXSIZEFRAME )
+
GetSystemMetrics (
SM_CXSIZE ) ;
// 窗口的边框的高度 + 窗口标题的高度 = 窗口标题栏的高度
cySource
=
GetSystemMetrics (
SM_CYSIZEFRAME )
+
GetSystemMetrics (
SM_CYCAPTION ) ;
return
0 ;
case
WM_SIZE
:
cxClient
=
LOWORD (
lParam) ;
cyClient
=
HIWORD (
lParam) ;
return
0 ;
case
WM_PAINT
:
hdcClient
=
BeginPaint (
hwnd
,
&ps) ;
// 取得窗口重绘区域句柄
hdcWindow
=
GetWindowDC (
hwnd) ;
// 取得整个窗口的句柄
for (
y
=
0 ;
y
<
cyClient ;
y
+=
cySource)
for (
x
=
0 ;
x
<
cxClient ;
x
+=
cxSource)
//将整个窗口的句柄作为来源,传送到窗口重绘区域。通过循环而达到平铺位图到重绘区域的目的
BitBlt (
hdcClient
,
x
,
y
,
cxSource
,
cySource
,
hdcWindow
,
0
,
0
,
SRCCOPY ) ;
/* StretchBlt 方法:
以窗体标题栏图标区域为来源,拉伸显示到窗口重绘区域 */
StretchBlt (
hdcClient
,
0
,
0
,
cxClient
,
cyClient
,
hdcWindow
,
0
,
0
,
cxSource
,
cySource
,
MERGECOPY ) ;
ReleaseDC (
hwnd
,
hdcWindow) ;
EndPaint (
hwnd
,
&ps) ;
return
0 ;
case
WM_DESTROY
:
PostQuitMessage (
0) ;
return
0 ;
}
return
DefWindowProc (
hwnd
,
message
,
wParam
,
lParam) ;
}
/*----------------------------------------
BRICKS1.C – LoadBitmap 位图资源的载入使用
----------------------------------------*/
#include <windows.h>
LRESULT
CALLBACK
WndProc (
HWND
,
UINT
,
WPARAM
,
LPARAM) ;
int
WINAPI
WinMain (
HINSTANCE
hInstance
,
HINSTANCE
hPrevInstance
,
PSTR
szCmdLine
,
int
iCmdShow)
{
static
TCHAR
szAppName
[]
=
TEXT (
" Bricks1 ") ;
HWND
hwnd ;
MSG
msg ;
WNDCLASS
wndclass ;
wndclass
.
style
=
CS_HREDRAW |
CS_VREDRAW ;
wndclass
.
lpfnWndProc
=
WndProc ;
wndclass
.
cbClsExtra
=
0 ;
wndclass
.
cbWndExtra
=
0 ;
wndclass
.
hInstance
=
hInstance ;
wndclass
.
hIcon
=
LoadIcon (
NULL
,
IDI_APPLICATION ) ;
wndclass
.
hCursor
=
LoadCursor (
NULL
,
IDC_ARROW ) ;
wndclass
.
hbrBackground
= (
HBRUSH)
GetStockObject (
WHITE_BRUSH ) ;
wndclass
.
lpszMenuName
=
NULL ;
wndclass
.
lpszClassName
=
szAppName ;
if (
!
RegisterClass (
&
wndclass))
{
MessageBox (
NULL
,
TEXT (
" This program requires Windows NT! "
),
szAppName
,
MB_ICONERROR ) ;
return
0 ;
}
hwnd
=
CreateWindow (
szAppName
,
TEXT (
" LoadBitmap Demo "
),
WS_OVERLAPPEDWINDOW
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
NULL
,
NULL
,
hInstance
,
NULL ) ;
ShowWindow (
hwnd
,
iCmdShow) ;
UpdateWindow (
hwnd) ;
while (
GetMessage (
&
msg
,
NULL
,
0
,
0))
{
TranslateMessage (
&
msg) ;
DispatchMessage (
&
msg) ;
}
return
msg
.
wParam ;
}
LRESULT
CALLBACK
WndProc (
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam)
{
static
HBITMAP
hBitmap ;
static
int
cxClient
,
cyClient
,
cxSource
,
cySource ;
BITMAP
bitmap ;
HDC
hdc
,
hdcMem ;
HINSTANCE
hInstance ;
int
x
,
y ;
PAINTSTRUCT ps ;
switch (
message)
{
case
WM_CREATE
:
// 强制转换消息中 lParam 参数为指向 CREATESTRUCT 结构的指针 "LPCREATESTRUCT", 并调取 hInstance 元素
hInstance
= ((
LPCREATESTRUCT)
lParam)
->
hInstance ;
hBitmap
=
LoadBitmap (
hInstance
,
TEXT (
" Bricks ")) ;
// 载入位图资源进内存 , 取得句柄
GetObject (
hBitmap
,
sizeof (
BITMAP
),
&
bitmap) ;
// 取位图资源信息
cxSource
=
bitmap
.
bmWidth ;
cySource
=
bitmap
.
bmHeight ;
// 取位图资源的宽高
return
0 ;
case
WM_SIZE
:
cxClient
=
LOWORD (
lParam) ;
cyClient
=
HIWORD (
lParam) ;
return
0 ;
case
WM_PAINT
:
hdc
=
BeginPaint (
hwnd
,
&ps) ;
// 建立与视讯显示器兼容的内存设备内容 , 取得句柄
hdcMem
=
CreateCompatibleDC (
hdc) ;
SelectObject (
hdcMem
,
hBitmap) ;
// 将资源位图选择进内存设备内容
for (
y
=
0 ;
y
<
cyClient ;
y
+=
cySource)
for (
x
=
0 ;
x
<
cxClient ;
x
+=
cxSource)
{
// 将内存设备内容中的位图 , 平铺到显示区域
BitBlt (
hdc
,
x
,
y
,
cxSource
,
cySource
,
hdcMem
,
0
,
0
,
SRCCOPY ) ;
}
DeleteDC (
hdcMem) ;
// 释放内存设备内容
EndPaint (
hwnd
,
&ps) ;
return
0 ;
case
WM_DESTROY
:
DeleteObject (
hBitmap) ;
//释放载入的位图资源
PostQuitMessage (
0) ;
return
0 ;
}
return
DefWindowProc (
hwnd
,
message
,
wParam
,
lParam) ;
}
/*-----------------------------------------
BRICKS2.C – 利用CreateBitmap 函数建立单色
8*8 位图,并平铺到显示区域
-----------------------------------------*/
#include <windows.h>
LRESULT
CALLBACK
WndProc (
HWND
,
UINT
,
WPARAM
,
LPARAM) ;
int
WINAPI
WinMain (
HINSTANCE
hInstance
,
HINSTANCE
hPrevInstance
,
PSTR
szCmdLine
,
int
iCmdShow)
{
static
TCHAR
szAppName
[]
=
TEXT (
" Bricks2 ") ;
HWND
hwnd ;
MSG
msg ;
WNDCLASS
wndclass ;
wndclass
.
style
=
CS_HREDRAW |
CS_VREDRAW ;
wndclass
.
lpfnWndProc
=
WndProc ;
wndclass
.
cbClsExtra
=
0 ;
wndclass
.
cbWndExtra
=
0 ;
wndclass
.
hInstance
=
hInstance ;
wndclass
.
hIcon
=
LoadIcon (
NULL
,
IDI_APPLICATION ) ;
wndclass
.
hCursor
=
LoadCursor (
NULL
,
IDC_ARROW ) ;
wndclass
.
hbrBackground
= (
HBRUSH)
GetStockObject (
WHITE_BRUSH ) ;
wndclass
.
lpszMenuName
=
NULL ;
wndclass
.
lpszClassName
=
szAppName ;
if (
!
RegisterClass (
&
wndclass))
{
MessageBox (
NULL
,
TEXT (
" This program requires Windows NT! "
),
szAppName
,
MB_ICONERROR ) ;
return
0 ;
}
hwnd
=
CreateWindow (
szAppName
,
TEXT (
" CreateBitmap Demo "
),
WS_OVERLAPPEDWINDOW
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
NULL
,
NULL
,
hInstance
,
NULL ) ;
ShowWindow (
hwnd
,
iCmdShow) ;
UpdateWindow (
hwnd) ;
while (
GetMessage (
&
msg
,
NULL
,
0
,
0))
{
TranslateMessage (
&
msg) ;
DispatchMessage (
&
msg) ;
}
return
msg
.
wParam ;
}
LRESULT
CALLBACK
WndProc (
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam)
{
//初始化位图结构信息,大小8*8,每行占2字节,1颜色位面,每像素占1位
static
BITMAP
bitmap
=
{
0
,
8
,
8
,
2
,
1
,
1
} ;
//初始化位图数据,0为黑色,1为白色
static
BYTE
bits
[
8
][
2
]
=
{
0xFF
,
0
,
0x0C
,
0
,
0x0C
,
0
,
0x0C
,
0
,
0xFF
,
0
,
0xC0
,
0
,
0xC0
,
0
,
0xC0
,
0
} ;
static
HBITMAP
hBitmap ;
static
int
cxClient
,
cyClient
,
cxSource
,
cySource ;
HDC
hdc
,
hdcMem ;
int
x
,
y ;
PAINTSTRUCT ps ;
switch (
message)
{
case
WM_CREATE
:
bitmap
.
bmBits
=
bits ;
// 设定建立位图时所用数据数组指针
hBitmap
=
CreateBitmapIndirect (
&
bitmap) ;
// 用bitmap 结构中的信息建立位图
cxSource
=
bitmap
.
bmWidth ;
cySource
=
bitmap
.
bmHeight ;
// 取位图的宽和高
return
0 ;
case
WM_SIZE
:
cxClient
=
LOWORD (
lParam) ;
cyClient
=
HIWORD (
lParam) ;
return
0 ;
case
WM_PAINT
:
hdc
=
BeginPaint (
hwnd
,
&ps) ;
hdcMem
=
CreateCompatibleDC (
hdc) ;
// 建立与视讯显示器兼容的内存设备内容
SelectObject (
hdcMem
,
hBitmap) ;
// 将位图选进内存设备内容
for (
y
=
0 ;
y
<
cyClient ;
y
+=
cySource)
for (
x
=
0 ;
x
<
cxClient ;
x
+=
cxSource)
{
// 以内存设备内容为来源,平铺显示位图到显示区域
BitBlt (
hdc
,
x
,
y
,
cxSource
,
cySource
,
hdcMem
,
0
,
0
,
SRCCOPY ) ;
}
DeleteDC (
hdcMem) ;
// 删除内存设备内容
EndPaint (
hwnd
,
&ps) ;
return
0 ;
case
WM_DESTROY
:
DeleteObject (
hBitmap) ;
// 删除建立的位图
PostQuitMessage (
0) ;
return
0 ;
}
return
DefWindowProc (
hwnd
,
message
,
wParam
,
lParam) ;
}
/*-----------------------------------------------
BRICKS3.C – 利用CreatePatternBrush 函数,建立
位图刷子,刷新窗体背景
-----------------------------------------------*/
#include <windows.h>
LRESULT
CALLBACK
WndProc (
HWND
,
UINT
,
WPARAM
,
LPARAM) ;
int
WINAPI
WinMain (
HINSTANCE
hInstance
,
HINSTANCE
hPrevInstance
,
PSTR
szCmdLine
,
int
iCmdShow)
{
static
TCHAR
szAppName
[]
=
TEXT (
" Bricks3 ") ;
HBITMAP
hBitmap ;
HBRUSH
hBrush ;
HWND
hwnd ;
MSG
msg ;
WNDCLASS
wndclass ;
hBitmap
=
LoadBitmap (
hInstance
,
TEXT (
" Bricks ")) ;
// 载入位图资源进内存
hBrush
=
CreatePatternBrush (
hBitmap) ;
// 以内存中位图来建立刷子 , 用于刷新窗体背景
DeleteObject (
hBitmap) ;
// 释放位图资源
wndclass
.
style
=
CS_HREDRAW |
CS_VREDRAW ;
wndclass
.
lpfnWndProc
=
WndProc ;
wndclass
.
cbClsExtra
=
0 ;
wndclass
.
cbWndExtra
=
0 ;
wndclass
.
hInstance
=
hInstance ;
wndclass
.
hIcon
=
LoadIcon (
NULL
,
IDI_APPLICATION ) ;
wndclass
.
hCursor
=
LoadCursor (
NULL
,
IDC_ARROW ) ;
wndclass
.
hbrBackground
=
hBrush ;
//位图刷子句柄
wndclass
.
lpszMenuName
=
NULL ;
wndclass
.
lpszClassName
=
szAppName ;
if (
!
RegisterClass (
&
wndclass))
{
MessageBox (
NULL
,
TEXT (
" This program requires Windows NT! "
),
szAppName
,
MB_ICONERROR ) ;
return
0 ;
}
hwnd
=
CreateWindow (
szAppName
,
TEXT (
" CreatePatternBrush Demo "
),
WS_OVERLAPPEDWINDOW
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
NULL
,
NULL
,
hInstance
,
NULL ) ;
ShowWindow (
hwnd
,
iCmdShow) ;
UpdateWindow (
hwnd) ;
while (
GetMessage (
&
msg
,
NULL
,
0
,
0))
{
TranslateMessage (
&
msg) ;
DispatchMessage (
&
msg) ;
}
DeleteObject (
hBrush) ;
// 删除位图刷子
return
msg
.
wParam ;
}
LRESULT
CALLBACK
WndProc (
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam)
{
switch (
message)
{
case
WM_DESTROY
:
PostQuitMessage (
0) ;
return
0 ;
}
return
DefWindowProc (
hwnd
,
message
,
wParam
,
lParam) ;
}