复习win32-温故而知新

Win32 API窗口与位图操作详解
本文深入探讨了使用Win32 API创建窗口的五个步骤,包括设计、注册、创建、显示和消息循环,并提供了详细的代码示例。此外,还介绍了如何在窗口中插入位图,讨论了DC的概念,以及如何进行位图的复制和贴图操作。最后,文章提到了GDI+的使用,展示了如何利用GDI+进行图片的旋转和透明贴图,以及GDI+的初始化和关闭流程。

一、窗口的创建

分五步:

1、设计(对图标之类的各种东西进行初始化)

2、注册(调用函数RegisterClassEx())

3、创建(调用函数CreateWindow())

4、显示(调用函数ShowWindow())

5、消息循环(主要部分)

附窗口创建的代码:

#include<windows.h>

//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE: //点x 窗口关闭的消息
::PostQuitMessage(0); //发送推出的消息
break;
}
return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int CALLBACK WinMain(HINSTANCE hinstance,
HINSTANCE hPrelnstance,
LPSTR pCmdLine,
int nCmdShow)
{
HBRUSH hBrush = ::CreateSolidBrush(RGB(255,255,255));
//1、设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //是否要分配额外的空间
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = hBrush; //背景颜色
wndclass.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HELP)); //光标
wndclass.hIcon = NULL; //窗口图标
wndclass.hIconSm = NULL; //窗口左上小图标
wndclass.hInstance = hinstance; //当前实例的句柄
wndclass.lpfnWndProc = WndProc; //消息处理函数
wndclass.lpszClassName = “-_-“; //注册窗口类的名字
wndclass.lpszMenuName = NULL; //菜单名
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类的样式

//2、注册
if(::RegisterClassEx(&wndclass) == FALSE)
{
::MessageBox(NULL,”注册失败”,”提示”,MB_OK);
return 0;
}

//3、创建
HWND hWnd = ::CreateWindow(“-_-“,”哒哒哒”,WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hinstance,NULL);
if(hWnd == NULL)
{
::MessageBox(NULL,”创建失败”,”提示”,MB_OK);
}
//4、显示
::ShowWindow(hWnd,SW_SHOW);
//5、消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
//翻译
::TranslateMessage(&msg);
//分发
::DispatchMessageA(&msg);
}
//删除画刷
::DeleteObject(hBrush);
return 0;
}

二、插入位图

几个关于DC的概念

//HDC 相当于绘图板,DC里面一定要有一张图片
//窗口DC     GetDc(hwnd); ReleaseDC(); //窗口DC已经包含一张位图
//兼容性DC   CreateCompatibleDC(dc); DeleteDC() //创建的兼容性DC没有位图

//贴图片(拷贝位图) 一定需要两个DC,一个叫目标,一个叫源

贴图写到消息处理函数的重绘里面

附代码:

#include<windows.h>
#include “resource.h”

HINSTANCE hins;

//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT: //重绘
{
//目标DC
HDC dc = ::GetDC(hWnd);
//源DC
HDC hMemDC = ::CreateCompatibleDC(dc);
//加载位图
HBITMAP hBitmap1 = ::LoadBitmap(hins,MAKEINTRESOURCE(IDB_BITMAP1));
HBITMAP hBitmap2 = ::LoadBitmap(hins,MAKEINTRESOURCE(IDB_BITMAP2));
//选入位图
::SelectObject(hMemDC,hBitmap1);
::BitBlt(dc,0,0,48,48,hMemDC,0,0,SRCAND); //白色背景

::SelectObject(hMemDC,hBitmap2);
::BitBlt(dc,0,0,48,48,hMemDC,0,0,SRCPAINT); //黑色背景

::DeleteObject(hBitmap2);
::DeleteObject(hBitmap1);
::DeleteDC(hMemDC);
::ReleaseDC(hWnd,dc);
}
break;
case WM_CLOSE: //点x 窗口关闭的消息
::PostQuitMessage(0); //发送推出的消息
break;
}
return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int CALLBACK WinMain(HINSTANCE hinstance,
HINSTANCE hPrelnstance,
LPSTR pCmdLine,
int nCmdShow)
{
hins = hinstance;
HBRUSH hBrush = ::CreateSolidBrush(RGB(0,0,255));
//1、设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //是否要分配额外的空间
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = hBrush; //背景颜色
wndclass.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HELP)); //光标
wndclass.hIcon = NULL; //窗口图标
wndclass.hIconSm = NULL; //窗口左上小图标
wndclass.hInstance = hinstance; //当前实例的句柄
wndclass.lpfnWndProc = WndProc; //消息处理函数
wndclass.lpszClassName = “-_-“; //注册窗口类的名字
wndclass.lpszMenuName = NULL; //菜单名
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类的样式

