创建组合框工具栏

【勇芳软件工作室】汉化HomePreviousNext

以下是工具栏的窗口过程和两个组合框的子类过程。

#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);

}