以下是工具栏的窗口过程和两个组合框的子类过程。
#define WM_TAB(WM_USER)
#define WM_ESC(WM_USER + 1)
#define WM_ENTER(WM_USER + 2)
HWND hwndMain;
HWND hwndEdit;
WNDPROC lpfnEditWndProc; /* original window procedure for */
/ *组合框编辑窗口* /
int cyToolbar; /* toolbar window height */
/********************************************************
功能:ToolbarWindowProc
目的:工具栏窗口的窗口过程
*********************************************************/
LRESULT CALLBACK ToolbarWindowProc(hwnd,msg,wParam,lParam)
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
static HWND hwndEdit1;
static HWND hwndEdit2;
static HWND hwndCombo1;
static HWND hwndCombo2;
.
.
.
POINT pt;
DWORD dwBaseUnits;
HWND hwndCombo;
DWORD dwIndex;
switch(msg){
case WM_CREATE:
/ *创建两个组合框子窗口。*/
dwBaseUnits = GetDialogBaseUnits();
hwndCombo1 = CreateWindow("COMBOBOX", "",
CBS_DROPDOWN | WS_CHILD | WS_VISIBLE,
(6 * LOWORD(dwBaseUnits))/ 4,
(2 * HIWORD(dwBaseUnits))/ 8,
(100 * LOWORD(dwBaseUnits))/ 4,
(50 * HIWORD(dwBaseUnits))/ 8,
hwnd, NULL, hinst, NULL);
hwndCombo2 = CreateWindow("COMBOBOX", "",
CBS_DROPDOWN | WS_CHILD | WS_VISIBLE,
(112 * LOWORD(dwBaseUnits))/ 4,
(2 * HIWORD(dwBaseUnits))/ 8,
(100 * LOWORD(dwBaseUnits))/ 4,
(50 * HIWORD(dwBaseUnits))/ 8,
hwnd, NULL, hinst, NULL);
/ *获取每个组合框的编辑窗口句柄。*/
pt.x = 1;
pt.y = 1;
hwndEdit1 = ChildWindowFromPoint(hwndCombo1, pt);
hwndEdit2 = ChildWindowFromPoint(hwndCombo2, pt);
/*
*更改两个编辑窗口的窗口过程
*到子类程序。
*/
lpfnEditWndProc = (WNDPROC) SetWindowLong(hwndEdit1,
GWL_WNDPROC, (DWORD) SubClassProc);
SetWindowLong函数(hwndEdit2,GWL_WNDPROC,cy
(DWORD) SubClassProc);
break;
case WM_SETFOCUS:
SetFocus(hwndCombo1);
break;
case WM_TAB:
if (GetFocus() == hwndEdit1)
SetFocus(hwndCombo2);
其他
SetFocus(hwndCombo1);
break;
case WM_ESC:
hwndCombo = GetFocus() == hwndEdit1 ?
hwndCombo1 : hwndCombo2;
/ *清除当前选择。*/
SendMessage(hwndCombo,CB_SETCURSEL,
(WPARAM) (-1), 0);
/ *将焦点设置到主窗口。*/
SetFocus(hwndMain);
break;
case WM_ENTER:
hwndCombo = GetFocus() == hwndEdit1 ?
hwndCombo1 : hwndCombo2;
SetFocus(hwndMain);
/ *如果没有当前选择,请设置一个。*/
if(SendMessage(hwndCombo,CB_GETCURSEL,0,0)
== CB_ERR) {
if(SendMessage(hwndCombo,WM_GETTEXT,
sizeof(achTemp), (LPARAM) achTemp) == 0)
break; /* empty selection field */
dwIndex = SendMessage(hwndCombo,
CB_FINDSTRINGEXACT, (WPARAM) (-1),
(LPARAM) achTemp);
/ *添加字符串,如有必要,并选择它。*/
if (dwIndex == CB_ERR)
dwIndex = SendMessage(hwndCombo, CB_ADDSTRING,
0, (LPARAM) achTemp);
if (dwIndex != CB_ERR)
SendMessage(hwndCombo,CB_SETCURSEL,
dwIndex, 0);
}
break;
.
./ *处理其他消息。*/
.
默认:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
/********************************************************
功能:SubClassProc
目的:处理TAB和ESCAPE键,并通过所有
其他消息到类窗口
程序。
*********************************************************/
LRESULT CALLBACK SubClassProc(hwnd,msg,wParam,lParam)
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
switch(msg){
case WM_KEYDOWN:
开关(wParam){
case VK_TAB:
SendMessage(hwndToolbar, WM_TAB, 0, 0);
return 0;
case VK_ESCAPE:
SendMessage(hwndToolbar, WM_ESC, 0, 0);
return 0;
case VK_RETURN:
SendMessage(hwndToolbar, WM_ENTER, 0, 0);
return 0;
}
break;
case WM_KEYUP:
case WM_CHAR:
开关(wParam){
case VK_TAB:
case VK_ESCAPE:
case VK_RETURN:
return 0;
}
}
/*
*默认调用原始窗口过程
*加工。
*/
返回给CallWindowProc(lpfnEditWndProc,HWND,sw
msg, wParam, lParam);
}