奇怪!为什么对同一个点调用两次GetPixel(HDC,int,int)得到的返回值不一样? 我的程序片断: rgb1=GetPixel(hdc,x,y); rgb2=GetPixel(hdc,x,y);在调试时,有时rgb1等于rgb2;有时两个值不相等,rgb2经常等于0xffffffff.Why????????? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 0xffffffff是CLR_INVALID的意思,表示你指定的坐标象素超过你hdc所指定的范围,其他的要把你程序贴出来才能分析了 应该不会超过hdc的范围,因为如果超过的话,rgb1和rgb2的值都该为0xffffffff,而实际情况经常是rgb1=0x0000000,rgb2=0xffffffff 注: (x,y)是一个白色的点。 rgb1=GetPixel(hdc,x,y);rgb2=GetPixel(hdc,x,y);这两句是写在一起的吗?看看是不是HDC不对啊,在语句前加个判断语句测一下,你的问题最好要把程序贴出来才好解决 对不起 (x,y)是一个黑色的点。以下是程序,主要目的是对一个封闭图形进行边界填充。(边界为黑色)算法对不对还不知道。void FillFast::DrawItem(HDC hdc,POINT pts){ StackList Stack; long x=pts.x,y=pts.y; POINT temp; COLORREF rgb=RGB(0,0,0),rgb1,rgb2; while (rgb3=GetPixel(hdc,x,y)) x--; rgb1=GetPixel(hdc,x,y); rgb2=GetPixel(hdc,x,y); temp.x=x+1;temp.y=y; Stack.Push(temp); while (!Stack.Empty()) { POINT p=Stack.Pop();x=p.x;y=p.y; BOOL FlagUp,FlagDown; COLORREF rgbUp=GetPixel(hdc,x,y-1); COLORREF rgbDown=GetPixel(hdc,x,y+1); if (rgbUp) { while (GetPixel(hdc,x,y-1)) x--; temp.x=x+1;temp.y=y-1;Stack.Push(temp); } if (rgbDown) { while (GetPixel(hdc,x,y+1)) x--; temp.x=x+1;temp.y=y+1;Stack.Push(temp); } FlagUp=!(BOOL)rgbUp; FlagDown=!(BOOL)rgbDown; while (GetPixel(hdc,x,y)) { SetPixel(hdc,x,y,rgb); if (!GetPixel(hdc,x,y-1)) FlagUp=TRUE; else { if (FlagUp) { temp.x=x;temp.y=y-1; Stack.Push(temp); FlagUp=FALSE; } } if (!GetPixel(hdc,x,y+1)) FlagDown=TRUE; else { if (FlagDown) { temp.x=x;temp.y=y+1; Stack.Push(temp); FlagDown=FALSE; } } x++; } }} 首先 while (rgb3=GetPixel(hdc,x,y))就有错误嘛!怎么就=了,这不变成赋值了吗?语句执行前先判断一下HDC是否有效,语句执行完了就马上判断一下,应该是没问题啊,你好象判断语句都没加上去嘛! 我是api的初学者,请问怎么判断hdc有没有效? 我是api的初学者,请问怎么判断hdc有没有效? 一般说来,从函数获得句柄如果不成功的话都是等于NULL的,你上面的那个函数里穿过来的HDC不知道是系统给你填上的还是你自己的程序里传过来的。如果是你自己程序传过来的,则在你获得这个句柄后判断一下其是否为NULL就可以了,还有要判断一下你的X,Y是否超界,HDC如果是窗口句柄,可以用GETWINDOWRECT获得其范围,然后判断X,Y值是否超界。 TO chinacyy(野人) : while (rgb3=GetPixel(hdc,x,y)) 这句话是对的,C 语言还有很多类似的语法,可以把人搞糊涂。TO wabcde (): rgb1=GetPixel(hdc,x,y); rgb2=GetPixel(hdc,x,y);这两句在单任务操作系统中执行的结果肯定一致,但是在Windows这样的多任务环境里却未必。问题在于第一句执行完后,执行第二句之前是否有其他的进程改变了屏幕。比如你在执行了第一句后,切换到DEV看值,这个过程就改变了屏幕颜色。看过值后又执行第二句,当然得到不同的颜色。 to upstairsdc的东西不会随便变的 同意楼上的楼上的看法,你用TRACE看,不要断点调试,断点调试的话极有可能出来这种问题 你用Sleep(0);睡一下吧. 我也遇见过这种问题, 可能是获取的时候没有时间执行动态库线程.Sleep一下就好了. :) rgb1=GetPixel(hdc,x,y);Sleep(0);rgb2=GetPixel(hdc,x,y); to winthegame(120斤重的大青蛙) 还是不行,加不加Sleep(0)都一样。 原来是要填充区域。用FloodFill不就行了么? 我也想用FloodFill,可老师不让我用 vs2008中怎样添加 form2.0 combox GPU CUDA编程 子窗口如何最小化到任务栏 想弄点COM ATL之类的,从哪里着手 , (*^__^*)...嘻嘻 VC中取进程路径问题? 这段代码为什么会这样??? 关于BSTR字符串的问题 使用MFC编写的Activex控件在设计视图中看不到,急,急,急,求高手? xml中的#符号是什么意思??? 如何实现两个进程的同步与互斥 已知一个窗口的句柄,如何取得该窗口的线程或进程的句柄 *** 用ON_MESSAGE()映射自定义的消息,为什么Release下运行会出错?? ***
注: (x,y)是一个白色的点。
rgb2=GetPixel(hdc,x,y);
这两句是写在一起的吗?看看是不是HDC不对啊,在语句前加个判断语句测一下,你的问题最好要把程序贴出来才好解决
以下是程序,主要目的是对一个封闭图形进行边界填充。(边界为黑色)
算法对不对还不知道。
void FillFast::DrawItem(HDC hdc,POINT pts)
{
StackList Stack;
long x=pts.x,y=pts.y;
POINT temp;
COLORREF rgb=RGB(0,0,0),rgb1,rgb2;
while (rgb3=GetPixel(hdc,x,y))
x--;
rgb1=GetPixel(hdc,x,y);
rgb2=GetPixel(hdc,x,y);
temp.x=x+1;temp.y=y;
Stack.Push(temp);
while (!Stack.Empty())
{
POINT p=Stack.Pop();x=p.x;y=p.y;
BOOL FlagUp,FlagDown;
COLORREF rgbUp=GetPixel(hdc,x,y-1);
COLORREF rgbDown=GetPixel(hdc,x,y+1);
if (rgbUp)
{
while (GetPixel(hdc,x,y-1))
x--;
temp.x=x+1;temp.y=y-1;Stack.Push(temp);
}
if (rgbDown)
{
while (GetPixel(hdc,x,y+1))
x--;
temp.x=x+1;temp.y=y+1;Stack.Push(temp);
}
FlagUp=!(BOOL)rgbUp;
FlagDown=!(BOOL)rgbDown;
while (GetPixel(hdc,x,y))
{
SetPixel(hdc,x,y,rgb);
if (!GetPixel(hdc,x,y-1))
FlagUp=TRUE;
else
{
if (FlagUp)
{
temp.x=x;temp.y=y-1;
Stack.Push(temp);
FlagUp=FALSE;
}
}
if (!GetPixel(hdc,x,y+1))
FlagDown=TRUE;
else
{
if (FlagDown)
{
temp.x=x;temp.y=y+1;
Stack.Push(temp);
FlagDown=FALSE;
}
}
x++;
}
}
}
TO wabcde ():
rgb1=GetPixel(hdc,x,y);
rgb2=GetPixel(hdc,x,y);
这两句在单任务操作系统中执行的结果肯定一致,
但是在Windows这样的多任务环境里却未必。
问题在于第一句执行完后,执行第二句之前是否有其他的进程改变了屏幕。
比如你在执行了第一句后,切换到DEV看值,这个过程就改变了屏幕颜色。
看过值后又执行第二句,当然得到不同的颜色。
Sleep(0);
rgb2=GetPixel(hdc,x,y);
还是不行,加不加Sleep(0)都一样。