在SDK编程中,怎样判断出在文本框中单击的是右键?

dongyi940333 2005-11-10 06:59:00
// KillMessage.cpp : Defines the entry point for the application.
//

//在学习SDK编程,此程序作用是使截获的消息作废,具体的是创建了一个对话框,在
//上面画了一个文本框和一个命令按钮,单击命令按钮后,如果在文本框中单击MOUSE右键则不
//再弹出菜单.也就是屏蔽了右键消息。这个程序没有写玩。


#include "stdafx.h"
#include<windows.h>
#include<windef.h>
#include"resource.h"

BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox( hInstance, LPCTSTR("Dialog"), NULL, DLGPROC(DialogProc) );
return 0;
}

BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case ButtonOk:
return (TRUE);

case IDCANCEL:
EndDialog( hwndDlg, TRUE );
return( TRUE );

//判断出了是文本框.
//问题是:怎样判断出在文本框中单击的是右键?MSDN上说用HIWORD(wParam)来判断消息编号,可是我在单步调式时发现不管是单击左键还是单击右键HIWORD(wParam)的值都是256,这是为什么?
//这个对话框我选择的是Edit Box这个控件,然后画在对话框上的.
是不是不应该选择这个控件。
case IDC_EDIT:
WORD h;
h = HIWORD(wParam);//h的值都是256
break;
}
break;
}
}
return (FALSE);
}
...全文
224 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hasgone 2005-11-20
  • 打赏
  • 举报
回复
WM_RBUTTONDOWN
dongyi940333 2005-11-19
  • 打赏
  • 举报
回复
程序已完成,有一个新问题,请各位帮忙看一下,谢谢!
问题:当单击按钮后,如果再一次单击则退出程序?这是为什么?


#include "stdafx.h"
#include<windows.h>
#include<windef.h>
#include<winuser.h>
#include"resource.h"

BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
BOOL CALLBACK NewWndproc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );

//文本框原窗口过程地址
long prevWndProc = 0;
//文本框的句柄
HWND hwndEdit = 0;

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox( hInstance, LPCTSTR("Dialog"), NULL, DLGPROC(DialogProc) );
return 0;
}

BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{

switch( uMsg )
{
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case ButtonOk:
//得到文本框的句柄
hwndEdit = GetDlgItem( hwndDlg, IDC_EDIT);

//得到文本框原窗口过程的地址
prevWndProc = GetWindowLong( hwndEdit, GWL_WNDPROC );

//改变窗口过程
SetWindowLong( hwndEdit, GWL_WNDPROC, (LONG)NewWndproc );

return( TRUE );

这里多画了一个按钮,用于恢复文本框的状态
case ButtonComeBack:
//恢复窗口过程
SetWindowLong( hwndEdit, GWL_WNDPROC, prevWndProc );
return( TRUE );

case IDCANCEL:
SetWindowLong( hwndEdit, GWL_WNDPROC, prevWndProc );
EndDialog( hwndDlg, TRUE );
return( TRUE );
}
break;
}
}
return (FALSE);
}


BOOL CALLBACK NewWndproc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch ( uMsg )
{
case WM_RBUTTONDOWN:
//产生左键单击的消息,从而屏蔽右键的单击
uMsg = WM_LBUTTONDOWN;
SendMessage( hwndDlg, uMsg, wParam, lParam );
return (TRUE);

default:
CallWindowProc( (WNDPROC)prevWndProc, hwndDlg, uMsg, wParam, lParam );
return ( TRUE );
}
return (FALSE);
}
VxD1 2005-11-13
  • 打赏
  • 举报
回复
用SetClassLong进行窗口子类化
菜牛 2005-11-13
  • 打赏
  • 举报
回复
回车的话,Edit控件要设置ES_WANTRETURN(大概)样式。
_____non______ 2005-11-13
  • 打赏
  • 举报
回复
你需要为Edit控件指定一个窗口过程
lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
(DWORD)(FARPROC)MyEditProc);
lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
(DWORD)(FARPROC)MyEditProc);
然后
BOOL CALLBACK MyEditProc( HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_RBUTTONDOWN:
....
return lpfnOldEditProc(hwndEdit, uMsg, wParam, lParam);
}

