哪位用过 Directinput..?

mdejtod 2009-08-04 09:40:54
RT,我要捕获鼠标在图像上移动时的连续坐标点,用mouse事件无法精确,而且是不连续的,在用 directinput时,老是无法创建对象,不知道为什么
var pIDirect : IDirectInputA;
hr := DirectInputCreate(HInstance,DIRECTINPUT_VERSION,pIDirect,nil);
// CoCreateInstance(CLSID_DirectInput,nil,CLSCTX_INPROC_SERVER,IID_IDirectInput,pIDirect);
两个都试过了,pIDirect 一直为NIL
另外一个问题
在GDI中,用CreatePaletteBrush创建位图画刷时,怎么样才能画线条?而且可以指定宽度的,使用moveto lineto不起作用,但是又可以在上面输出文字,用beginpath,endpath,fillpath 等函数才可以
另外有哪位高人做过类似于美神软件的3D画笔的功能?
希望能够交流一下,快疯了....
...全文
249 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
husion01 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sonicx 的回复:]
一般在绘图阶段不可能有太快的鼠标操作吧,是不是可以考虑类似ps中的"多边形套索"模式
点于点之间画直线
[/Quote]
你直接画一条直线,这个过程是可以很快的,鼠标当然也捕捉不到连续的点的,捕捉不到的点应该用算法实现,只有这样了。。。
SonicX 2009-08-17
  • 打赏
  • 举报
回复
一般在绘图阶段不可能有太快的鼠标操作吧,是不是可以考虑类似ps中的"多边形套索"模式
点于点之间画直线
mdejtod 2009-08-11
  • 打赏
  • 举报
回复
谢谢。试试看
SonicX 2009-08-11
  • 打赏
  • 举报
回复
画线


var
h:HDC;
h2:HPEN;
bmp:windows.HBITMAP;
begin
h:=CreateCompatibleDC(GetDC(GetDesktopWindow));
bmp:=CreateCompatibleBitmap(h,200,200);
SelectObject(h,Bmp);
SetBkColor(h,$ffffff);
SetBkMode(h,TRANSPARENT);
h2:=CreatePen(PS_SOLID, 2, $ffffff);
SelectObject(h,h2);
MoveToEx(h,0,0,nil);
LineTo(h,100,200);
BitBlt(self.Canvas.Handle,0,0,200,200,h,0,0,SRCCOPY);

SonicX 2009-08-11
  • 打赏
  • 举报
回复
const
BUFFER_SIZE = 16;
SonicX 2009-08-11
  • 打赏
  • 举报
回复

//鼠标
function DirectInputMouse(lpDInput :IDirectInput8W; h_wnd :THandle; out lpDInputMouse :IDirectInputDevice8W) :HRESULT;
var
DIPropDWord:TDIPropDWord;
begin
Result:= E_FAIL;
if Failed(lpDInput.CreateDevice(GUID_SysMouse, lpDInputMouse, nil)) then exit;
if Failed(lpDInputMouse.SetCooperativeLevel(h_wnd, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND)) then exit;
DIPropDWord.diph.dwHeaderSize:= sizeof(TDIPropHeader);
DIPropDWord.diph.dwSize := sizeof(TDIPropDWord);
DIPropDWord.diph.dwHow := DIPH_DEVICE;
DIPropDWord.diph.dwObj := 0;
DIPropDWord.dwData := BUFFER_SIZE;
if Failed(lpDInputMouse.SetProperty(DIPROP_BUFFERSIZE, DIPropDWord.diph)) then exit;
if Failed(lpDInputMouse.SetDataFormat(c_dfDIMouse2)) then exit;
result:=S_Ok;
end;

var
DInput :IDirectInput8W;
DInputMouse :IDirectInputDevice8W;//鼠标输入
begin
DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8W, DInput, nil);
DirectInputMouse(DInput, DDrawMode.WinHandle, DInputMouse);

...
...

//处理鼠标
if not (DInputMouse=nil) then begin
if Failed(DInputMouse.GetDeviceState(Sizeof(TDIMouseState2),@MouseState)) then begin
DInputMouse.Acquire;
DInputMouse.GetDeviceState(Sizeof(TDIMouseState2),@MouseState);
end;
// MouseState.lX
// MouseState.lY
end;
end;
mdejtod 2009-08-11
  • 打赏
  • 举报
回复
汗,谢谢,不是手柄,是鼠标
SonicX 2009-08-11
  • 打赏
  • 举报
回复
手柄要先枚举啊


var
guidInstance: TGUID;
function DIEnumDevicesCallbackW(var lpddi: TDIDeviceInstanceW; pvRef: Pointer): BOOL; stdcall;
var
tmpDInput :IDirectInput8W;
tmpDInputJoy :IDirectInputDevice8W;
begin
result:=False;
if Failed(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8W, tmpDInput, nil)) then exit;
result:=Succeeded(tmpDInput.CreateDevice(lpddi.guidInstance, tmpDInputJoy, nil));
guidInstance:=lpddi.guidInstance;
tmpDInputJoy:=nil;
tmpDInput:=nil;
end;

