更新时间:2015-12-16 21:56:40浏览次数:1+次
for (int i=0;i<bm.bmWidth;i++)
{
for (int j=0;j<bm.bmHeight;j++)
{
COLORREF clr = GetPixel(hMem,i,j);
int red = GetRValue(clr);
int green = GetGValue(clr);
int blue = GetBValue(clr);
SetPixel(hMem,i,j,RGB(255-red,255-green,255-blue));
}
}
这个代码和在单击鼠标时的没有两样,就是客户区的DC换成了内存DC而已。然后在执行代码看看效果。效果图如下:BitBlt(hdc,0,0,pt.x,pt.y,hMem,0,0,NOTSRCCOPY);
然后执行后你会发现,反色的图片没有一点闪烁,瞬间完成的,眼睛都无法察觉。我们将这个反色做到这个地方,效率已经是无可挑剔的了。如此也发现,视频适配器(显卡)级别的处理属于底层硬件的处理级别,自然是最快的了。并且贴图函数就提供了这个选项哦。#include "windows.h"
#include "resource.h"
#include <tchar.h>
// - 项目是Unicode字符集
HINSTANCE g_hInstance=NULL;
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc,hMem;
PAINTSTRUCT ps;
TCHAR Info[100]=_T("美女哦 - 【C++技术网http://www.cjjjs.com】");
HBITMAP hBitmap;
static POINT pt;
BITMAP bm;//-位图信息结构体
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
hBitmap = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
GetObject(hBitmap, sizeof(bm), &bm);
hMem = CreateCompatibleDC(hdc);
SelectObject(hMem,hBitmap);
TextOut(hMem,0,100,Info,lstrlen(Info));
// - 在内存中对位图反色处理,效率还是不够高
//for (int i=0;i<bm.bmWidth;i++)
//{
// for (int j=0;j<bm.bmHeight;j++)
// {
// COLORREF clr = GetPixel(hMem,i,j);
// int red = GetRValue(clr);
// int green = GetGValue(clr);
// int blue = GetBValue(clr);
// SetPixel(hMem,i,j,RGB(255-red,255-green,255-blue));
// }
//}
BitBlt(hdc,0,0,pt.x,pt.y,hMem,0,0,NOTSRCCOPY);
EndPaint(hwnd,&ps);
return 0;
case WM_LBUTTONDOWN:
hdc = GetDC(hwnd);
ReleaseDC(hwnd,hdc);
return 0;
case WM_SIZE:
pt.x = LOWORD(lParam);//存储客户区宽度
pt.y = HIWORD(lParam);//存储客户区高度
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndClass))
{
return 0;
}
g_hInstance = hInstance;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,440,440,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
相关资讯