
DLL命令 取坐标颜色, 整数型, "gdi32dll", "GetPixel"
参数 设备场景, 整数型
参数 x坐标, 整数型
参数 y坐标, 整数型
DLL命令 取设备场景, 整数型, "user32dll", "GetDC", , 获取指定窗口的设备场景,出错则为0
参数 窗口的句柄, 整数型, , 将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC
版本 2
子程序 _时钟1_周期事件
局部变量 颜色值, 整数型
局部变量 红, 整数型
局部变量 绿, 整数型
局部变量 蓝, 整数型
颜色值 = 取坐标颜色 (取设备场景 (0), 取鼠标水平位置 (), 取鼠标垂直位置 ())
编辑框1内容 = 到文本 (颜色值)
看得出来你写的很乱,而且很复杂。你用CreateCompatibleBitmap创建的Bitmap,最后没使用DeleteObject释放,造成内存泄露。给你写了段程序,注释写得很清楚,应该没问题。能用结贴,最鄙视用了不结帖的。
procedure TForm1Button1Click(Sender: TObject);
var
rcScreen, rcShot: TRect; //屏幕位置, 截图位置
dcScreen, dcMem: HDC; //屏幕DC, 内存DC
bmpMem, bmpOld: HBITMAP; //新的彩色内存位图, 原始黑白内存位图
dcForm: HDC; //你用不到, 临时举例子用的
begin
rcScreenLeft := 0;
rcScreenTop := 0;
rcScreenRight := GetSystemMetrics(SM_CXSCREEN);
rcscreenBottom := GetSystemMetrics(SM_CYSCREEN);
dcScreen := GetDC(0); //取得屏幕DC
bmpMem := CreateCompatibleBitmap(dcScreen, rcScreenRight, rcScreenBottom); //创建与屏幕兼容的彩色内存位图
dcMem := CreateCompatibleDC(0); //创建内存DC
bmpOld := SelectObject(dcMem, bmpMem); //将彩色内存位图选入内存DC,同时保存原始的黑白内存位图
BitBlt(dcMem, 0, 0, rcScreenRight - rcScreenLeft, rcScreenBottom - rcScreenTop,
dcScreen, 0, 0, SRCCOPY); //将整个屏幕拷贝到内存位图
/////////////////////////////////////////////////////
//以下对比 *** 作的部分,你自己写吧,这里只是举个例子
rcShotLeft := 30;
rcShotTop := 30;
rcShotRight := 100;
rcShotBottom := 100;
dcForm := GetDC(Form1Handle);
BitBlt(dcForm, 0, 0, rcShotRight - rcShotLeft, rcShotBottom - rcShotTop,
dcMem, rcShotLeft, rcShotTop, SRCCOPY);
ReleaseDC(Form1Handle, dcForm);
/////////////////////////////////////////////////////
DeleteObject(SelectObject(dcMem, bmpOld)); //还原原始黑白内存位图,同时释放彩色内存位图
DeleteDC(dcMem); //释放内存DC
ReleaseDC(0, dcScreen); //释放屏幕DC
inherited;
end;
if (x1/y1>x2/y2)
{
xDest=0;
yDest=(y2-y1(x2/x1))/2;
DestWidth=x2;
DestHeight=y2-yDest;
}
else
{
xDest=(x2-x1(y2/y1))/2;
yDest=0;
DestWidth=x2-xDest;
DestHeight=y2;
}
}
你这里的计算有问题。
第一个情况,yDest+DestHeight = y2 = wRect的高度。也就是在最下方显示了,而不是高度居中。
if (x110/y1>x210/y2){
xDest=0;
DestWidth=x2;
DestHeight=y1x2/x1;
yDest=(y2-DestHeight)/2;
}
这样应该就对了,else自己写一下。
要显示出来,
首先就得在对话框添加一个用于显示的静态文本控件static
然后在响应鼠标移动的消息响应函数OnMouseMove中使用获取RGB颜色值的函数GetPixel ,
再分别用GetRValue,GetGValue,GetBValue三个函数获得红绿蓝三种颜色的值,最后将这三个值显示到静态文本控件上;注意,这些函数都是在鼠标移动的消息响应函数中完成;
HBITMAP holdbitmap,hbitmap;
HDC hdc,hscreendc,hmemdc;
hdc=GetWindowDC(hwnd);//获得整个hwnd指向的窗口的DC
GetWindowRect(hwnd,&rect);//获得窗口矩形
hscreendc=CreateDC("DISPLAY",NULL,NULL,NULL);//获得整个屏幕的设备DC
hmemdc=CreateCompatibleDC(hdc);//创建与设备DC兼容的内存DC
hbitmap=CreateCompatibleBitmap(hscreendc,GetDeviceCaps(hdcScreen,HORZRES),GetDeviceCaps(hdcScreen,VERTRES)); //创建与屏幕DC兼容的位图
holdbitmap=(HBITMAP)SelectObject(hmemdc,hbitmap);//将hbitmap指向的位图选入内存DC,返回值为原来的位图holdbitmap,先保存下来后面恢复
BitBlt(hmemdc,0,0,rectright-rectleft,rectbottom-recttop,hscreendc,0,0,SRCCOPY);//将设备DC的图象复制到内存DC,这样就把屏幕图象保存到hbitmap所指向的BITMAP结构体中了
点击按钮后,再用BitBlt显示出来:
case WM_COMMAND:
holdbitmap=(HBITMAP)SelectObject(hmemdc,hbitmap);//将保存图象的hbitmap选进内存DC
BitBlt(hdc,0,0,rectright-rectleft,rectbottom-recttop,hmemdc,0,0,SRCCOPY);//将内存DC的图象显示到窗口上
以上注意hbitmap变量的作用范围
以上就是关于怎么获取指定坐标的颜色值全部的内容,包括:怎么获取指定坐标的颜色值、delphi 语言拷贝DC到内存后释放的问题、MFC中关于StretchDIBits的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)