(关于消息)曾经我认为自己是一位高手,到现在我才追悔莫及,如果上天能给我一次机会,我会说三个字:“五十分”

futurefu 2000-12-06 02:13:00
加精
我现在在C++Builder下用TWAIN开发程序,因为要对TWAIN自定义的消息进行响应,因此想将自己的消息响应函数放在类似于WIN32 API中WNDPROC的消息主循环中,但苦于无从下手。因为对TWAIN进行操作时,对消息队列中的任何消息都要进行一次操作判断才能知道是不是TWAIN的消息,因此才需要在消息主循环中对每条消息操作一次。如果哪位高手、高手、高高手能够告诉我,使用BEGIN_MESSAGE_MAP具体映射哪条WINDOWS消息也能达到判断是否为TWAIN消息的效果,在下更是感激不禁。我只知道在VC下可以使用窗体类的PreTranslateMessage实现对发往消息主循环中的每条消息进行操作,但C++Builder下……?
...全文
320 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Searph 2000-12-07
  • 打赏
  • 举报
回复
faint...你不该说TWIAN的,害我...
void __fastcall TMainForm::WndProc( Messages::TMessage &Message )
{
switch( Message.Msg )
.....
}

不就完了么
futurefu 2000-12-07
  • 打赏
  • 举报
回复
如果是在VC中,这个问题非常简单,由于我是在C++BUILDER中,因为想使用VCL,因此想找到能将自己的代码放入窗体主循环的方法。
Searph 2000-12-07
  • 打赏
  • 举报
回复
详细的我记不住,我以前做的是TWAIN driver而不是AP,你跟踪TWAIN toolkit的代码应该非常清楚,你只要把对应代码拷出来都可以直接用。
futurefu 2000-12-07
  • 打赏
  • 举报
回复
Searph:
你好!
对DS Enable之后,必须在得到MSG_XFERREADY之后,才好取TW_IMAGEINFO。我现在的问题是无从响应MSG_XFERREADY消息。TWAIN SPEC对此的说明仅仅是要求在消息循环中对WIN消息用“DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT”参数执行一次才能得到MSG_XFERREADY消息,而在C++BUILDER中,我不知道该如何,在什么时候进行以上参数操作。
futurefu 2000-12-07
  • 打赏
  • 举报
回复
与兄一席话,胜读十年书。
I服了you!
大分五十,心悦奉上!
Searph 2000-12-07
  • 打赏
  • 举报
回复
default :
TForm::WndProc( Message ) ;
break ;
futurefu 2000-12-07
  • 打赏
  • 举报
回复
在WNDPROC中对消息进行响应之后,对于与TWAIN无关的消息,如何在将其发回主消息循环过去,否则这条消息将会消失。
Searph 2000-12-06
  • 打赏
  • 举报
回复
你做的是支持TWAIN的AP吧?ENABLEDS之后要做的是等待TWAIN DS给你TW_IMAGEINFO等消息,然后分配相应内存,然后再发MSG_GET消息给TWAIN DS,然后取得图片,具体每一步的做法记不住,你就按照TWAIN的7步来做,在DS动作时,DS取得图片你不要管,直到它给你发消息你再管,你应该看看TWAIN toolkit的source code,把message level改为full,你就知道他们之间传输什么消息了,不过这个TWAIN很简单,得到图片直接返回了,可以不必直接返回,直到DS想返回给AP再说。
futurefu 2000-12-06
  • 打赏
  • 举报
回复
首先我要万分感谢你(Searph)的耐心指导。我现在的问题在于我已经通过“DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS”参数打开了用户界面,并且在其中选择了一副图像(我在用TWAIN开发数码相机程序)。然后我打算执行“DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT”参数来取得TWAIN消息,再进行下面的操作。现在的问题是在这两组参数之间的操作如何联系起来。因为在我选择图像之后,肯定产生了一条WIN消息,只是不知道是什么消息,所以我原来的打算是在消息主循环中使用自己的消息响应函数执行第二组参数,但未成功。以下为消息响应函数的关键部分:
TW_EVENT TwEvent;
TwEvent.pEvent = (TW_MEMREF)&msg; //msg为WIN消息
TwEvent.TWMessage = MSG_NULL;

lpDSMProc(&AppId,&Source,DG_CONTROL,DAT_EVENT,MSG_PROCESSEVENT,(TW_MEMREF)&TwEvent);
请多多指教!
Searph 2000-12-06
  • 打赏
  • 举报
回复
sigh....你好像还不明白呀,TWAIN的消息并不是真正的消息,只是函数接口参数,对PC和MAC都是这样的。
futurefu 2000-12-06
  • 打赏
  • 举报
回复
当然不一样。SPEC是跨平台说明,并不对具体平台进行解释。
Searph 2000-12-06
  • 打赏
  • 举报
回复
我看你还是再看看TWAIN spec吧,你对TWAIN的理解完全错误,TWAIN的所谓自定义消息和windows消息根本不是一个概念。

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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