function DirectInputJoy(lpDInput :IDirectInput8W; h_wnd :THandle; out lpDInputJoy :IDirectInputDevice8W) :HRESULT;
var
DIPropRange:TDIPropRange;
DIPropDWord:TDIPropDWord;
begin
Result:= E_FAIL;
if Failed(lpDInput.EnumDevices(DI8DEVTYPE_JOYSTICK,DIEnumDevicesCallbackW,nil,DIEDFL_ATTACHEDONLY)) then exit;
if Failed(lpDInput.CreateDevice(guidInstance, lpDInputJoy, nil)) then exit;
if Failed(lpDInputJoy.SetCooperativeLevel(h_wnd, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND)) then exit;
//手柄范围
DIPropRange.diph.dwSize := sizeof(TDIPropRange);
DIPropRange.diph.dwHeaderSize := sizeof(TDIPropHeader);
DIPropRange.diph.dwHow := DIPH_DEVICE;
DIPropRange.diph.dwObj := 0;
DIPropRange.lMax := 100;
DIPropRange.lMin := -100;
if Failed(lpDInputJoy.SetProperty(DIPROP_RANGE,DIPropRange.diph)) then exit;
//中心死区
DIPropDWord.diph.dwSize :=sizeof(TDIPropDWord);
DIPropDWord.diph.dwHeaderSize:=sizeof(TDIPropHeader);
DIPropDWord.diph.dwHow :=DIPH_DEVICE;
DIPropDWord.diph.dwObj :=0;
DIPropDWord.dwData :=1000;
if Failed(lpDInputJoy.SetProperty(DIPROP_RANGE,DIPropRange.diph)) then exit;
if Failed(lpDInputJoy.SetDataFormat(c_dfDIJoystick2)) then exit;
result:=S_OK;
end;

//使用
var
DInput :IDirectInput8W; //DirectInput对象
DInputJoy :IDirectInputDevice8W;//手柄输入
JoyState :TDIJoyState2;
begin
//建立DirectInput
if not (DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8W, DInput, nil)=DD_OK) then exit;
DirectInputJoy(DInput, MainHandle, DInputJoy);
//处理手柄事件
if not (DInputJoy=nil) then begin
if not (DInputJoy.GetDeviceState(sizeof(TDIJoyState2),@JoyState)=DD_OK) then
DInputJoy.Acquire;
//对应上下左右
// JoyState.lX
// JoyState.lX
// JoyState.lY
// JoyState.lY
end;
//释放
if not (DInputJoy=nil) then
try DInputJoy.Unacquire;
finally DInputJoy :=nil;
end;
DInput :=nil;
end;

mdejtod 2009-08-11
  • 打赏
  • 举报
回复
是的,我也想到了,不管是用HOOK还是用DIRECTINPUT都无法获取到连续的点,只有根据两点之间的距离进计算中间的点,采用计算的方法是可以不断点,不过太快时,还是会有很严重的锯齿,不是由图片产生的,而是计算出来的两点之间的距离偏差太大而导致的....
武稀松 2009-08-11
  • 打赏
  • 举报
回复
DirectInput也做不到获取鼠标连续不间断的坐标.DirectInput是用循环或者定时的方式轮询鼠标状态.
你的鼠标硬件的采样率是瓶颈.而且即便有那样的鼠标,你的轮询鼠标状态不可能那么快.
mdejtod 2009-08-10
  • 打赏
  • 举报
回复
再顶一次
mdejtod 2009-08-06
  • 打赏
  • 举报
回复
汗,好冷清.....
mdejtod 2009-08-06
  • 打赏
  • 举报
回复
顶起来...
mdejtod 2009-08-05
  • 打赏
  • 举报
回复
原来是少了这句
coinitalize(nil);
没人帮帮忙看看第二个问题么??
kampan 2009-08-05
  • 打赏
  • 举报
回复
图像处理这块本人的盲区啊,帮楼主顶顶。
mdejtod 2009-08-05
  • 打赏
  • 举报
回复
自己顶..
sparklerl 2009-08-05
  • 打赏
  • 举报
回复
不知道

纯up
mdejtod 2009-08-05
  • 打赏
  • 举报
回复
人都跑哪去了呢?
mdejtod 2009-08-04
  • 打赏
  • 举报
回复
两个都试过了哇,不行,平时在创建directshow对象的时候都可以的,郁闷...
gyk120 2009-08-04
  • 打赏
  • 举报
回复
DirectInputCreate如下定义:
  HRESULT WINAPI DirectInputCreate(
   HINSTANCE hinst,
   DWORD dwVersion,
   LPDIRECTINPUT * lplpDirectInput,
   LPUNKNOWN punkOuter
  );
   第一个参数是应用程序的实例。第二个参数是程序需要的DirectInput版本,通常使用DIRECTINPUT_VERSION宏,定义为当前版本。第三个参数最重要,如果对COM非常陌生的化就很难理解,它是指向IdirectInput接口的指针的地址。程序中应该定义一个LPDIRECTINPUT类型的变量(可以是全局的)并将其地址作为第三个参数传递给DirectInputCreate。
   最后一个参数叫作punkOuter,与COM技术中的聚合有关,可以用NULL安全的忽略。返回值是一个HRESULT,是COM的标准返回类型,可以将返回值与可能的返回值比较,也可以使用COM宏定义SUCCESS或FAILED来检查。
引用自http://www.wangchao.net.cn/bbsdetail_20249.html

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