创建Square Meal对话框

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

以下是“方餐”对话框的对话框步骤和支持功能。

HWND hwndMain;

HWND hwndEdit;

char achTemp[256]; /* temporary buffer */

HBITMAP hbmBread;

HBITMAP hbmDairy;

HBITMAP hbmFruit;

HBITMAP hbmMeat;

HBITMAP hbmBreadMask;

HBITMAP hbmDairyMask;

HBITMAP hbmFruitMask;

HBITMAP hbmMeatMask;

/********************************************************

功能:FoodDlgProc

目的:食物对话框对话框。

*********************************************************/

BOOL CALLBACK FoodDlgProc(hwndDlg, msg, wParam, lParam)

HWND hwndDlg;

UINT msg;

WPARAM wParam;

LPARAM lParam;

{

LPMEASUREITEMSTRUCT lpmis;

LPDRAWITEMSTRUCT lpdis;

HBITMAP hbmIcon;

HBITMAP hbmMask;

COLORREF clrBackground;

COLORREF clrForeground;

TEXTMETRIC tm;

HDC hdc;

HWND hwnd;

int x;

int y;

switch(msg){

case WM_INITDIALOG:

/*

*调用应用程序定义的函数加载

*位图资源。

*/

if(!LoadIconBitmaps()){

EndDialog(hwndDlg, -1);

break;

}

/ *初始化下拉列表框。*/

if(!InitGroupList(hwndDlg)){

DeleteIconBitmaps();

EndDialog(hwndDlg, -1);

break;

}

/ *选择第一个食物组。*/

SendDlgItemMessage(hwndDlg,IDCOMBO,CB_SETCURSEL,

0, 0);

/ *列出食物并选择第一份食物。*/

InitFoodList(hwndDlg);

SendDlgItemMessage(hwndDlg,IDLIST,LB_SETCURSEL,

0, 0);

break;

case WM_MEASUREITEM:

lpmis = (LPMEASUREITEMSTRUCT) lParam;

if(lpmis- > itemHeight < CY_BITMAP + 2)

lpmis->itemHeight = CY_BITMAP + 2;

break;

case WM_DRAWITEM:

lpdis = (LPDRAWITEMSTRUCT) lParam;

if (lpdis->itemID == -1) /* empty item */

break;

/ *确定用于绘制图标的位图。*/

switch(lpdis- > itemData){

case ID_BREAD:

hbmIcon = hbmBread;

hbmMask = hbmBreadMask;

break;

case ID_DAIRY:

hbmIcon = hbmDairy;

hbmMask = hbmDairyMask;

break;

case ID_FRUIT:

hbmIcon = hbmFruit;

hbmMask = hbmFruitMask;

break;

默认值:/ *肉* /

hbmIcon = hbmMeat;

hbmMask = hbmMeatMask;

break;

}

/*

*颜色取决于物品是否

*选择。

*/

clrForeground = SetTextColor(lpdis->hDC,

GetSysColor(lpdis- > itemState & ODS_SELECTED?

COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));

clrBackground = SetBkColor(lpdis->hDC,

GetSysColor(lpdis- > itemState & ODS_SELECTED?

COLOR_HIGHLIGHT : COLOR_WINDOW));

/ *计算垂直和水平位置。*/

GetTextMetrics(lpdis->hDC, &tm);

y = (lpdis->rcItem.bottom + lpdis->rcItem.top -

tm.tmHeight) / 2;

x = LOWORD(GetDialogBaseUnits()) / 4;

/ *获取并显示列表项的文本。*/

SendMessage(lpdis- > hwndItem,CB_GETLBTEXT,

lpdis->itemID, (LPARAM) (LPCSTR) achTemp);

ExtTextOut(lpdis- > hDC,CX_BITMAP + 2 * x,y,

ETO_CLIPPED | ETO_OPAQUE,{lpdis-}

achTemp, lstrlen(achTemp), NULL);

/ *恢复以前的颜色。*/

SetTextColor(lpdis->hDC, clrForeground);

SetBkColor(lpdis->hDC, clrBackground);

/ *显示图标。*/

hdc = CreateCompatibleDC(lpdis->hDC);

if (hdc == NULL)

break;

SelectObject(hdc, hbmMask);

BitBlt(lpdis- > hDC,x,lpdis- > rcItem.top + 1,

CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCAND);

SelectObject(hdc, hbmIcon);

BitBlt(lpdis- > hDC,x,lpdis- > rcItem.top + 1,

CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCPAINT);

DeleteDC(hdc);

/ *如果项目具有焦点,请绘制焦点矩形。*/

if(lpdis- > itemState & ODS_FOCUS)

DrawFocusRect(lpdis- > hDC,& lpdis- > rcItem);

break;

case WM_COMMAND:

开关(LOWORD(wParam)){

case IDCOMBO:

if (HIWORD(wParam) == CBN_SELENDOK) {

InitFoodList(hwndDlg);

SendDlgItemMessage(hwndDlg,IDLIST,

LB_SETCURSEL, 0, 0);

}

break;

case IDLIST:

if (HIWORD(wParam) != LBN_DBLCLK)

break;

/ *要双击,请处理OK案例。*/

case IDOK:

/ *获取所选列表项的文本。*/

hwnd = GetDlgItem(hwndDlg, IDLIST);

SendMessage(hwnd,LB_GETTEXT,

SendMessage(hwnd,LB_GETCURSEL,0,0),

(LPARAM) achTemp);

/ *将文本插入编辑窗口。*/

SendMessage(hwndEdit,EM_REPLACESEL,0,

(LPARAM) achTemp);

EndDialog(hwndDlg, 0);

break;

case IDCANCEL:

hwnd = GetDlgItem(hwndDlg, IDCOMBO);

if(SendMessage(hwnd,CB_GETDROPPEDSTATE,

0, 0))

SendMessage(hwnd,CB_SHOWDROPDOWN,

FALSE, 0);

其他

EndDialog(hwndDlg, 0);

}

break;

case WM_DESTROY:

/*

*调用应用程序定义的函数释放

*位图资源。

*/

DeleteIconBitmaps();

break;

默认:

return FALSE;

}

return TRUE;

}

