我用createwindowex()创建了10个edit,怎么设置他们的TAB属性?就是按“tab”键时转换Focus。在wm_command中吗?有没有程序?谢谢!
解决方案 »
- errorC2664的问题,困扰我一天了,请指教。
- 这是测试应该关注的问题?
- 用ReadFile读串口丢数据,怎么办?代码如下。
- *** C2039: 'CoInitializeEx' : is not a member of '`global namespace'' ****
- winsocket 的io 重叠模型
- GDI+ ,gdiplus是什么东西,能做什么事情,,谁来介绍下,我看很多游戏里都有
- 跳槽失败---被公司留住了,散分!!!
- 怎么把一个int 的数组转换成CString??
- 如何在VC中编辑Help风格的icon图片,最好能拷贝到,我可不想自己编辑!
- 太好了我的第一个vc终于程序编完了,下面准备编个网络通信的程序,向大家求经。
- 还是老问题,文件的路径!!比如我想一次对C:\下所有的文件进行查询,可是我怎么能得到每一个文件夹的路径啊。用SDK不用MFC!!!
- ====毕业设计急救====听说CSDN高手如云。请大家帮忙。。有关TTS的
peakMessage(&msg,childhwnd,WM_KEYFIRL,WM_KEYLAST,PM_REMOVE);
int key=(int)msg.wParam;
if(key==VK_TAB){
....
...
}可以用这个peekMessage()吗?在哪里用?我怎么用着不行,望高手+低手赐教。
试试这个:
首先,在创建EDIT时,用SetProp给每个EDIT窗口附加一段数据,比如编号什么的,
然后在if(key==VK_TAB){}中按顺序给他们SetFocus,最后别忘了RemoveProp。
能否详细一点?我的edit是这样创建的:
HWND hwndedit[20];
for(int o=0;i<20li++){
hwndedit[i]=CreateWindow("edit","this is an edit control",...(HMENU)i....);
}
SetFocus(hwndedit[0]);可以在WM_COMMAND消息中取得按键信息吗?当然他们的ID是可以得到的。我用peekMessage()
得不到按键消息。而WM_KEYDOWN消息只是焦点在窗口上时按键才触发。在edit中按键并不触发
wm_keydown消息。大虾们,帮帮这个菜鸟吧感激涕淋
{
hwndedit[i] = CreateWindowEx(....);
SetWindowLong (hwndedit[i], GWL_USERDATA, (LONG)i);
cbWndProc[i] = SetWindowLong (hwndedit[i], GWL_WNDPROC, EditSubClassProc);
}SetFocus(hwndedit[0]);
/* ... */
LRESULT CALLBACK EditSubClassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
LONG index;
index = GetWindowLong (hWnd, GWL_USERDATA);
if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
{
SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA);
}
lResult = CallWindowProc (cbWndProc[index], hwndedit[index], uMsg, wParam, lParam);
return lResult;
}
if (wParam == TABMSG)
{
/* now the lParam is the editbox index,
call SetFocus() ....
*/
}
break;You should define TABMSG yourself.
非常感谢,我测试可以的话,马上给分。
我改了一些地方,如(
typedef int (__stdcall *function)(void);//(void *,USHORT,USHORT,long);
function cbWndProc[16];
}等,然后调试通过,可是按TAB键时,产生的空格怎么办?怎么去除上一个edit中产生的空格?也就是说不让windows处理该消息?
请大虾教我谢谢!
我上面写的只有实现的思想,具体的细节是有可能不太对的。
如是不要空格,将上述过程作如下修改: {
SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA);
}
else
lResult = CallWindowProc (cbWndProc[index], hwndedit[index], uMsg, wParam, lParam);
{
LRESULT lResult = 0;
LONG index;
index = GetWindowLong (hWnd, GWL_USERDATA);
if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
{
SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA);
}
else if (!(uMsg == WM_KEYUP && wParam == VK_TAB))
lResult = CallWindowProc (cbWndProc[index], hwndedit[index], uMsg, wParam, lParam);
return lResult;
}
#define EDITBOX_COUNT 10HWND hwnd[EDITBOX_COUNT];
WNDPROC cbWndProc[EDITBOX_COUNT];LRESULT CALLBACK EditSubClassProc (HWND, UINT, WPARAM, LPARAM);//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
POINT pnt;
HMENU hMenu;
BOOL bGotHelp; switch (message) { case WM_CREATE:
{
int i ;
for (i = 0; i < EDITBOX_COUNT; i ++)
{
hwnd[i] = CreateWindowEx (WS_EX_CONTROLPARENT,
"EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER,
100, i * 20,
100, 15,
hWnd, NULL, NULL, NULL);
SetWindowLong (hwnd[i], GWL_USERDATA, (LONG) i);
cbWndProc[i] = (WNDPROC)SetWindowLong (hwnd[i], GWL_WNDPROC, (LONG) EditSubClassProc);
}
break;
} case WM_COMMAND:
wmId = LOWORD(wParam); // Remember, these are...
wmEvent = HIWORD(wParam); // ...different for Win32! //Parse the menu selections:
switch (wmId) {
case TABMSG:
SetFocus (hwnd[(lParam + 1) % 10]);
break; ..... default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
break; default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
LRESULT CALLBACK EditSubClassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
LONG index; index = GetWindowLong (hWnd, GWL_USERDATA);
if (uMsg == WM_KEYDOWN && wParam == VK_TAB)
{
SendMessage (GetParent(hWnd), WM_COMMAND, TABMSG, GetWindowLong(hWnd, GWL_USERDATA));
}
else if (!(uMsg == WM_KEYUP && wParam == VK_TAB))
lResult = CallWindowProc (cbWndProc[index], hwnd[index], uMsg, wParam, lParam);
return lResult;
}