请教一个消息处理的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 sujing1982
  • 开始时间 开始时间
S

sujing1982

Unregistered / Unconfirmed
GUEST, unregistred user!
因为只用了windows单元
用api 建了个edit 但是 edit上按键的事件怎么写?
比如 我在edit中写了内容 然后回车 怎么响应这个回车的事件?? 是哪个消息?

另外该如果修改按纽的字体颜色 用api

老是问问题,分不多了。。
 
自己顶下, 帮帮忙哈 各位大侠
 
api 建了个edit?
怎么建的
 
function RegisterMainFrameClass(): Boolean;
begin
with WindowsClass do
begin
style := CS_HREDRAW or CS_VREDRAW; {ˮƽ½»´íºÍÊúÖ±½»´í}
lpfnWndProc := @FrameWinProc; {´°¿Úº¯ÊýFrameWinProc}
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := HInstance; {³ÌÐòʵÀý}
hIcon := LoadIcon(0, IDI_APPLICATION); {¼ÓÔصÄͼ±ê}
hCursor := LoadCursor(0, IDC_ARROW); {¼ÓÔؼýͷͼ±ê}
hbrBackground := COLOR_WINDOW; {´°Ìå±³¾°ÑÕÉ«ÉèÖÃ}
lpszMenuName := nil; {´°Ìå²Ëµ¥(ÎÞ)}
lpszClassName := ClassName; {ˈ̞}
end;
Result := RegisterClass(WindowsClass) <> 0; {×¢²á´°¿ÚÀà}
end;

function CreateWindow(): HWND;
begin
Result := 0;
if RegisterMainFrameClass() then
Result := CreateWindowEx(0, ClassName, MainWName, WS_POPUPWINDOW or WS_VISIBLE,
0, 0, 0, 0, 0, 0, HInstance, nil);
end;
function FrameWinProc(Handle: HWND; Messages, wParam, lParam: LongInt): LongInt; stdcall;
begin
Result := 0;
case Messages of
WM_COMMAND:
if (HIWORD(WParam) = BN_CLICKED) then
begin
Button_Hander(wParam);
end;

WM_CREATE:
begin
SetAutoRun;
end;

WM_SHOWWINDOW :
begin
EnableHook;
EnableTaskBar(False);
FontHandle := CreateBtnFont();
ButtonHandle := CreateButton(SYS_INTO, Handle, 430, 340, 100, 20, BUTTON_ID);
EditHandle := CreateEdit('', Handle, 430, 300, 100, 20, EDIT_ID);
end;

WM_CLOSE: begin
//
end;

else Result := DefWindowProc(Handle, Messages, wParam, lParam);
end;
end;
function CreateButton(ButtonText: PChar; ParentHandle: HWND; X, Y, Width, Height, ID: Integer): HWND;
begin
Result := CreateWindowEx(0, 'BUTTON', ButtonText, WS_CHILD or WS_VISIBLE or BS_FLAT,
X, Y, Width, Height, ParentHandle, ID, hInstance, nil);
end;
function CreateEdit(EditText: PChar; ParentHandle: HWND; X, Y, Width, Height, ID: Integer): HWND;
begin
Result := CreateWindowEx(0, 'EDIT', EditText, WS_CHILD or
WS_VISIBLE or WS_BORDER or ES_NOHIDESEL or ES_PASSWORD
or ES_LOWERCASE or ES_AUTOHSCROLL
X, Y, Width, Height, ParentHandle, ID, hInstance, nil);
end
 
while getmessage(amessage,edithandle,0,0) do
begin
if amessage.message=wm_mousedown do
postquitmessage(0)//if mouse is down ,then application quit
end;
//edithandle:the handle of the created edit
 
to th_lmy:
我知道wm_mousedown
我现在想响应 在edit中 /按回车/ 之后 的事件 ,不是点鼠标
是哪个消息?? 不会还要hook键盘吧? 因该有消息的吧?
 
创建edit时指定一个id,在窗口中捕捉wm_command消息
 
我指定了id 也知道捕获wm_command消息
但是怎么知道我按下了 回车?
 
需要再RegisterClass一个窗口类,button,edit类
function RegisterMainFrameClass(): Boolean;
begin
with WindowsClass do
begin
style := CS_HREDRAW or CS_VREDRAW; {ˮƽ½»´íºÍÊúÖ±½»´í}
lpfnWndProc := @EditMessage; {´°¿Úº¯ÊýFrameWinProc}
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := HInstance; {³ÌÐòʵÀý}
hIcon := LoadIcon(0, IDI_APPLICATION); {¼ÓÔصÄͼ±ê}
hCursor := LoadCursor(0, IDC_ARROW); {¼ÓÔؼýͷͼ±ê}
hbrBackground := COLOR_WINDOW; {´°Ìå±³¾°ÑÕÉ«ÉèÖÃ}
lpszMenuName := nil; {´°Ìå²Ëµ¥(ÎÞ)}
lpszClassName := EDIT; {ˈ̞}
end;
Result := RegisterClass(WindowsClass) <> 0; {×¢²á´°¿ÚÀà}
end;


function EditMessage(Handle: HWND; Messages, wParam, lParam: LongInt): LongInt; stdcall;
begin
...//再该消息函数里捕捉wm_keydown消息,
//if key = vk_enter then do...
end;
 
if key = vk_enter then do...
那 key 是从哪里来的????
回调的函数中哪个参数包含了 这个key?
 
BOOL PostMessage(

HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
postMessage(yourEditHandle,wm_keyDown,vk_Enter,0);
这写的好像不对.
有些我也忘了,你可以参考一下vc++建立窗口的例子,看它是怎么建立窗口和捕获消息的.
 
我知道sendmessage 或者postmessage 可以发送 按键消息.

窗体的回凋中
case Messages of
WM_COMMAND:
case LOWORD(WParam) of
BUTTON_ID:
if HIWORD(WParam) = BN_CLICKED then
ButtonClick; {自定义的按纽事件}

EDIT_ID :
if HIWORD(WParam) = WM_KEYDOWN then //这是WM_KEYDOWN 吗?
begin
// ???? 这怎么办?
end;
end
高手来解释下啊
 
可以用窗口子类别化来处理。
创建完edit之后用setwindowlong为edit设置一个子类别函数,在这个子类别函数中处理wm_keydown消息
 
前面说错了,你不用新建edit窗口;直接修改原来的窗口函数即可,
再function FrameWinProc函数里的case message of 加个 wm_keyDown;
然后在主程序里加上如下代码:
while getmessage(Message,yourCreateEditHandle,vk_Enter,0) do
//这Message是你function FrameWinProc里的参数
//也许是while getmessage(Message,yourCreateEditHandle,0,vk_Enter) do
begin
do
end;
 
to maze 该如何写? 没搞过啊 我菜鸟
to lisongmagic
住程序中已经有
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
你说的while getmessage(Message,yourCreateEditHandle,vk_Enter,0) do
加在哪??
 
var
hedit:thandle;
oldeditproc:longint;

function EditProc(hwnd: HWND; msg: Cardinal; wparam, lparam: Integer):Longint;stdcall;
begin
case msg of
wm_keydown:
begin
if wparam=13 then
showmessage('key');
end;
end;
result:=CallWindowProc(pointer(oldeditproc),hwnd,msg,wparam,lparam);
end;
......
hedit:=createwindow(...); //创建edit;
oldeditproc:=setwindowlong(edit1.Handle,GWL_WNDPROC, integer(@editproc));
 
3Q 分不多 没办法
 
后退
顶部