// 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);
}
////在学习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);
}
解决方案 »
- 如何在局域网中,让客户机同步播放相同的视频(源文件都在各自的客户机上)
- 连接ADO数据库__ConnectionPtr连接之后怎么使用
- 一个不是问题的问题,不知道如何下手,
- 怎么解决这个错误啊:error LNK2001: unresolved external symbol "void __cdecl MoveStep(char (* const)[10],int,int,int)"
- PlaySound可以这样播放文件么PlaySound("http://127.0.0.1/welcome.wav", 0, SND_FILENAME | SND_ASYNC)
- 一个不明白的地方
- 请问|=和^=的区别是什么
- 使用InstallShield制作安装程序是怎样注册MSCOMM32.OCX这个控件?
- 100分求VC工程中内嵌使用 WebKet 引擎的方法
- 招斑竹
- 讨论QQ新斗地主记牌器的原理
- 请教:WINDOWS时钟控制面板中调整时间那部分界面是用什么控件实现的?
switch(uMsg)
{
case WM_LBUTTONDOWN:
break;
case WM_RBUTTONDOWN:
break;
}
(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);
}
{
case WM_RBUTTONDOWN:
{
。。
} case WM_LBUTTONDOWN:
{
。。
} case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} default: break; } return DefWindowProc(hMainwnd,message,wParam,lParam);}
switch(msg)
{
case WM_RBUTTONDOWN
}
但是它判断的是在主窗口中单击右键,如果在文本框中单击它根本判断不出来.还有关于HIWORD(wParam)的值都是256这个问题,在WINDOWS程序设计说:当我单击文本框时编辑控件给父窗口消息处理程序发送WM_COMMAND消息,对按钮控件来说,wParam和lParam变量的含义是相同的:LOWORD (wParam) 子窗口IDHIWORD (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,判断是否落在编辑框内,是则加入自己的处理代码,不是则调用默认的处理程序如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了。
但是如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了,这句话我不太懂,那位能帮忙说的详细一些。
你说的如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了。我不太懂,可否再详细些?还有文本框也有自已的回调函数吗?谢谢!
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);
}
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回车事件~~这个方法怎么不行~~其它按键都可以获得,单独回车截获不到~
问题:当单击按钮后,如果再一次单击则退出程序?这是为什么?
#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);
}