能力值:
( LV9,RANK:180 )
2 楼
什么意思 ?
能力值:
( LV2,RANK:10 )
3 楼
图片和成 DrawIcon 或 TransparentBlt
能力值:
( LV2,RANK:10 )
4 楼
懂了,但不会。。高手支招吧!!哈
能力值:
( LV2,RANK:10 )
5 楼
定位 nt4 source
能力值:
( LV9,RANK:250 )
6 楼
代码和执行程序都在附件里,看看是不是你要的效果:)
这个是vc9的工程。
vc6可能编译不了。
上传的附件:
能力值:
( LV9,RANK:250 )
7 楼
实现你这个功能的核心代码在raw_nput_processer.cpp里的: if ((WM_KEYUP == uMessage || WM_SYSKEYUP == uMessage) && (VK_CONTROL == curKeyCode))
{
HDC hdc = ::GetDC(NULL);
int nS = ::SaveDC(hdc);
HPEN hNewPen = ::CreatePen(PS_SOLID, 5, RGB(255, 255, 255));
HPEN hOldPen = (HPEN)::SelectObject(hdc, hNewPen);
::SetROP2(hdc, R2_XORPEN);
POINT cursorPt;
::GetCursorPos(&cursorPt);
for (int i = 5; i > 0; )
{
int l = i << 5;
::BeginPath(hdc);
::Ellipse(hdc, cursorPt.x - l, cursorPt.y - l, cursorPt.x + l, cursorPt.y + l);
::EndPath(hdc);
::StrokePath(hdc);
::Sleep(100);
::BeginPath(hdc);
::Ellipse(hdc, cursorPt.x - l, cursorPt.y - l, cursorPt.x + l, cursorPt.y + l);
l = --i << 5;
::EndPath(hdc);
::StrokePath(hdc);
}
::SelectObject(hdc, hOldPen);
::DeleteObject(hNewPen);
::RestoreDC(hdc, nS);
::ReleaseDC(NULL, hdc);
}
能力值:
( LV9,RANK:250 )
8 楼
::SetROP2(hdc, R2_XORPEN);
这里用R2_NOT效果会更好!
能力值:
( LV3,RANK:20 )
9 楼
谢谢, 效果很完美!!!
但好像不能自定义画笔颜色,如:SetROP2 如果用 R2_COPYPEN , 就不能擦除上次绘制的图形:
不过,好像想要“蓝色”的, 指定“黄色”,就可以得到“蓝色”了。
procedure TForm1.Button1Click(Sender: TObject);
var
ScreenDC : HDC;
PointA : TPoint;
nS, I, LeltP, BottomP, RightP, TopP : integer;
hNewPen, hOldPen : HPEN;
begin
ScreenDC:=GetDC(0);
nS:=SaveDC(ScreenDC);
hNewPen := CreatePen(PS_SOLID, //指定画笔样式,可以是下述常数之一
// PS_SOLID 画笔画出的是实线
// PS_DASH 画笔画出的是虚线(nWidth必须是1)
// PS_DOT 画笔画出的是点线(nWidth必须是1)
// PS_DASHDOT 画笔画出的是点划线(nWidth必须是1)
// PS_DASHDOTDOT 画笔画出的是点-点-划线(nWidth必须是1)
// PS_NULL 画笔不能画图
// PS_INSIDEFRAME 画笔在由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框中画图。如指定的准确RGB颜色不存在,就进行抖动处理
3, // 以逻辑单位表示的画笔的宽度
clYellow); // 画笔的RGB颜色 // clWhite // clGreen 蓝色
hOldPen := HPEN(SelectObject(ScreenDC, hNewPen)); // 该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
SetROP2(ScreenDC,
R2_XORPEN //R2_BLACK //所有绘制出来的像素为黑色
// R2_WHITE //所有绘制出来的像素为白色
// R2_NOP // Pixel remains unchanged. //任何绘制将不改变当前的状态
// R2_NOT //当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图,(自动擦除上次绘制的图形)
// R2_COPYPEN //使用当前的画笔的颜色
// R2_NOTCOPYPEN //当前画笔的反色 ); // 该函数的主要的作用是根据nDrawMode设置的方式重新设定绘图的方式
GetCursorPos(PointA);
for I := 8 downto 1 do
begin
LeltP:=PointA.X - I * 15;
TopP:=PointA.Y + I * 15;
RightP:=PointA.X + I * 15;
BottomP:=PointA.Y - I * 15;
BeginPath(ScreenDC);
Ellipse(ScreenDC, LeltP, TopP, RightP, BottomP);
EndPath(ScreenDC);
StrokePath(ScreenDC);
Sleep(100);
BeginPath(ScreenDC);
Ellipse(ScreenDC, LeltP, TopP, RightP, BottomP);
EndPath(ScreenDC);
StrokePath(ScreenDC);
end;
SelectObject(ScreenDC, hOldPen);
DeleteDC(ScreenDC);
DeleteObject(hNewPen);
RestoreDC(ScreenDC, nS);
ReleaseDC(0, ScreenDC);
end;
能力值:
( LV3,RANK:20 )
10 楼
编辑出错, 重发了......................
能力值:
( LV9,RANK:250 )
11 楼
这个是基于gdi的光栅布尔操作来的,这样才能在不需要重绘的情况下擦除先前绘制的颜色。
像ROP_NOT ROP_XOR这些布尔操作恰好可以再一定程度上保存背景信息,从而在第二次绘制的时候将背景恢复,且在视觉上能达到醒目的效果。
如果想指定颜色的话,只能依赖于重绘了这样的整个桌面会闪烁。
至于windows自带那个为什么一直是一种色彩,他可能就不是用的这种方法,应该是在鼠标显示的相关实现里做的。
能力值:
( LV3,RANK:20 )
12 楼
谢谢!!!!!!!!!
能力值:
( LV3,RANK:20 )
13 楼