//2、注册
if(::RegisterClassEx(&wndclass) == FALSE)
{
::MessageBox(NULL,”注册失败”,”提示”,MB_OK);
return 0;
}

//3、创建
HWND hWnd = ::CreateWindow(“-_-“,”哒哒哒”,WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hinstance,NULL);
if(hWnd == NULL)
{
::MessageBox(NULL,”创建失败”,”提示”,MB_OK);
}
//4、显示
::ShowWindow(hWnd,SW_SHOW);
//5、消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
//翻译
::TranslateMessage(&msg);
//分发
::DispatchMessageA(&msg);
}
//删除画刷
::DeleteObject(hBrush);
return 0;
}

三、gdi+

消除了贴bmp要黑白两种图型的麻烦,可以直接贴透明png图片,也可以贴bmp图片

代码如下

#include<windows.h>
#include<gdiplus.h> //Gdi+头文件
using namespace Gdiplus; //Gdi+命名空间
using namespace std;

#pragma comment(lib,”gdiplus.lib”)

HINSTANCE hins;

float nAngle = 10;

//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:

break;

case WM_TIMER: //定时器发送的消息
if (nAngle == 360)
nAngle = 0;
else
nAngle+=10;
//旋转图片
{
HDC dc = ::GetDC(hWnd);
//========================================================
//定义 图形对象
Graphics graphics(dc);
//加载图片
Image image(L”bitmap1.bmp”);
//获取图片的宽度和高度
int nWeight = image.GetWidth();
int nHeight = image.GetHeight();
//设置旋转的中心点
graphics.TranslateTransform(float(nWeight/2),float(nHeight/2)); //设置旋转的中心点
//旋转
graphics.RotateTransform(nAngle);
graphics.DrawImage(&image,-(nWeight/2),-(nHeight/2),nWeight,nHeight);
//========================================================
::ReleaseDC(hWnd,dc);
}
break;
case WM_CREATE: //窗口创建的时候发送 初始化的过程
::SetTimer(hWnd,1,100,NULL); //启动定时器
break;
case WM_CLOSE: //点x 窗口关闭的消息
::PostQuitMessage(0); //发送推出的消息
break;
}
return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int CALLBACK WinMain(HINSTANCE hinstance,
HINSTANCE hPrelnstance,
LPSTR pCmdLine,
int nCmdShow)
{
//—————————-开始gdi+—————————————————
ULONG_PTR ulToken;
GdiplusStartupInput gdiplusStartupInput;
::GdiplusStartup(&ulToken,&gdiplusStartupInput,NULL);
hins = hinstance;

HBRUSH hBrush = ::CreateSolidBrush(RGB(0,0,255));
//1、设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //是否要分配额外的空间
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = hBrush; //背景颜色
wndclass.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HELP)); //光标
wndclass.hIcon = NULL; //窗口图标
wndclass.hIconSm = NULL; //窗口左上小图标
wndclass.hInstance = hinstance; //当前实例的句柄
wndclass.lpfnWndProc = WndProc; //消息处理函数
wndclass.lpszClassName = “-_-“; //注册窗口类的名字
wndclass.lpszMenuName = NULL; //菜单名
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类的样式

//2、注册
if(::RegisterClassEx(&wndclass) == FALSE)
{
::MessageBox(NULL,”注册失败”,”提示”,MB_OK);
return 0;
}

//3、创建
HWND hWnd = ::CreateWindow(“-_-“,”哒哒哒”,WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hinstance,NULL);
if(hWnd == NULL)
{
::MessageBox(NULL,”创建失败”,”提示”,MB_OK);
}
//4、显示
::ShowWindow(hWnd,SW_SHOW);
//5、消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
//翻译
::TranslateMessage(&msg);
//分发
::DispatchMessageA(&msg);
}

//删除画刷
::DeleteObject(hBrush);

//——————————关闭gdi+———————————————–
::GdiplusShutdown(ulToken);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值