/////////////////////////////

我想要获得EDIT回车事件~~

这个方法怎么不行~~

其它按键都可以获得,单独回车截获不到~
goodboyws 2005-11-12
  • 打赏
  • 举报
回复
这实际上就是用SDK SubClass控件
goodboyws 2005-11-12
  • 打赏
  • 举报
回复
你需要为Edit控件指定一个窗口过程
lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
(DWORD)(FARPROC)MyEditProc);
lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
(DWORD)(FARPROC)MyEditProc);
然后
BOOL CALLBACK MyEditProc( HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_RBUTTONDOWN:
....
return lpfnOldEditProc(hwndEdit, uMsg, wParam, lParam);
}

dongyi940333 2005-11-12
  • 打赏
  • 举报
回复
一开始我也是直接在回调函数中判断:
switch(msg)
{
case WM_RBUTTONDOWN
}
但是它判断的是在主窗口中单击右键,如果在文本框中单击它根本判断不出来.还有关于HIWORD(wParam)的值都是256这个问题,在WINDOWS程序设计说:当我单击文本框时编辑控件给父窗口消息处理程序发送WM_COMMAND消息,对按钮控件来说,wParam和lParam变量的含义是相同的:

LOWORD (wParam) 子窗口ID

HIWORD (wParam)通知码

lParam 子窗口句柄


通知码如下所示:

EN_SETFOCUS 编辑控件已经获得输入焦点


EN_KILLFOCUS 编辑控件已经失去输入焦点

EN_CHANGE 编辑控件的内容将改变

EN_UPDATE 编辑控件的内容已经改变

EN_ERRSPACE 编辑控件执行已经超出中间

EN_MAXTEXT 编辑控件在插入时执行超出空间

EN_HSCROLL 编辑控件的水平滚动条已经被按下

EN_VSCROLL 编辑控件的垂直滚动条已经被按下
我在头文件中找到了EN_SETFOCUS的值,它的值就是256 ,不知道这个问题是不是这回。
有人告诉我:
如果你要在主窗口里捕捉,一般的方法是直接捕获 WM_LBUTTONUP然后通过传递进来的鼠标 xPos, yPos,判断是否落在编辑框内,是则加入自己的处理代码,不是则调用默认的处理程序

如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了。
但是如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了,这句话我不太懂,那位能帮忙说的详细一些。


















你说的如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了。我不太懂,可否再详细些?还有文本框也有自已的回调函数吗?谢谢!
lixiaosan 2005-11-11
  • 打赏
  • 举报
回复
google

windows程序设计
lixiaosan 2005-11-11
  • 打赏
  • 举报
回复
《windows程序设计》

  switch(message)
  {
    case WM_RBUTTONDOWN:
    {
。。。。。。。。
    }

    case WM_LBUTTONDOWN:
    {
。。。。。。。。。。。
    }

    case WM_DESTROY:
    {
      PostQuitMessage(0);
      return 0;
    }

    default: break;

  }

  return DefWindowProc(hMainwnd,message,wParam,lParam);

}
goodboyws 2005-11-11
  • 打赏
  • 举报
回复
lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
(DWORD)(FARPROC)MyEditProc);
BOOL CALLBACK MyEditProc( HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_RBUTTONDOWN:
....
return lpfnOldEditProc(hwndEdit, uMsg, wParam, lParam);
}
lizmei001 2005-11-11
  • 打赏
  • 举报
回复
应该直接判定:
switch(uMsg)
{
case WM_LBUTTONDOWN:
break;
case WM_RBUTTONDOWN:
break;
}
dongyi940333 2005-11-10
  • 打赏
  • 举报
回复
谢谢你,请问你说的WINDOWS程序设计是一本书吗,要是书的话那里有下载的,谢谢!
K 2005-11-10
  • 打赏
  • 举报