/********************************************************

功能:InitGroupList

目的:初始化“食物组”下拉菜单

列表框。

评论:与食品组相关的ID

每个列表项目被保存为项目数据。

*********************************************************/

BOOL PASCAL InitGroupList(HWND hwndDlg)

{

HWND hwndCombo = GetDlgItem(hwndDlg, IDCOMBO);

DWORD dwIndex;

/ *为每个食物组添加一个项目。*/

LoadString(hinst, ID_BREAD, achTemp, sizeof(achTemp));

dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,

(LPARAM) (LPCSTR) achTemp);

SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_BREAD);

LoadString(hinst, ID_DAIRY, achTemp, sizeof(achTemp));

dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,

(LPARAM) (LPCSTR) achTemp);

SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_DAIRY);

LoadString(hinst, ID_FRUIT, achTemp, sizeof(achTemp));

dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,

(LPARAM) (LPCSTR) achTemp);

SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_FRUIT);

LoadString(hinst, ID_MEAT, achTemp, sizeof(achTemp));

dwIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0,

(LPARAM) (LPCSTR) achTemp);

SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, ID_MEAT);

return TRUE;

}

/********************************************************

功能:InitFoodList

目的:清除食物清单的内容

添加当前食物的名称

食品组。

*********************************************************/

void PASCAL InitFoodList(HWND hwndDlg)

{

HWND hwndCombo = GetDlgItem(hwndDlg, IDCOMBO);

HWND hwndList = GetDlgItem(hwndDlg, IDLIST);

UINT idFoodGroup;

LPSTR lpsz;

LPSTR lpszEnd;

/ *确定目前的食物组。*/

idFoodGroup = SendMessage(

hwndCombo,

CB_GETITEMDATA,

SendMessage(hwndCombo,CB_GETCURSEL,0,0),

0

);

/ *清除列表内容。*/

SendMessage(hwndList, LB_RESETCONTENT, 0, 0);

.

./ *为当前食物组添加食物名称。*/

.

}