二楼贴上源代码
程序代码:
#include <windows.h>
#include <math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR LpcmdLine,int nCmdShow){
static TCHAR szAppName[]=TEXT("Painter");
static TCHAR szClassName[]=TEXT("PainterClass");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW | CS_VREDRAW;//风格
wndclass.lpfnWndProc=WndProc;//*重要*long point to function 指向函数的的长指针 基于该窗口类创建的窗口所使用的窗口函数的入口地址
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=szClassName;//窗口类类名
if (!RegisterClass(&wndclass))//注册窗口类 需要一个指向windclass的指针
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szClassName,//窗口类名称
TEXT("Painter"),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口显示风格
CW_USEDEFAULT,//初始x方向位置
CW_USEDEFAULT,//初始y方向位置
CW_USEDEFAULT,//初始x方向大小
CW_USEDEFAULT,//初始y方向大小
NULL,//父窗口句柄
NULL,//菜单句柄
hInstance,//程序实例句柄
NULL);//创建参数 可以访问以后想要引用的程序中的数据
nCmdShow=SW_SHOWMAXIMIZED;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static int cxClient,cyClient,cxBitmap,cyBitmap;
static HINSTANCE hInstance;
static BITMAP bmp;
static HANDLE h;//bmp图片句柄
static HDC hdc,hdcMemImag;//hdcMemImag是与窗口DC兼容的DC
h=LoadImage(NULL,L"C:\\3333.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(h,sizeof(BITMAP),&bmp);//得到图片的宽,高等信息,储存在bmp对象*/
switch(message)
{
case WM_CREATE:
COLORREF colleft,colright;//colleft 左边图片的像素点 colright 右边图片的像素点
int leftR,rightR,leftG,rightG,leftB,rightB,absR,absG,absB;
hdc=GetDC(hwnd);//得到窗口的DC(hWnd是窗口句柄)
hdcMemImag=CreateCompatibleDC(hdc);//得到与窗口DC兼容的DC
SelectObject(hdcMemImag,h);//把得到的DC与图片句柄关联起来
for (int y=192;y<=639;y++) //坐标是之前已经找好的
{
for (int x=8;x<=505;x++)
{
colleft=GetPixel(hdcMemImag,x,y);//获得左边图片的像素点
colright=GetPixel(hdcMemImag,x+508,y);//获得右边图片的像素点
leftR=GetRValue(colleft);
leftG=GetGValue(colleft);
leftB=GetBValue(colleft);
rightR=GetRValue(colright);
rightG=GetGValue(colright);
rightB=GetBValue(colright);
absR=leftR-rightR;
absG=leftG-rightG;
absB=leftB-rightB;
if (sqrt((DOUBLE)(absR*absR+absG*absG+absB*absB))>45)
{
SetPixel(hdcMemImag,x+508,y,RGB(0,255,0));
}
}
}
ReleaseDC(hwnd,hdc);//释放GetDC得到的DC
break;
case WM_SIZE:
InvalidateRect(hwnd,NULL,TRUE);
break;
case WM_PAINT:
hdc=GetDC(hwnd);//得到窗口的DC(hWnd是窗口句柄)
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdcMemImag,0,0,SRCCOPY);//把图片画在窗体上
ReleaseDC(hwnd,hdc);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}