win32 ListBox 响应键盘事件问题

wwwxhb 2010-04-26 06:25:13
在窗口回调函数中的实现过程。
........................................
case WM_CREATE:
ShopList = CreateWindowEx(WS_EX_TOPMOST, "listbox", "", WS_CHILD|WS_VISIBLE|LBS_OWNERDRAWVARIABLE| LBS_NOTIFY |WS_VSCROLL ,25,55,150,100, hwnd,(HMENU)1000,GetModuleHandle(0),0);
break;
case WM_SHOWWINDOW:
.........................
SendMessage(ShopList,LB_ADDSTRING,0,(LPARAM)"1");
SendMessage(ShopList,LB_ADDSTRING,1,(LPARAM)(LPSTR)"2");
SendMessage(ShopList,LB_ADDSTRING,2,(LPARAM)(LPSTR)"3");
SendMessage(ShopList,LB_ADDSTRING,3,(LPARAM)(LPSTR)"4");
.........................
break;
case WM_SETFOCUS:
SendMessage(ShopList,LB_SETCURSEL,0,0);
SetFocus(ShopList);
return DefWindowProc(hwnd, message, wParam, lParam);
break;
case WM_COMMAND:
switch(HIWORD(wParam))
{
case LBN_DBLCLK:
{
//这里面可以响应
}
}
...........................................
现在鼠标双击事件可以响应,怎么响应键盘事件呢,比如空格键。谢谢
...全文
505 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
b6627651 2011-09-19
  • 打赏
  • 举报
回复
学习学习
NIL_ZJW 2010-08-26
  • 打赏
  • 举报
回复
楼主 加我QQ:564213659 想跟你交流LISTBOX
Eleven 2010-04-27
  • 打赏
  • 举报
回复
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInstance;

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nCmdShow)
{
TCHAR szAppName[] = TEXT ("Hello,World!!!");
HWND hWnd;
MSG msg;
WNDCLASS wndclass;

wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0 ;
}

hWnd = CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG1, 0, (DLGPROC)WndProc);

ShowWindow (hWnd, SW_SHOWNORMAL);

while(GetMessage (&msg, NULL, 0, 0))
{
if(msg.message == WM_KEYDOWN && 0x20 == msg.wParam)
{
MessageBox(hWnd, _T("Space Key is Down!!!"), _T("Message"), 0);
}
else if(!IsDialogMessage(hWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_COMMAND:
{
if (IDOK == LOWORD(wParam)|| IDCANCEL == LOWORD(wParam))
{
PostQuitMessage(0);
return TRUE;
}
}
break;
case WM_CLOSE:
EndDialog(hWnd, TRUE);
return TRUE;

case WM_PAINT:
BeginPaint(hWnd, &ps);
// ...
EndPaint(hWnd, &ps);
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
wwwxhb 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sullensun 的回复:]

case WM_KEYDOWN:
if(wParam == 0x57)
{
DestroyWindow(hwnd);
}
break;
[/Quote]
大哥你的意思是。。。
SullenSun 2010-04-27
  • 打赏
  • 举报
回复
case WM_KEYDOWN:
if(wParam == 0x57)
{
DestroyWindow(hwnd);
}
break;
wwwxhb 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yincheng01 的回复:]

OnChar(pMsg->wParam,1,1);
[/Quote]
win32!
还有就是
case WM_KEYDOWN:
if(wParam==32)
{
SendMessage(hParent,WM_COMMAND,MAKEWPARAM(0,LBN_DBLCLK),(LPARAM)hwnd);
}
breank;
怎么没用呢。
wwwxhb 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wencheng2998 的回复:]

函数PreTranslateMessage里面添加
PreTranslateMessage(MSG* pMsg)

if (pMsg-> message==WM_KEYDOWN)
{
switch (pMsg-> wParam)
{
case VK_F2:
……
[/Quote]

win32!
wwwxhb 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 schlafenhamster 的回复:]

WNDPROC LBoldProc;
LRESULT CALLBACK LBProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) //子类化listbox过程
{
int nItem;
TCHAR Text[256];
switch(Msg)
{
case WM_DESTROY:
break;
case WM……
[/Quote]
多谢。这些我都会了。就是问用我现有的代码怎么响应键盘事件呢,比如空格键。
wwwxhb 2010-04-27
  • 打赏
  • 举报
回复
虽然没得到俺想要的结果,不过还是谢谢大家,结贴。。。。
schlafenhamster 2010-04-26
  • 打赏
  • 举报
回复
WNDPROC LBoldProc;
LRESULT CALLBACK LBProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) //子类化listbox过程
{
int nItem;
TCHAR Text[256];
switch(Msg)
{
case WM_DESTROY:
break;
case WM_LBUTTONUP:
nItem=SendMessage(hWnd,LB_GETCURSEL,0,0);//
if(nItem != LB_ERR)
{
SendMessage(hWnd,LB_GETTEXT,nItem,(LPARAM)Text);
MessageBox(NULL,Text,"List Box",MB_OK);
}
break;
case WM_MOUSEMOVE:
break;
}
return CallWindowProc(LBoldProc, hWnd, Msg, wParam, lParam);
}
HWND CreateLB(HWND parentWnd)
{
HWND hListBox=0;
hListBox = CreateWindow("LISTBOX",
NULL,
WS_CHILD|WS_VSCROLL | WS_TABSTOP | LBS_STANDARD,
230, 20, 60, 80,
parentWnd, (HMENU)IDC_LISTBOX,
(HINSTANCE) GetWindowLong(parentWnd, GWL_HINSTANCE),
NULL);
ShowWindow(hListBox,SW_SHOW);
SendMessage(hListBox,LB_ADDSTRING ,0,(LPARAM)"你好");
SendMessage(hListBox,LB_ADDSTRING ,0,(LPARAM)"我好");
SendMessage(hListBox,LB_ADDSTRING ,0,(LPARAM)"他好");
//
return hListBox;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
m_hMain=hwnd;
//
m_hListBox = CreateLB(hwnd);
LBoldProc = (WNDPROC)SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)LBProc);
break;
尹成 2010-04-26
  • 打赏
  • 举报
回复
OnChar(pMsg->wParam,1,1);
wencheng2998 2010-04-26
  • 打赏
  • 举报
回复
函数PreTranslateMessage里面添加
PreTranslateMessage(MSG* pMsg)

if (pMsg->message==WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_F2:
/*
添加响应事件的代码
*/
}
}
假设是F2键盘
VC_ZSY 2010-04-26
  • 打赏
  • 举报
回复
换WM_KEYDOWN试一下
wwwxhb 2010-04-26
  • 打赏
  • 举报
回复
case WM_KEYUP:
if(wParam==32)
{
SendMessage(hParent,WM_COMMAND,MAKEWPARAM(0,LBN_DBLCLK),(LPARAM)hwnd);
}
breank;
怎么没用呢。
Eleven 2010-04-26
  • 打赏
  • 举报
回复
WM_KEYDOWN消息

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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