/*---------------------------------------
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) ;
}
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) ;
}
本文介绍了如何使用 Windows API 进行位图加载、创建及显示的相关技术,包括使用 LoadBitmap 加载位图资源,CreateBitmap 创建自定义位图,以及 CreatePatternBrush 建立位图刷子来刷新窗体背景。

被折叠的 条评论
为什么被折叠?