回复
请看windows程序设计里面有详细解释
C 和 C++ 语言都是世界上最流行且使用最普遍的编程语言, 因此 Eclipse 平台(Eclipse Platform)提供对 C/C++ 开发的支持一点都不足为奇。 因为 Eclipse 平台只是用于开发者工具的一个框架,它不直接支持 C/C++;它使用外部插件来提供支持。 本文将向您演示如何使用 CDT — 用于 C/C++ 开发的一组插件。CDT 项目(有关链接, 请参阅本文后面的 参考资料一节)致力于为 Eclipse 平台提供功能完全的 C/C++ 集成开发环境(Integrated Development Environment,IDE)。 虽然该项目的重点是 Linux,但它在可使用 GNU 开发者工具的所有环境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平台)都能工作。 CDT 是完全用 Java 实现的开放源码项目(根据 Common Public License 特许的),它作为 Eclipse SDK 平台的一组插件。这些插件将 C/C++ 透视图添加到 Eclipse 工作台(Workbench), 现在后者可以用许多视图和向导以及高级编辑和调试支持来支持 C/C++ 开发。 由于其复杂性,CDT 被分成几个组件,它们都采用独立插件的形式。 每个组件都作为一个独立自主的项目进行运作,有它自己的一组提交者、错误类别和邮件列表。 但是,所有插件都是 CDT 正常工作所必需的。 下面是 CDT 插件/组件的完整列表: 主 CDT 插件(Primary CDT plug-in)是“框架”CDT 插件。 CDT 功能 Eclipse(CDT Feature Eclipse)是 CDT 功能组件(Feature Component)。 CDT 核心(CDT Core)提供了核心模型(Core Model)、CDOM 和核心组件(Core Component)。 CDT UI是核心 UI、视图、编辑器和向导。 CDT 启动(CDT Launch)为诸如编译器和调试器之类的外部工具提供了启动机制。 CDT 调试核心(CDT Debug Core)提供了调试功能。 CDT 调试 UI(CDT Debug UI)为 CDT 调试编辑器、视图和向导提供了用户界面。 CDT 调试 MI(CDT Debug MI)是用于与 MI 兼容的调试器的应用程序连接器。 现在,让我们研究一下如何在实际应用程序使用这些组件。图 1 显示了 Eclipse 的 C/C++ 项目: 图 1. 在带有 CDT 插件的 Eclipse 编辑 C/C++ 项目 安装和运行 CDT 在下载和安装 CDT 之前,首先必需确保 GNU C 编译器(GNU C compiler,GCC)以及所有附带的工具(make、binutil 和 GDB)都是可用的。 如果正在运行 Linux,只要通过使用适用于您分发版的软件包管理器来安装开发软件包。 在 Windows平台上,将需要安装 Cygwin 工具箱(请参阅 参考资料以获得链接)。Cygwin 是用于 Windows 的类 UNIX 环境,它包括 GCC 移植以及所有必需的开发工具,包括 automake 和 GNU 调试器(GNU Debugger,GDB)。Cygwin 是在 cygwin1.dll 库基础上构建的。Cygwin 的备用解决方案是 Minimalist GNU for Windows(MinGW)(请参阅 参考资料以获得链接)。 该工具是一组可免费获取、自由分发的特定于 Windows 的头文件和导入库,这些头文件和导入库与 GNU 工具集(它们允许您生成不依赖于任何第三方 DLL 的本机 Windows 程序)结合在一起。 如果您想要创建与 POSIX 兼容的 Windows 应用程序,那么 MinGW 是最佳选择。MinGW 甚至可以在 Cygwin 安装之上工作。 Solaris和 QNX要求您从因特网下载并安装其特定的 GCC、GNU Make binutils 和 GDB 移植(请参阅 参考资料以获得链接)。 假设您安装了适当的 Java SDK/JRE 和 Eclipse 平台 SDK,并且它们都正常运行。CDT 以两种“方式”可用:稳定的发行版和试运行版(nightly build)。 试运行版未经完全测试,但它们提供了更多的功能并改正了当前错误。 安装之前,请检查磁盘上是否存在先前版本的 CDT,如果存在,请确保完全除去它。 因为 CDT 没有可用的卸载程序,所以需要手工除去它。 为了检查先前版本是否存在,转至 CDT 插件所驻留的目录: eclipse/plugins 。 接着,除

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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